亚马逊-DynamoDB强大的一致性阅读,他们是最新的和如何



在尝试将Dynamodb用于其中一个项目时,我对Dynamodb的强一致性模型表示怀疑。来自常见问题

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

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

举个例子:假设Client1在密钥K1上发出写入命令,将值从V0更新为V1。在几毫秒之后,Client2发出针对密钥K1的读取命令,那么在强一致性的情况下,总是返回V1,然而在最终一致性的情形下,可以返回V1或V0。我的理解正确吗?

如果是,如果写操作返回成功,但数据没有更新到所有副本,并且我们发出了强一致的读取,那么在这种情况下,它将如何确保返回最新的写值呢?

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

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

想象一下有三台服务器。服务器1、服务器2和服务器3。要写一个强一致性的记录,您至少要选择两个服务器,然后写入数据。让我们选1和2。

现在,您需要一致地读取数据。选择大多数服务器。假设我们选择了2和3。

服务器2有新的数据,这就是系统返回的数据。

最终一致的读取可能来自服务器1、2或3。这意味着,如果服务器3是随机选择的,则在复制发生之前,您的新写入将不会出现。

如果一台服务器出现故障,您的数据仍然是安全的,但如果三分之二的服务器发生故障,则在恢复脱机服务器之前,您的新写入可能会丢失。

更多解释:DynamoDB(假设它与亚马逊发布的Dynamo论文中描述的数据库相似)使用环形拓扑,数据分布在许多服务器上。强大的一致性是有保证的,因为您可以直接查询所有相关服务器并从中获取当前数据。拳击场上没有主人,也没有奴隶。给定的记录将映射到环中多个相同的主机,所有这些服务器都将包含该记录。没有一个奴隶会落后,也没有一个主人会失败。

请随意阅读有关该主题的众多论文中的任何一篇。类似的数据库ApacheCassandra也可以使用环复制。

http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynam.pdf

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

当您发出强一致的读取请求时,AmazonDynamoDB会返回一个包含最新数据的响应,该数据反映了AmazonDynamo DB成功返回响应的所有先前相关写入操作的更新。

在您的示例中,如果将值从v0更新为v1updateItem请求成功,则随后的强一致读取请求将返回v1

希望这能有所帮助。

是的,强一致性读取是最新的,但仅当您从基表或本地辅助索引读取时。强一致性读取总是来自数据所来自的分区的leader节点。为了更好地理解这一点,您必须了解写操作在DynamoDB中是如何工作的。写入项目时,为了让客户端获得200 OK ack,写入必须转到该分区的leader节点和一个follower(副本)。如果没有发生这种情况,你就不会得到200 OK。因此,如果您请求强一致性读取,则该读取来自该分区的leader。在这种情况下,它很可能也被写入分区中的第三个节点,但这对于返回到客户端的确认是不需要的。

如果您请求最终一致的读取(默认值),那么读取可以来自该分区的三个节点中的任何一个。您有2/3的机会在分区中获得一个节点,该节点具有该项的最新版本,并且假设第三个节点上还没有发生写入,这可能已经发生了。

如果你正在阅读全球二级指数(GSI),那么在撰写本文时,这些读数最终总是一致的。

欲了解更多信息,我推荐Jaso Sorenson 2018年的re:Invent演讲。

免责声明:我是迪纳摩队的前队员。

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

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

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

现在关于读取quorum,DynamoDB提供了两种不同类型的读取。强一致性读取使用尊重第一定律(Vr + Vw > V)的读取仲裁,如果我们像以前一样假设V/2+1用于写入,则可能只有V/2。然而,最终一致的读取只能使用单个随机副本Vr = 1,因此速度更快,但对一致性没有任何保证。

注意:使用的写入法定人数可能不符合第二定律(Vw > V/2),但这意味着DynamoDB会自动解决此类冲突(例如,根据当地时间选择最新的冲突),而无需客户端进行协调。但是,我认为这不太可能是真的,因为DynamoDB文档中没有这样的参考。即使在这种情况下,其余的推理仍然不变。

相关内容

最新更新