在尝试将Dynamodb用于其中一个项目时,我对dynamodb的强一致性模型存在疑问。来自常见问题解答
强大的一致性读取 - 除了最终的一致性,Amazon DynamoDB还为您提供了 如果您的应用程序或应用程序的一个元素需要,请求灵活性和控制以请求强一致性读取。强一致性读取返回的结果反映了在读取之前收到成功响应的所有写入。
从上面的定义来看,我得到的是强一致读取将返回最新的写入值。
举个例子:假设Client1在Key K1上发出写命令,将值从V0更新为V1。在几毫秒之后,Client2发出Key K1的读命令,然后在强一致性的情况下,将始终返回V1,但是在最终一致性的情况下,可以返回V1或V0。我的理解是否正确?
如果是,如果写入操作返回成功但数据没有更新到所有副本并且我们发出强一致性读取怎么办?在这种情况下它将如何确保返回最新的写入值?
以下链接 AWS DynamoDB read after write consistency - how does it work theoretically?试图解释这背后的架构,但不知道这是否真的有效?通过此链接后我想到的下一个问题是:DynamoDb是基于单主机,多从机架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他人。
答案 0 :(得分:27)
简短回答:在强一致模式下成功写入要求您的写入在大多数可以包含记录的服务器上成功,因此任何未来的一致读取将始终看到相同的数据,因为一致的读取必须读取大部分可以包含所需记录的服务器。如果您没有执行强一致性读取,系统将询问随机服务器以获取记录,并且数据可能不是最新的。
想象一下三台服务器。服务器1,服务器2和服务器3.要编写强一致性记录,最少选择两台服务器,然后写入数据。我们选择1和2。
现在您想要一致地读取数据。选择大多数服务器。假设我们选择了2和3。
服务器2具有新数据,这就是系统返回的内容。
最终一致的读取可能来自服务器1,2或3.这意味着如果服务器3是随机选择的,则新写入将不会出现,直到复制发生。
如果单个服务器出现故障,您的数据仍然是安全的,但如果三个服务器中有两个服务器出现故障,则新的写入操作可能会丢失,直到恢复脱机服务器为止。
更多解释: DynamoDB (假设它类似于亚马逊发布的Dynamo论文中描述的数据库)使用环形拓扑,其中数据传播到许多服务器。由于您直接查询所有相关服务器并从中获取当前数据,因此可确保高度一致性。戒指中没有主人,戒指中没有奴隶。给定记录将映射到环中的许多相同主机,并且所有这些服务器将包含该记录。没有奴隶可能落后,没有主人可以失败。
随意阅读有关该主题的任何论文。可以使用名为Apache Cassandra的类似数据库,它也使用环复制。
http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf
答案 1 :(得分:2)
您可以在此处找到问题的答案:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html
当您发出强一致性读取请求时,Amazon DynamoDB会返回一个响应,其中包含最新数据,这些数据反映了Amazon DynamoDB返回成功响应的所有先前相关写入操作的更新。
在您的示例中,如果updateItem
要求将值从v0
更新为v1
成功,则后续强一致性读取请求将返回v1
。
希望这有帮助。
答案 2 :(得分:1)
免责声明:以下内容无法根据公共DynamoDB文档进行验证,但它们可能非常接近真相
从理论开始,DynamoDB使用quorums,其中V是副本节点的总数,Vr
是读操作要求的副本节点数,Vw是副本的数量执行每次写入的节点。可以利用读取仲裁(Vr
)来确保客户端获取最新值,同时可以利用写入仲裁(Vw
)来确保写入不会产生冲突。
基于DynamoDB中没有写冲突的事实(因为这些冲突必须从客户端重新调整,因此在API中公开),我们得出结论,DynamoDB正在使用尊重第二定律的Vw({ {1}}),可能只是Vw > V/2
来减少写入延迟。
现在关于读取仲裁,DynamoDB提供了2种不同的读取方式。如果我们像以前一样假设写V/2+1
,则强一致性读取使用符合第一定律(Vr + Vw > V
)的读取仲裁,可能只是V/2
。但是,最终一致的读取只能使用单个随机副本V/2+1
,因此速度要快得多,但保证一致性。
注意:使用的写入仲裁可能不符合第二定律(Vr = 1
),但这意味着DynamoDB会自动解决此类冲突(例如,根据当地时间选择最新的冲突) )没有客户的和解。但是,我认为这不可能是真的,因为DynamoDB文档中没有这样的参考。即使在那种情况下,其余的推理也保持不变。