Open KTurnura opened 11 months ago
最开始我们介绍Frangipani所要解决的问题
上述主要针对Client端,而Petal内部有一套独立的恢复系统,类似于链式复制的内容
在frangipani系统中,除了保存frangipani的服务器(Workstation)之外,还有Petal服务器,还有一个lock服务器,总共这三种
lock 服务器保存锁表,为每个文件分配一个锁
frangipani 工作站上也会保存一个锁表,上面记录了对应文件名,对应的锁session状态,即用到了哪种锁,还有锁的内容
实现Cache一致性的主要方式:锁。只要没有人或者工作站查看这个文件,那么我们就可以对文件进行修改,在锁支持的目录下创建或删除文件,或者做一些其他操作
从最开始,先写入本地内存,然后经过一段时间后再写入Petal共享磁盘(可能每半分钟执行一次),这个过程不需要通过向服务器发送RPC请求
要求文件系统的业务逻辑必须存在于每个工作站(WorkStation,后续简称WS)中,以便我的WS能够实现诸如创建仅在其本地缓存之外运行的文件之类的操作
文件系统所有的复杂性都放在了每个Client端的frangipani中,这是一种去中心化的方案,优点:当添加新机器时,你会自动地获得更多的CPU处理能力,以此来执行这些新用户对文件系统的操作
lock 服务器保存锁表,为每个文件分配一个锁
frangipani 工作站上也会保存一个锁表,上面记录了对应文件名,对应的锁session状态,即用到了哪种锁,还有锁的内容
workstation的锁表内容
FILE(Frangipani使用unix风格的i-number对文件进行关联) | Lock | CONTENT |
---|---|---|
x | busy | ~~~ |
y | IDLE | ~~~ |
Lock Server内容
FILE | OWNER |
---|---|
x | Work Station 1 |
y | Work Station 1 |
RULE
除非工作站持有该数据所对应的锁, 我们才允许他对数据进行缓存
缓存流程
释放锁的过程
其他服务器请求锁的过程 LS为Lock Server
如果Revoke消息收到后,锁目录中的lock信息是IDLE的话,并且该服务器中缓存的数据是脏数据的话,会首先将数据写回petal, 该workstation就会释放该锁,
为了防止数据丢失,会每30s让这些工作站将他们缓存中修改过的数据写回petal
WS在使用完锁后并不立即返还给锁服务器,而是一直保持,直到锁服务器发送Revoke消息,才会执行释放锁的操作 如果我在我的工作站上创建了一个文件Y,我会将Y应用于其他领域,所以对于工作站来说,将最近锁使用过的文件上的锁积累起来再还给lock服务器,这样做是非常有利的
当其他用户想要查看我的文件时,他就需要获得该文件的锁,之前的WS也需要放弃这个文件的锁
类似于事务的概念,但frangipani是通过锁来实现的
当我完成所有的修改后,其他的工作站才能看到我所做的修改
不过为了完成这个目的,首先要去获取我所要读取或写入数据所需的全部锁,直到完成了操作,我才会对这些锁进行释放
在持有锁时崩溃会影响的组件
预想下各自服务器的LOG Entry
Log sequence number | petal block number | version number | Data to be written | ... |
---|---|---|---|---|
日志之包含对文件系统中目录,inode以及allocation bitmap的元数据的修改信息
一开始log存在frangipani的内存中,直到他不得不将日志写到petal中,他才会将日志写回petal
崩溃主要针对Revoke的场景 Revoke的步骤
崩溃可能发生在三个步骤前后,总共四种可能,
丢失上次预写日志到revoke的这段时间,重做
重做数据后,写入数据块即可
重做日志,在相同位置写入相同数据(幂等性)
该崩溃发生有需要讨论的一个点
WS1 执行完删除操作后,已经释放了他的锁,WS2创建了WS1相同目录下的文件,此时Petal磁盘检测WS1故障,要求WS3重做WS1的日志,WS3可能实际上会删除WS2创建的文件夹
解决方法:
ws3会看到ws1所做的删除操作的版本号,并使用该版本号
因此该ws3重做后的删除操作并不会实际执行
Frangipani使用lease来检测某个服务器是否崩溃,
Frangipani在两个完全相悖(缓存一致性、原子事务性)的特征上都使用了锁
frangipani 随着添加服务器,他的性能并不会受到抑制,赋予了合理的扩展性
并没有对存储系统的演进做出什么影响,因为frangipani所针对环境时面向小团体,通过它来共享文件,但他并没有应用到分布式文件系统中
frangipani的中心放在了缓存一致性和锁上面,对于读取数据和写数据并没有什么用,甚至于缓存根本没有什么用 (比如读取10TB数据,我们没办法进行实际缓存)
Frangipani 是一个分布式文件系统,底层基于Petal分布式存储服务,在上层,多个运行Frangipani的服务器使用共享Petal虚拟磁盘,然后使用Lock服务保证cache coherence。该文件系统针对的场景主要是可信任的小群体,不用担心安全问题。