【问题标题】:Amazon - DynamoDB Strong consistent reads, Are they latest and how?亚马逊 - DynamoDB 强一致性读取,它们是最新的吗?如何?
【发布时间】:2014-01-19 03:20:17
【问题描述】:

在尝试将 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 是否基于单主多从架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他副本。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb consistency eventual-consistency


    【解决方案1】:

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

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

    【讨论】:

    • 您描述的架构是 Dynamo 论文的架构,而不是 DynamoDB。虽然它们具有相同的名称,但不清楚是否使用相同的架构。
    • 同一个客户端,比如发出写入操作并在之后读取的 C1,能否面临读取不一致?
    【解决方案2】:

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

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

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

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

    注意:使用的写入仲裁有可能不遵守第二定律 (Vw > V/2),但这意味着 DynamoDB 会自动解决此类冲突(例如,通过根据本地时间选择最新的冲突)而无需与客户。但是,我认为这不太可能是真的,因为 DynamoDB 文档中没有这样的参考。即使在这种情况下,其余的推理保持不变。

    【讨论】:

      【解决方案3】:

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

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

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

      希望这会有所帮助。

      【讨论】:

      • 感谢斯瓦米的回答。我的理解有些相同,但想确认一下。架构内部的任何内部都是如何做到的?
      • @User23890 基本概念是,当您写入密钥时,它将存储在多个副本上。一旦写入在一定数量的副本上成功,则调用返回成功,但某些副本可能已过期,直到它们被赶上。如果您阅读密钥,则有可能会在一段时间内获得过时的值,因此是“最终一致性”。通过从所有副本读取值并选择大多数节点上存在的值,您可以立即获得一致的读取。
      • 嗨 Kevan,您的评论:“您可以通过读取所有副本的值并选择大多数节点上存在的值来立即获得一致的读取。” - 所以想象 3 个服务器 s1,s2,s3 - 并且 k1=v1 存在于所有这些服务器上,然后 (1) s1 宕机,(2) 客户端发出写入更新 k1=v2 的写入,该更新在 s2 和 s3 上成功,然后 ( 3)s2下降s1上升,然后client从s1读取:k1=v1,s2:k1=v2
      • 这不能回答问题。 OP已经将此解释为他的理解。请对此进行改进。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2016-10-17
      相关资源
      最近更新 更多