在Dynamo paper的第5部分中,有以下内容:
特别是,由于每次写入通常都遵循读取操作,因此 写入的协调器被选择为最快回复的节点 先前的读操作,存储在上下文信息中 请求。此优化使我们能够选择具有该数据的节点 通过前面的读操作读取,从而增加了机会 获得“读写你的写作”的一致性。
如何提高“读写”一致性的可能性?
“read-your-writes”表示写入后的读取获取由设置的值 写。为此,由两个不同的客户端执行读取和写入 上下文。原因是写协调器的选择不会产生影响 关于由同一客户获得“读写”的机会。
但是上面的文字是关于阅读之后的写作。这是我的猜测。 如果可能,读协调器将尝试进行语法协调。 如果由于版本不同而无法进行句法协调,那么 客户端需要在写入之前进行语义协调。无论哪种方式, 读操作中涉及的所有节点上的版本都是。的祖先 和解版。因此,可以将以下写入发送给其中任何一个 应用。读取的最早写入时间是在读取之后 完成以下步骤:
执行上述步骤的时间越短,另一个步骤就越可能 以下阅读后会看到新版本。由于节点很有可能 回复最快的上一次读取可以在a中执行以下步骤 时间更短。选择这样的节点作为写协调器。
答案 0 :(得分:1)
在Dynamo中,当客户端希望更新对象时,它必须指定 它正在更新的版本。这是通过传递上下文来完成的 从早期的读操作中获得,该操作包含矢量 时钟信息。在处理读取请求时,如果Dynamo有 访问无法在语法上协调的多个分支, 它将返回叶子上的所有对象,并返回相应的对象 上下文中的版本信息。 使用此上下文的更新是 被认为已经调和了不同的版本和 分支折叠为一个新版本
因此,通过首先执行读取,您可以有效地协调所有不同版本之前的到写入。通过写入同一节点,您更新的版本将标记最新版本的上下文和向量时钟,并且所有不同的分支都可以折叠。这将尽快发送到前N个节点(如您所述)。但是通过删除不同的分支 - 可以减少返回多个值的可能性。您只需要在下一次读取时读取N个节点中的一个以获得协调写入。即 - 作为R读法定数量的一部分的节点说 - “我是和解的版本,所有其他人必须向我低头”。 (如果已经将其分发给另一个“R”节点,则在仲裁中获得对帐版本的可能性更大)
但是,如果您写入了另一个您未读取的节点 - 正在更新的矢量时钟可能不一定是该对象的协调版本。因此,你仍然可以有不同的分支。以下阅读将尝试和解它,但更可能的是,您可能有多个不同的数据而没有对帐。
如果你已经做到这一点,我认为最有趣的部分是根据第6节,客户端应用程序可以规定N,R和W的值 - 即 - 构成要绘制的池的节点数,以及必须就读或写达成一致的节点数才能使其成功。
Geez - 我的脑袋现在疼。
答案 1 :(得分:0)
我重读了Dynamo论文。我对#34; read-your-write"有了新的理解。一致性。 "读你 - 写"只涉及一个客户。映像一个客户端对同一个密钥执行的以下请求:
"读你-写入"表示read-2看到write-1。写协调器最有机会写1。为了确保"读写#34;,希望写协调器以最快的速度回复读取-2。节点极有可能以最快的速度回复读取-1,也最快回复读取-2。因此,选择节点回复最快的read-1作为写协调器。
什么是the node that replied fastest to the previous read operation
?如果使用客户端驱动的协调,这样的节点才有意义。对于服务器端协调,协调器节点回复客户端,其他涉及的节点回复协调器节点。在这种情况下,replied fastest
毫无意义。