Frangipani: A Scalable Distributed File System

阅读论文 Frangipani,参考 FAQnote

概述

Frangipani 是一个分布式文件系统,由 Petal 分布式存储服务和多个 Frangipani 服务器组成,Frangipani 服务器共享 Petal 提供的单个虚拟磁盘抽象,同时使用分布式锁保证缓存一致性。

实现

预写日志

每个 Frangipani 服务器都会使用预写日志记录系统元数据的变化(不记录文件数据),只有当日志持久化到 Petal 之后,才能修改系统的元数据。日志首先会按顺序存放在服务器内存的循环缓冲区中,然后定期刷新到 Petal。使用日志记录元数据的变化,可以避免服务器故障时元数据的部分更新导致文件系统结构被破坏(产生不一致),从而可以避免运行 fsck 一致性检查程序,实现快速恢复。

日志由若干大小为 512 字节的日志块组成,每个日志块都有一个单调递增的序列号。论文表示序列号作用是在故障恢复时检测日志的末尾,即使磁盘乱序写入数据。元数据由若干大小为 512 字节的元数据块组成,每个元数据块都有一个单调递增的版本号。日志块也会包含其所修改元数据块的版本号,只有日志块中的版本号大于元数据块的版本号时,才能应用日志。从而可以避免服务器故障恢复时,旧日志覆盖新版本的元数据,以及重复应用已经应用的日志。512 字节的日志块和元数据块实际上对应一个扇区,扇区的读写保证是原子的。

PS:论文提到元数据块被释放然后重用于文件数据导致版本号消失的问题,然后说明限制释放的元数据块仅被新的元数据块重用可以解决该问题。此处所说的元数据块应该是指扇区,所有才会释放和重用,也就是说版本号实际上是和元数据块所在的扇区绑定,而和元数据是什么无关。而且,之所以版本号消失会有问题,是因为日志块记录的是所修改元数据块的扇区位置。这种设计有点奇怪,日志块以及版本号不和修改的元数据关联,而是和扇区关联。

分布式锁

锁服务使用 Paxos 进行容错,为文件系统提供读写锁。当锁服务检测到冲突的锁请求时,会要求当前锁的持有者释放或降级锁,以消除冲突。读写锁允许 Frangipani 服务器从磁盘获取数据并将其缓存。在释放读写锁前,服务器会使缓存无效,从而保证缓存一致性。在释放或降级写锁前,服务器必须将脏数据写入磁盘(包括文件数据)。磁盘被划分为若干逻辑段,每个段都有一个锁,每个日志、文件、目录和符号链接都是一个段。每个文件使用一个锁,适合很少并发写的工作负载,其他负载可能需要使用更细粒度的锁。

锁具有粘性,也就是说 Frangipani 服务器获取锁之后不会主动释放,除非锁服务要求其释放。当挂载 Frangipani 文件系统时,Frangipani 服务器会调用 clerk 模块,该模块会连接到锁服务,获取租约并且在本地打开一个锁表。当文件系统被卸载时,clerk 会关闭锁表。clerk 和锁服务使用异步消息进行通信,有四种消息类型:request、grant、revoke 和 release。

故障处理

当 Frangipani 服务器的租约由于没有续约而过期时,锁服务会认为该服务器故障,此时需要一种机制来释放故障服务器持有的锁。锁服务会在另一个 Frangipani 服务器上启动恢复进程,新服务器会获取租约和故障服务器日志的锁,然后按顺序应用未执行的日志,最后释放(release)所有锁以及释放(free)日志。如果是由于网络分区故障而没有续约,租约过期的 Frangipani 服务器会主动丢弃其所有锁和缓存数据。如果缓存中存在脏数据,则服务器会向用户程序报告错误,将问题交给用户处理。

如果租约在服务器向 Petal 发送写入请求之后到达之前过期,则会产生问题,因为此时锁可能已经被授予故障恢复服务器。论文提到可以为每个写入请求添加过期时间戳,如果请求到达 Petal 的时间戳大于请求中的时间戳,则拒绝该请求。或者将锁服务和 Petal 集成,服务器为写入请求添加租约标识符,然后 Petal 可以判断租约是否过期。

问题

Q:日志序列号的作用有点奇怪,为什么磁盘要乱序写入数据?

Q:日志只会记录元数据,那么有可能只执行元数据更改,而丢失文件数据?

A:该语义符合标准的本地 Unix 文件系统,崩溃之前的写入可能会丢失。应用程序可以使用 fsync 系统调用,强制将数据立即刷新到磁盘。

总结

预写日志存储在 Petal 提供的共享虚拟磁盘上,使得任何服务器都可以使用故障服务器的日志进行恢复。多个日志使得恢复过程变得复杂,需要使用版本号机制避免异常。分布式锁保证服务器之间的缓存一致性。Frangipani 服务器运行在用户侧,负责和共享磁盘通信,该设计要求用户是可信的。该系统使用粗粒度的锁定,一个文件对应一个锁,所以不适用于经常并发写入相同文件的负载。论文的性能测试我没有太多时间看,总结时也忽略了一些我认为不是很重要的细节。

作者

Ligh0x74

发布于

2024-02-15

更新于

2024-02-21

许可协议

评论