文章目录
Introduction
如今,集群的不断增长给数据的存储带来了新的挑战。为了保存更多的文件,并为更多的用户服务,我们需要添加更多的磁盘并挂载到更多的机器上。但是,磁盘的扩展需要专业人员的管理维护,RAID技术也仅仅只能解决部分问题。
Frangipani是一个用于管理disks集合与集群对应关系的分布式文件系统,其主要有以下特点:
- 所有用户看到的文件状态具有一致性。
- 可以在不打断现有server的操作和更改现有server配置的情况下添加新server。
- 系统管理员可以轻松的添加新用户,无需考虑用户的数据由哪个server管理或由哪个disk存储。
- 系统管理员可以对这个文件系统进行backup,backup可以在线执行,不需要关闭整个系统。
上图展示了Frangipani系统的基本层次结构,Frangipani是基于Petal系统进行搭建的。Petal系统是一个基于virtual disks的分布式存储系统,它将physical disks抽象成virtual disks,并为不同的用户提供服务。Frangipani servers通过Petal可以轻松的访问到相同的文件,并借助distributed lock service来协同不同的servers对相同文件的操作。
System Structure
Components
Frangipani的系统整体架构如下图所示。
下面对Frangipani中的各个组成部分进行简单介绍。
user programs:
- 通过operation system call interface访问Frangipani
- 运行在不同机器上的programs拥有文件的相同视图,任何文件更改都对所有programs可见。
- 对文件内容的更改首先会被缓存到unix local kernel buffer,直到调用fsync或sync时才会被写入disk。
- 文件metadata的更改会直接被logged并且写入disk
- Frangipani会记录文件的last-accessed time,来避免每次读取数据都需要更改文件的metadata。
Frangipani file server module:
- Frangipani运行在system kernel中,它将自己注册为可用的一种文件系统。
- 使用kernel buffer pool来缓存数据。
- 通过local Petal device driver来对virtual disks进行读写。
- 所有file servers共享shared Petal disk中存储的所有文件。
- 每个Petal server会存储与自己负责管理的Peta disk相关的redo log。当有Frangipani server宕机时,新的server可以访问redo log进行recovery。
- Frangipani server之间不能直接通信,必须通过Petal和lock service进行协调工作。
Petal device driver:
- 隐藏了Petal system的底层机制,对于上层系统来说等价于local disk。
- 负责将上层file server与正确的Petal server建立联系,并当Peta server故障时与新的server建立连接。
Petal server:
- 为Frangipani提供大型、可扩展的、容错的virtual disks服务。
- Petal可以接受一个或多个的disk failures和Peta server failures,只要集群中的大部分servers可以正常工作。
lock service:
- 提供multiple-reader lock和single-writer lock。
- 基于分布式的实现策略,具有容错机制和良好的可扩展性。
- Frangipani通过lock service来协调访问virtual disks的顺序并且保证跨节点之间kernel buffer caches的一致性。
Security and the Client/Server Configuration
在系统配置中,user programs和Frangipani file server部署在同一个节点当中。任何Frangipani machine都可以访问Peta virtual disk中的任意一个data block,因此Frangipani必须运行在可信的operation system中。 为了安全性保证,Frangipani server,Petal server和operation system三者必须互相认证,并且在Frangipani server和Petal server通过网络进行通信时,必须阻止恶意用户的窃听行为。
Frangipani通过采用加密技术达到的安全目标如下:
- 用户不能在节点上启动恶意修改过的operation system kernel。
- 网络通信中不能有其它用户程序的存在。
Frangipani给出了基于CS架构的部署方案,其具体如下图所示。
该CS架构有以下优点:
- 将外部不可信的client和内部可信的server分割开来,外部的client machine不可以直接访问kernel中的Frangipani server。
- Frangipani server和Petal server都部署在安全的私网环境中,只允许在该环境中进行通信。
- 外部client和内部server通过NFS或DFS进行通信。
- 由于Frangipani部署在kernel中,因此无法快速的移植到其它版本的linux或操作系统中。client可以从一个任意版本的linux系统,访问到部署了Frangipani的linux版本从而获取服务。
Discussion
Frangipani仍然存在以下问题:
- log记录会出现两次,一次在Frangipani上,一次在Petal上。
- Frangipani不知道文件的真实物理位置。
- Frangipani每次对整个文件进行加锁,而不是只对需要修改的data block加锁。
Disk Layout
Petal virtual disk使用64位的虚拟磁盘寻址空间,并将其按照64KB大小的粒度(相当于虚拟内存的页大小)进行虚拟地址到物理地址之间的转换。为了合理的应用虚拟磁盘空间,不过多的产生内部碎片,Frangipani对虚拟磁盘空间进行了划分,具体如下图所示。
其主要包含6个区域:
- 第一个区域用于存放共享的配置参数和管理信息。
- 第二个区域存放日志。Frangipani将该区域划分为256个大小相同的部分,每个部分用于存放一个Frangipani server的log,因此最多可以设立256个server。
- 第三个区域为allocation bitmaps,用于标识虚拟内存中的那些空间是空闲状态。每个server会独自占有一部分bitmap space,当一个server的bitmap space用完后,会占有新的bitmap space。
- 第四个区域用于保存inodes,每个文件需要一个inode来记录metadata。每个inode大小为512字节,与Petal中的disk block相同,这样就不会出现多个Frangipani server访问不同的文件需要访问相同disk block的情况。 整个区域最多可以存放 2 31 2^{31} 231个inodes。bitmap space和inode space之间的映射是固定的,当Frangipani新建文件时,其修改的inode space是已经在bitmap space中独占的映射区域。 需要注意的是,Frangipani server可以修改,删除,释放任意文件,但是新建文件只会在自己的inode space中。
- 第五个区域存放small data blocks,每个block大小为4KB。每个文件的开头64KB存在在该区域。
- 剩余区域为big daba blocks,每个block大小为1TB。每个文件除起始64KB外剩下的内存存放在该区域。
在目前的设计方案中,每个文件最大不超过64KB + 1TB,但是整个虚拟磁盘空间的划分可以灵活变动。
Logging and Recovery
Frangipani只使用metadata的write-ahead redo log进行recovery,不对user data进行记录。
Frangipani server需要修改metadata时,其步骤如下:
- Frangipani server创建log并append store在自己的内存中。
- 定时的将log通过Petal device driver发送给Petal server。
- Petal server将log写入Frangipani server拥有的log space。
- Unix update 实例会定期的将log space中的更改写入到metadata中。
Petal以circular buffer的方式管理log space,当某个server的log space空间满时,会释放掉前25%的旧空间来存放新的log,在释放旧空间前需要保证其更改已经实际写入metadata。
Frangipani server的故障检测和恢复策略如下:
- client或lock service没有收到reply,检测到Frangipani server crash。
- recovery实例获取crash server的lock和log权限。
- recovery实例找到log的起始点和末尾点,并找出还没有处理的log进行replay。
- recovery实例释放lock,并清空所有log。
- 新的Frangipani server接管工作。
只要Petal server运行正常,就可以允许任意数量的Frangipani server故障。为了能够找出log的起始点和中止点,Frangipani设定了自动增长的log sequence number。
由于多个Frangipani server可能会更改相同的文件,因此Frangipani通过以下机制来保证recovery的正确性:
- 对相同数据的多个更改操作必须是串行的。 当出现write lock竞争时,只有当前server的所有update已经写入Petal disk后,才允许释放write lock。
- 只能replay还没有写入metada的update log。 Frangipani为每个512B的metadata block设置了version number,当metablock version number < log record version number时,说明该log没有写入metadata。
- 每个server只能有一个recovery demon来进行日志回放。
Synchronization and Cache Coherence
Frangipani使用read/write lock来保证不同servers间对数据访问的一致性:
- read lock:允许Frangipani server从disk中读取数据并缓存,释放read lock后cache内容失效。
- write lock:允许Frangipani server从disk中读写数据,当server持有write lock时,cache内容可以和disk内容不一致。当server释放write lock或降级为read lock时,必须讲cache中的dirty data写入disk。
Frangipani采用分段加锁的机制,将on-disk structures分成不同的logical segments,具体策略如下:
- 每个log是一个single lockable segment。
- bitmap space本分割为多个segments。
- 每个innode和它指向的文件是一个segment。
Frangipani采用全局顺序加锁的方式来避免死锁,当sever确定了要获得的锁后,会按照innode address对锁进行排序,依次获取。
The Lock Service
lock service用于提供读写锁服务,并使用leases来处理client failure问题。每个client在获取锁时需要向lock service申请lease,lease过期时间为30秒,如果30秒内client没有向lock service重新续约,则lock service认为client已经failed。
lock service将单个Frangipani file system的所有lock组织成一个table,每个Frangipani file system都有一个lock table。 当Frangipani file system挂载时,file system会生成一个clerk开启lock table,用于与lock server进行通信,当Frangipani file system 卸载时,clerk会关闭lock table。
clerk通过异步消息与lock server通信,消息包括:
- clerk to server: request realease
- server to clerk: grant revoke
lock server使用Paxos算法来备份一些全局状态信息:
- lock servers列表
- 每个lock的服务对象
- clerk list
当lock servers出现add或remove时,需要移动其管理的lock,具体步骤如下:
- 丢失lock的lock server从interal state中清除这些lock信息
- 获得lock的lock server联系所属lock table的clerk
- lock servers通过与clerk通信更新new lock的状态,并且clerk或者new lock所属的新server
当Frangipani server出现故障时,lock service会联系其它Frangipani server上的clerk来进行recovery,并在recovery结束后释放crash server的所有锁。
Frangipani system能够在network partition下正常运行,原因如下:
- 如果Frangipani与lock server出现partition,lock server会认为收不到消息的Frangipani已经宕机,会启动revocery并释放所有锁。
- 如果Frangipani与Petal server出现partition,则不能够访问disk数据。
一种hazard情况,当Frangipani server与lock server网络通信断开无法更新lease时,如果Frangipani server在发送write request时lease没到期,但是当Petal接收到write request时lease已经到期,write lock已经被其它server获取,就会产生写冲突。
解决方式:在发送到Petal的request上加上expiration timestamp,Petal检查这个时间是否合法。
Adding and Removing Servers
添加servers步骤:
- 由管理人员告知servers使用那些Petal virtual server,并与lock server建立联系。
- new server联系lock server获取lease并根据lease获取log space
删除servers步骤:
- 直接关闭servers
- 系统会自动进行recovery工作,写回dirty data,释放锁资源
Backup
Petal由自己的copy-on-write snapshot机制,且满足crash-consistent。Frangipani直接使用Petal的snapshot进行备份,snapshot包含了所有的log和数据信息,可以直接调用revocery demon进行恢复。
可以使用barrier global lock来实现在线备份挂载,无需调用recovery。 Frangipani提供了file system level snapshot,所有servers获取barrier global lock不再接收新的request,然后进行snapshot备份,备份结束后退出barrier。通过这种方式,snapshot可以直接作为Frangipani进行挂载,但是只能是read-only,因为Petal的snapshot只能是read only。