在发电机纸的第5节中,有以下内容:
特别是,由于每次写入通常遵循一个读操作,因此选择写的协调器作为对存储在请求的上下文信息中的前一个读取操作的最快响应的节点。这种优化使我们能够选择具有由前面的读操作读取的数据的节点,从而增加了获得“读-您的写”一致性的机会。
如何增加“读你的写”一致性的机会?
“读-你的写”是指写后的读得到由写入设置的值。读取和写入由两个不同的客户端对此上下文执行。原因是编写协调器的选择不会影响同一个客户端获得“读-您的写”的机会。
但是上面的课文是关于读后写的。这是我的猜测。如果可能的话,读协调器将尝试进行语法协调。如果由于版本不同而不可能进行语法协调,则客户端需要在编写之前进行语义协调。无论哪种方式,读取操作所涉及的所有节点上的版本都是协调版本的祖先。因此,下面的写可以发送给他们中的任何一个,以得到应用。读到写入的最早时间是在完成以下步骤之后:
执行上述步骤的时间越短,另一个后续read就越有可能看到新版本。因为最有可能的是,对上一次读取响应最快的节点可以在较短的时间内执行以下步骤。选择这样一个节点作为写协调器。
发布于 2014-08-12 08:06:39
我重读了迪纳摩报。我对“读你写”的一致性有了新的理解。“阅读你的写作”只涉及一个客户。用相同的键显示由一个客户端执行的下列请求:
“读你的写”意思是读-2看到写-1。写协调器有最好的机会写-1。为了确保“读-您的写”,需要写协调器最快地回复读-2。极有可能,节点响应速度最快的读-1也最快答复读-2。因此,选择节点响应速度最快的读-1作为写协调器。
the node that replied fastest to the previous read operation是什么?只有在使用客户端驱动的协调时,这样的节点才有意义。对于服务器端协调,协调节点响应客户端,而其他涉及到的节点答复协调节点。在这种情况下,replied fastest是没有意义的。
发布于 2013-08-07 03:30:59
在Dynamo中,当客户端希望更新对象时,它必须指定正在更新的版本。这是通过传递从先前的读取操作中获得的上下文来完成的,该操作包含向量时钟信息。在处理读取请求时,如果Dynamo能够访问无法语法协调的多个分支,那么它将返回所有的叶对象,并在上下文中提供相应的版本信息。使用此上下文的更新被认为协调了不同版本的,并且分支被折叠成一个新版本。
因此,首先执行读操作,就可以在编写之前有效地协调所有不同的版本。通过写入同一个节点,您更新的版本将被标记为最新版本的上下文和向量时钟,所有不同的分支都可以折叠。这将尽可能快地发送到顶级N个节点(正如您所说的)。但是,通过移除不同的分支,可以减少返回多个值的可能性。您只需要在下一次读取中读取N个节点中的一个就可以得到协调的写入。ie -作为R法定人数的一部分的节点说:“我是调和的版本,所有其他人都必须向我鞠躬”。(如果它已经分发给另一个"R“节点,那么在仲裁中获得协调版本的可能性就更大了)
但是,如果您写到一个不同的节点,一个没有读取的节点-正在更新的向量时钟-可能不一定是对象的协调版本。因此,你仍然可以有不同的分支。下面的读取将尝试并协调它,但更有可能的是,您可能有多个不同的数据,而不进行协调。
如果您已经做到了这一点,我认为最有趣的部分是,按照第6节,客户端应用程序可以指定N、R和W的值,即构成池的节点数,以及必须同意读写才能成功的节点数。
天啊-我头疼了。
https://stackoverflow.com/questions/17874534
复制相似问题