本文是Frangipani论文的阅读笔记,Frangipani是一个建立在Petal之上的分布式文件系统,采用分布式锁来保证一致性。其中Petal是一个增量扩展、高可用可以自动管理的分布式虚拟磁盘。
总览
Frangipani最为显著的特性为——一组机器使用一个公共存储,使用锁进行同步访问。要求的其他特性包括:
- 所有用户看到文件的一致视图
- 更多的服务器可以很方便地添加到集群中来扩展容量和带宽而不需要改变已有服务器的配置甚至打断它们运行
- 管理员可以添加用户而不需要担心数据如何被管理
- 可以在不打断系统运行的情况下进行全局一致备份
- 可以在不需要运维介入的情况下从机器故障、网络故障以及磁盘故障中恢复
系统结构
组件
用户程序使用系统调用(文件系统)访问Frangipani文件系统,任何修改缓存在内核缓冲区中,直到调用fsync或者sync才被写入,显然Frangipani文件系统模块需要运行在操作系统内核中。所有的文件系统读写Petal上相同的数据结构,但是在虚拟磁盘上独立保存各自的redo日志。Petal提供了巨大、可扩展、容错的虚拟硬盘,而锁服务实现了多读单写锁。
安全性和客户端/服务器配置
Frangipani运行在可信环境中,并没有设计安全措施。如果需要在不可信环境使用Frangipani,可以将包含Petal的Frangipani服务器部署在可信环境,然后将不包含Petal的客户端和Frangipani服务器连接。
磁盘布局
Petal为Frangipani提供了一个巨大的虚拟磁盘空间,地址空间大小为,虚拟磁盘使用方式如下:
- 第一个区域(1TB)保存共享的配置参数和内部信息;
- 第二个区域(1TB)保存日志,每个服务器拥有私有的日志,目前划分了256个空间,因此最多支持256个Frangipani服务器;
- 第三个区域(3TB)保存位图,追踪剩余区域中的空闲块;
- 第四个区域(1TB)保存i节点,每个i节点大小为512B;
- 第五个区域(128TB)保存小数据块,每个数据块为4KB;
- 剩余区域保存大数据块,每个数据块为1TB。
比64KB小的文件只保存在小数据块中,更大的文件保存在16个小数据块加上1个大数据块中,文件大小不能超过16个小数据块加上1个大数据块的容量。
日志和恢复
Frangipani保存元数据的REDO日志来简化故障恢复和提升性能,用户数据不会记录。当Frangipani奔溃之后,系统检测到故障,使用日志进行恢复。为了保证日志和恢复正常工作需要保证:
- 不同服务器在同一数据上的操作必须是序列化的;
- 只会恢复那些拥有锁状态的日志;
- 对于一个服务器,只有一个恢复进程在工作。
同步和缓存一致性
Frangipani使用了多读取/单写入锁来保证同步性。读取锁允许服务器从磁盘读取数据并缓存,在释放读取锁之前需要让缓存失效。写入锁允许服务器读写数据并缓存,但是在释放之前需要将缓存中的脏数据写入磁盘。作者将磁盘上的结构分割成可以加锁的分块,包括每个日志,位图、文件、目录以及符号链接。避免死锁主要靠顺序加锁和解锁,服务器首先需要知道所有需要获得的锁,然后进行排序,按照顺序获取和解锁。
锁服务
锁服务提供了多读取/单写入锁,客户端会一直持有锁,直到别的有冲突的客户端请求。锁服务使用租期来处理故障,每个客户端会请求一个租期,每个锁会和租期对应,客户端需要在过期之前刷新租期,如果客户端租期过期,那么就认为已经崩溃了。
作者先后尝试了三种锁服务方案:
- 中心化的服务:缺点是难以容错
- 保存在Petal:缺点是性能比较差
- 容错可扩展存储:和Petal服务器绑定
增加和移除服务器
增加服务器非常简单,只需要告知使用哪个Petal虚拟磁盘,以及如何找到锁服务。新服务器会联系锁服务获得租期,确定日志保存位置,然后开始处理操作。移除服务器就更加简单了,直接关闭即可。
备份
Petal能够在任何时间创建一份虚拟磁盘的拷贝。如果想要实现文件系统层面的备份,可以阻塞文件系统调用后进行备份。
参考文献
- Thekkath, Chandramohan A., Timothy Mann, and Edward K. Lee. "Frangipani: A scalable distributed file system." SOSP. Vol. 97. 1997.