Concurrency Google文件系统一致性模型

Concurrency Google文件系统一致性模型,concurrency,filesystems,distributed-system,gfs,Concurrency,Filesystems,Distributed System,Gfs,我读过关于GFS及其一致性模型的书,但我没能理解其中的一些内容。 特别是,有人能为我提供一个具体的示例场景(或解释为什么它不能发生): 可能导致记录重复的并发记录追加 可能导致未定义区域的并发记录追加 可能导致未定义区域的并发写入(在单个块上) 我认为这与并发追加无关,但至少与系统的一次语义有关 故障是大型分布式系统的一个基本问题。出现故障时,发送方可能不知道网络另一端的计算机是否完全接收到其消息 在这种情况下,分布式系统保证消息最多传递一次或至少传递一次 在这种情况下,GFS似乎决定至少向存

我读过关于GFS及其一致性模型的书,但我没能理解其中的一些内容。 特别是,有人能为我提供一个具体的示例场景(或解释为什么它不能发生):

  • 可能导致记录重复的并发记录追加
  • 可能导致未定义区域的并发记录追加
  • 可能导致未定义区域的并发写入(在单个块上)

我认为这与并发追加无关,但至少与系统的一次语义有关

故障是大型分布式系统的一个基本问题。出现故障时,发送方可能不知道网络另一端的计算机是否完全接收到其消息

在这种情况下,分布式系统保证消息最多传递一次或至少传递一次

在这种情况下,GFS似乎决定至少向存储节点交付一次。查看表1,该表总结了写入/附录的可能结果:

  • 如果记录附加在任何副本上失败,客户端将重试 因此,同一区块的副本可能包含 不同的数据可能包括相同数据的副本 因此,副本上的任何故障(例如超时)都将导致至少在其他副本上出现重复记录。在没有并发写入的情况下,这可能会发生

  • 导致重复记录的相同情况也会导致区域不一致(因此未定义)。如果复制品未能确认突变,则可能未执行该操作。在这种情况下,当客户端重试追加时,此复制副本必须添加填充以代替丢失的数据,以便记录可以写入正确的偏移量。因此,一个副本将具有填充,而另一个副本将在此区域中具有先前写入的记录

  • 写入失败也会导致区域不一致(因此未定义)。更有趣的是,成功的并发写入可以导致一致但未定义的区域。“如果应用程序的写操作很大或跨块 GFS客户端代码将其分解为多个 写操作。它们[…]可以与并发操作交错并被并发操作覆盖 来自其他客户端的操作。因此,共享 文件区域可能最终包含来自不同文件的片段 客户端,但副本将是相同的,因为 操作在同一时间内成功完成 对所有副本进行排序。这会使文件区域保持一致 但未定义的状态[…]


  • 谢谢你的回答!因此,只有当主块服务器在写入数据并更新文件结尾后出现错误时,才会发生这种情况,对吗?嗨,Daniel,谢谢你的回答,它回答了我的大部分问题。不过还有一件事:我的主要困惑源于这样一个事实:客户端只与主副本通信,而正是这个副本等待其他副本的确认。因此,如果一个次要副本的追加失败,那么主要副本将知道发生了这种情况,并且没有理由增加指向文件结尾的指针;因此,新的附录应该在以后覆盖不一致的区域。我错过了什么?我想有可能按照你说的去做。但我认为GFS不会这么做。我想如果他们这么做了,他们会提到这件事的。我未受过教育的猜测是,这是为了增加并发附件的吞吐量。如果主记录希望在发生故障时能够向后移动指针,则在记录追加过程中,它将无法接受其他记录追加。如果即使对于失败的突变,它也增加了指针,那么它就可以立即接受其他附加项。如果有人能证实/纠正这一理论,那就太好了。一旦主服务器收到副本上的故障,它插入的下一条记录必然是同一条,对吗?正如上面所说,“客户端重试”该操作。那么其他的附加物怎么可能像你说的那样呢?为什么它们不可能呢?