接着上一篇《论文阅读笔记(一)》,继续记录《The Google File System》的阅读体会:
(16)主节点在启动时轮询各个子节点上包含的数据块信息,这通过正向心跳包来实现。这样做的好处是避免了主节点和子节点的信息同步问题,因为子节点的信息是随时在动态变化的,并且只有子节点才对它包含的数据块信息有话语权。
(17)操作日志包含了关键元数据更改的历史记录,定义了并发操作的逻辑时序。因此必须在多个远端机器上备份,而且只有在将操作记录写入本地硬盘和远端备份后才继续响应客户端的操作。为了减小对整个系统吞吐量的影响,主节点会对多个操作日志记录进行组批。
主节点可以通过重做操作日志恢复文件系统,且当日志超过一定大小时主节点会对此时的系统设置检查点。检查点以一棵压缩的B-树形式存在,能被直接映射到内存中,不需要额外的解析就可以用于名称空间的查找。
(18)构建一个检查点是一个耗时的操作,为了不影响接下来的更改操作,主节点会转换到一个新的日志文件,并在一个单独的线程中创建新的检查点。新的检查点包括了转换前的所有更改操作。当新检查点创建完成后,它会被写入到本地和远端机器。
(19)文件名称空间的更改(例如创建文件)是原子性操作。主节点通过名称空间加锁机制确保其原子性和正确性。操作日志也为这些操作定义了一个全局的总顺序。
(20)一次更改操作会改变数据块的元数据或内容,比如写操作和数据追加操作。更改动作必须在数据块所有的备份上进行。作者使用租约来在多个备份之间维护一个一致性的更改顺序。主节点首先将一个数据块租约授权给备份之一,这个备份称为主备份。由主备份来对数据块的所有更改操作选择一个连续的顺序。其他备份在对数据块进行更改操作时都遵循这个顺序。租约机制减小了主节点的管理负担。租约有效期位60秒,当然,主备份也可以向主节点申请续约。它们之间的请求和授权信息会捎带在心跳包中。主节点也可以在一份租约过期之前收回(比如主节点向禁止对一个正在改名的文件进行更改操作)。甚至当主节点与主备份失去连接后,只要在老的租约过期后,它也可以向一个新的备份发放租约。
以上图来说明租约的管理:
1,客户端询问主节点哪个子节点拥有数据块的当前租约以及其他备份的位置。若没有子节点拥有租约,主节点就选择一个子节点,发放租约给它。
2,主节点回复主备份的标识符以及从备份的位置信息给客户端。客户端缓存这些信息,用于将来的更改操作。只在主备份不可达时或主备份不在拥有租约时,客户端才再次询问主节点。
3,客户端将所有数据推向所有的备份节点,这可以任何顺序进行。每个子节点会以LRU缓存的形式存储这些数据。
4,一旦所有的备份节点都声明已经接收到这些数据,客户端就向主备份发出一个写操作请求。主备份会对它接收到的所有操作信息赋予一耳光连续的序号,然后以此顺序对本地数据进行操作。
5,主备份将写操作请求广播给所有其他从备份节点。每个从备份节点按照主备份定义的顺序进行操作。
6,从备份完成操作后,向主备份发出回复信息。
7,主备份再向客户端发出回复信息。任何备份节点上发生错误,都会向客户端报告。若发生错误,客户端可以要求重试。
(21)作者对数据流和控制流进行了解耦操作,控制流从客户端流向主备份,然后到所有的从备份,而数据是以一个顺序链的形式(而不是按某些拓扑形式)在子节点间流动。目的是充分利用每个机器的网络带宽,避免产生网络瓶颈。每个机器都尽快将数据传给最近的没有接收过数据的机器,而这个距离可以通过IP地址来精确计算。
(22)GFS提供了一个原子性的记录追加操作。在传统的写文件操作中,用户指定数据要写入的偏移位置,而这对于同一位置的并发写操作来说是不可线性化的。而对于记录追加来说,用户只指定数据,GFS会选择一个偏移位置并原子性地至少将记录追加一次到文件中,并返回此偏移值给用户。
(23)当将要追加的数据送到文件的最后一个数据块的所有备份处后,客户给主备份发出数据追加的请求,此时主备份会检查若将记录追加到当前数据块后,是否会超出块的最大长度(64M).若会超过,主备份将当前数据块填充满,并通知从备份也这么做,然后向客户报告操作应该在下一个数据块处重试。若不会超过,当然就很简单了。若记录追加操作在任何一个备份节点处失败,客户端会重试此操作。
(24)镜像操作是在几乎不影响其他更改操作的同时,对一个文件或一棵目录树进行拷贝,主要用于在做更改操作前设置检查点,以便以后回滚或提交。和AFS一样使用了写时复制的技术来实现镜像。
(25)当主节点收到镜像的操作请求后,它首先收回要镜像的文件所包含的数据块的所有租约,这确保接下来任何对这些数据块的写操作多必须询问主节点,以便查找租约所有者。这就给主节点创建数据块拷贝的一个机会了。当租约收回或过期后,主节点将操作日志到硬盘上。然后通过复制源文件或目录树的元数据,从而将此日志记录作用到内存中的状态。新创建的镜像文件指向源文件一样的数据块。在镜像操作完成后,客户端首次想写数据块C时会向主节点询问当前的租约所有者。主节点会发现数据块C的引用计数大于1.它会选择一个新的数据块句柄C’,然后通知所有拥有数据块C的备份节点创建一个名为C’的数据块。然后主节点发放C’的租约,回复给客户端。
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/11/14/1333869.html,如需转载请自行联系原作者