我正在阅读关于GFS以及其一致性模型的内容,但是有些地方我还无法理解。
特别是,能否有人提供具体的示例场景(或者为什么不可能发生):
- 并发记录追加可能导致记录重复
- 并发记录追加可能导致未定义区域
- 并发写入(在单个块上)可能导致未定义区域
我正在阅读关于GFS以及其一致性模型的内容,但是有些地方我还无法理解。
特别是,能否有人提供具体的示例场景(或者为什么不可能发生):
以下内容摘自http://research.google.com/archive/gfs.html,请查看表格1,这是写入/追加可能的结果概要:
"如果记录追加在任何一个副本上失败,则客户端将重试该 操作。因此,同一块的副本可能包含 不同的数据,可能包括相同的重复记录 完全或部分." 因此,任何一个副本失败(如超时)都会导致至少在其他副本上出现重复记录。这可以在没有并发写入的情况下发生。
导致重复记录的相同情况也会导致不一致(因此未定义)的区域。如果副本未能确认变异,则可能未执行变异。在这种情况下,当客户端重试附加操作时,此副本将不得不添加填充以代替缺失的数据,以便可以在正确的偏移量处编写记录。 因此,一个副本将具有填充而另一个副本将在该区域中具有先前编写的记录。
失败的写入也可能导致不一致(因此未定义)的区域。更有趣的是,成功的并发写入也可能导致一致但未定义的区域。"如果应用程序的写入很大或跨越块 边界,GFS客户端代码将其分解成多个 写操作。它们[...]可能会与来自其他客户端的并发操作交错和覆盖。 因此,共享文件区域可能包含来自不同客户端的片段, 虽然副本将是相同的,因为各个 操作在所有副本上以相同的顺序成功完成。这使得文件区域处于一种一致但未定义的状态[...]。"