MIT 6.824 Frangipani论文精读

本文介绍了Frangipani,一种分布式文件系统,强调其在扩展存储、文件一致性、服务器添加与备份方面的特性。系统结构包括用户程序、Frangipani服务器模块、Petal服务器和锁服务,通过安全的CS架构实现数据保护和管理。讨论了系统的盘布局、日志同步和恢复策略,以及同步和缓存一致性解决方案。
摘要由CSDN通过智能技术生成

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个区域:

  1. 第一个区域用于存放共享的配置参数和管理信息。
  2. 第二个区域存放日志。Frangipani将该区域划分为256个大小相同的部分,每个部分用于存放一个Frangipani server的log,因此最多可以设立256个server。
  3. 第三个区域为allocation bitmaps,用于标识虚拟内存中的那些空间是空闲状态。每个server会独自占有一部分bitmap space,当一个server的bitmap space用完后,会占有新的bitmap space。
  4. 第四个区域用于保存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中。
  5. 第五个区域存放small data blocks,每个block大小为4KB。每个文件的开头64KB存在在该区域。
  6. 剩余区域为big daba blocks,每个block大小为1TB。每个文件除起始64KB外剩下的内存存放在该区域。

在目前的设计方案中,每个文件最大不超过64KB + 1TB,但是整个虚拟磁盘空间的划分可以灵活变动。

Logging and Recovery

Frangipani只使用metadata的write-ahead redo log进行recovery,不对user data进行记录。

Frangipani server需要修改metadata时,其步骤如下:

  1. Frangipani server创建log并append store在自己的内存中。
  2. 定时的将log通过Petal device driver发送给Petal server。
  3. Petal server将log写入Frangipani server拥有的log space。
  4. Unix update 实例会定期的将log space中的更改写入到metadata中。

Petal以circular buffer的方式管理log space,当某个server的log space空间满时,会释放掉前25%的旧空间来存放新的log,在释放旧空间前需要保证其更改已经实际写入metadata。

Frangipani server的故障检测和恢复策略如下:

  1. client或lock service没有收到reply,检测到Frangipani server crash。
  2. recovery实例获取crash server的lock和log权限。
  3. recovery实例找到log的起始点和末尾点,并找出还没有处理的log进行replay。
  4. recovery实例释放lock,并清空所有log。
  5. 新的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,具体步骤如下:

  1. 丢失lock的lock server从interal state中清除这些lock信息
  2. 获得lock的lock server联系所属lock table的clerk
  3. lock servers通过与clerk通信更新new lock的状态,并且clerk或者new lock所属的新server

当Frangipani server出现故障时,lock service会联系其它Frangipani server上的clerk来进行recovery,并在recovery结束后释放crash server的所有锁。

Frangipani system能够在network partition下正常运行,原因如下:

  1. 如果Frangipani与lock server出现partition,lock server会认为收不到消息的Frangipani已经宕机,会启动revocery并释放所有锁。
  2. 如果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步骤:

  1. 由管理人员告知servers使用那些Petal virtual server,并与lock server建立联系。
  2. new server联系lock server获取lease并根据lease获取log space

删除servers步骤:

  1. 直接关闭servers
  2. 系统会自动进行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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值