Google文件系统一致性模型

Sim*_*one 6 filesystems concurrency distributed-system gfs

我正在阅读有关GFS及其一致性模型的内容,但我未能掌握其中的一些内容.特别是,有人可以为我提供一个特定的示例场景(或解释为什么它不会发生):

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

Dan*_*bos 6

我引用了http://research.google.com/archive/gfs.html.查看表1,它是写入/附加的可能结果的摘要:

表1来自GFS白皮书

  1. "如果任何副本上的记录追加失败,则客户端会重试该操作.因此,同一块的副本可能包含不同的数据,可能包括整个或部分相同记录的重复." 因此,副本上的任何失败(例如超时)都将导致至少在其他副本上出现重复记录.没有并发写入就会发生这种情况

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

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

  • 我觉得按你说的做是可以的。但我认为 GFS 不会这样做。我想如果他们这样做的话他们会提到这一点。我未经教育的猜测是,这是为了增加并发附加的吞吐量。如果主数据库希望能够在发生故障的情况下移回指针,则在进行记录追加时,它将无法接受其他记录追加。如果即使突变失败,它也会增加指针,那么它就能够立即接受其他追加。如果有人能够证实/纠正这个理论,那就太好了。 (2认同)