作者:Sanjay Ghemawat
          Howard Gobioff
          Shun-Tak Leung
翻译:tinyfool

3.4 快照

快照操作可以非常迅速的创建一个文件或者目录数的副本,而且几乎不会被正在进行的其他操作打断。我们的用户使用它快速创建巨大数据集的分支副本(通常是递归的复制这些副本),或者是在改变之前,建立当前状态的检查点,这样之后可以轻松的提交确认或者进行回滚。

就像AFS,我们使用标准的copy-on-write技术实现快照功能。当主服务器收到快照请求,它首先取消关于快照相关文件所在块服务器上面的所有租约。这就确保了任何发生在这些块服务器上面的后续写操作都需要与主服务器沟通找到租约持有者。这就给主服务器一个机会,首先创建块的新副本。

取消或者这些租约过期后,主服务器把这些操作日志到硬盘上。然后,它通过复制源文件或者目录的元数据的方式,把这些日志记录应用到它保存在内存的状态中。新创建的快照文件指向与源文件完全相同的块地址。

客户机在快照操作后第一次想写入一个块C,它发送一个请求给主服务器来寻找当前的租约持有者。主服务器注意到块C的引用技术超过1。它延迟回复客户机的请求,取而代之的是选择一个新的块句柄C'。然后它要求每个拥有块C当前副本的块服务器创建一个叫做C'的新块。通过在源块所在块服务器创建新的块,我们确保数据可以本地化的复制,而不用通过网络(我们的硬盘比我们的100Mb以太网连接快3倍)。从这点看,请求的处理和任何其他的块也没什么不同:服务器保障新块C'的副本中的一个拥有租约,然后用它回应客户机,客户机可以正常的写这个块,而不需要知道它是刚刚从一个已存的块中创建出来的。


<< 3.3 原子性的记录追加 | 4. 主服务器操作 >>