2.7 一致性模型GFS 采用弱一致性模型,能很好的支持分布式应用,同时实现上比较简单 。我们在这里将讨论 GFS 的一致性保障机制以及其对于应用的意义 。我们也将着重描述了 GFS 如何维持这些一致性保障机制,但将一些细节留在了其它章节 。
2.7.1 GFS的一致性保障机制文件命名空间修改(如,创建文件)是原子性的 。它们仅由主节点进行处理:命名空间锁保障了操作的原子性和正确性;主节点操作日志定义了这些操作的全局排序 。
下图是经过修改后的文件区域状态表:
文章插图
一个文件区域(region)在一个数据修改后的状态依赖于该修改的类型、成功或失败、以及是否为同步的修改 。表1 总结了一次修改后的结果 。
- 如果所有的客户端无论从哪些副本读取数据,得到的数据都是相同的,则这个文件区域为一致的 consistent 。
- 在一个文件数据修改后 , 如果它是一致的,则这个区域已定义 defined , 客户端将看到被写入的全部内容 。
- 当一个修改完全没有受到并发写入操作的影响并成功时,那么影响到的区域已定义(隐含一致性) consistent interspersed undefined:所有的客户端将总会看到修改已经写入的内容 。
已定义的一定一致
- 并发成功的修改使区域处于一致,但未定义状态 consistent but undefined:所有的客户端将看到相同的数据,但是它可能不能反映出任意一个修改已写入的内容 。
- 通常 , 它是由一些来自多个修改操作的、混合的数据碎片组成的 。
一致的未必已定义,因为数据一致,但有些操作可能未成功或成功了一半
- 一个失败的修改会造成区域的不一致性(因此也没有被定义)inconsistent:不同的客户端在不同的时间可能会看到不同的数据 。
数据修改操作可能是写入 write 或记录追加 append 操作 。一个写操作会将数据写入到应用指定的文件位置 。偏移位置将被返回给客户端 , 并标明包含这个记录的已定义区间的开始位置 。
- 如果有多个并发修改操作 , 一个记录追加操作会将数据(记录)至少一次的原子性的追加到文件 , 而具体的偏移量是由GFS选定的 。
- 一个通常的追加操作仅仅是将数据追加到客户端认为是当前文件结尾的位置 。
在一系列成功的修改操作后,被修改的文件区域被保证为是已定义的 , 并且包含了最后一次修改操作写入的数据 。GFS通过以下步骤完成上面行为:
- 在所有副本上按相同的顺序执行一个块上的修改操作(3.1)
- 使用版本号来检测并复制过期文件(4.5)
- 这种过期可能是由于块服务器宕机而造成了部分修改丢失引起的 。过期的副本不会再涉及修改操作,主节点也不会将该副本返回给客户端 。它们会尽快的进行垃圾回收操作 。
【The Google File System 翻译和理解】在一个修改操作成功执行完一段时间后,组件的失效依然能损坏或删除数据 。
- GFS通过在主节点和所有块服务器间定期的握手来标识失效的块服务器,并通过校验和来探测数据损坏(5.2) 。
- 一旦问题被发现,数据将会尽快的利用有效副本进行恢复(4.3) 。
2.7.2 应用的实现GFS 基于一些简单的技术实现了一个宽松的一致性模型:
推荐阅读
- JAVA的File对象
- Codeforces 1670 E. Hemose on the Tree
- 二 沁恒CH32V003: Ubuntu20.04 MRS和Makefile开发环境配置
- 驱动开发:内核监控FileObject文件回调
- 齐博X1-栏目的调用2
- Blazor组件自做十一 : File System Access 文件系统访问 组件
- How to get the return value of the setTimeout inner function in js All In One
- System.IO.FileSystemWatcher的坑
- Docker | dockerfile构建centos镜像,以及CMD和ENTRYPOINT的区别
- prometheus监控实战