39

在尝试将 Dynamodb 用于其中一个项目时,我对 dynamodb 的强一致性模型有疑问。从常见问题解答

强一致性读取 — 除了最终一致性之外,Amazon DynamoDB 还为您提供灵活性和控制权,以在您的应用程序或应用程序元素需要时请求强一致性读取。强一致性读取返回的结果反映了在读取之前收到成功响应的所有写入。

从上面的定义,我得到的是强一致性读将返回最新的写值。

举个例子:假设 Client1 在 Key K1 上发出写入命令,将值从 V0 更新到 V1。几毫秒后,Client2 发出对 Key K1 的读取命令,然后在强一致性的情况下,将始终返回 V1,但在最终一致性的情况下,可能会返回 V1 或 V0。我的理解正确吗?

如果是,如果写操作返回成功,但数据没有更新到所有副本,我们发出强一致性读,这种情况下如何保证返回最新的写值?

以下链接 AWS DynamoDB 读后写一致性 - 它在理论上是如何工作的?试图解释这背后的架构,但不知道这是否是它的实际工作方式?浏览完这个链接后,我想到的下一个问题是:DynamoDb 是否基于单主多从架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他副本。

4

3 回答 3

44

简短回答:在强一致性模式下成功写入要求您的写入在可以包含该记录的大多数服务器上成功,因此任何未来的一致性读取将始终看到相同的数据,因为一致读取必须读取大多数可以包含该记录的服务器包含所需的记录。如果不执行强一致性读取,系统会随机向服务器请求记录,数据可能不会是最新的。

想象三台服务器。服务器 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

于 2014-02-13T10:45:38.073 回答
6

免责声明:以下内容无法根据公开的 DynamoDB 文档进行验证,但它们可能非常接近事实

从理论出发,DynamoDB 使用 quorums 其中 V 是副本节点的总数,Vr是读取操作要求的副本节点数,Vw 是执行每次写入的副本节点数。可以利用读取仲裁 ( Vr) 来确保客户端获取最新值,而Vw可以利用写入仲裁 ( ) 来确保写入不会产生冲突。

基于 DynamoDB 中不存在写入冲突的事实(因为这些必须与客户端协调,因此在 API 中公开),我们得出结论,DynamoDB 使用的是尊重第二定律 ( Vw > V/2) 的 Vw,可能只是V/2+1以减少写入延迟。

现在关于读取仲裁,DynamoDB 提供了 2 种不同类型的读取。强一致性读取使用尊重第一定律 ( Vr + Vw > V) 的读取仲裁,可能就像V/2我们假设V/2+1写入之前一样。但是,最终一致性读取只能使用单个随机副本Vr = 1,因此速度更快,但一致性为零。

注意:使用的写入仲裁有可能不遵守第二定律Vw > V/2(但是,我认为这不太可能是真的,因为 DynamoDB 文档中没有这样的参考。即使在这种情况下,其余的推理保持不变。

于 2017-09-21T17:49:00.603 回答
0

您可以在这里找到问题的答案:http: //docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html

当您发出高度一致的读取请求时,Amazon DynamoDB 会返回包含最新数据的响应,这些数据反映了 Amazon DynamoDB 向其返回成功响应的所有先前相关写入操作的更新。

在您的示例中,如果从 to 更新值的请求updateItem成功,则后续强一致性读取请求将返回。v0v1v1

希望这可以帮助。

于 2014-01-02T19:34:12.113 回答