7

I was reading about GFS and its consistency model but I'm failing to grasp some of it. In particular, can someone provide me with a specific example scenario (or an explanation of why it cannot happen) of:

  • concurrent record append that could result in record duplication
  • concurrent record append that could result in undefined regions
  • concurrent writes (on a single chunk) that could result in undefined regions
4

2 回答 2

10

我从http://research.google.com/archive/gfs.html引用。查看表 1,它总结了写入/追加的可能结果:

GFS 白皮书中的表 1

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

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

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

于 2015-01-21T23:27:34.913 回答
1

我不认为它真的与并发追加有关,而是与他们系统的至少一次语义有关。

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

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

在这种情况下,似乎 GFS 决定至少向存储节点交付一次。

于 2015-01-10T16:22:01.663 回答