Use*_*890 28 consistency eventual-consistency amazon-web-services amazon-dynamodb
为了将Dynamodb用于其中一个项目,我对dynamodb的强一致性模型存在疑问.来自常见问题解答
强大的一致性读取 - 除了最终的一致性之外,如果您的应用程序或应用程序的一个元素需要,Amazon DynamoDB还可以为您提供灵活性和控制权,以请求强一致性读取.强一致性读取返回一个结果,该结果反映了在读取之前收到成功响应的所有写入.
从上面的定义,我得到的是强一致读取将返回最新的写入值.
举个例子:假设Client1在Key K1上发出一个写命令,将值从V0更新为V1.在几毫秒之后,Client2发出Key K1的读命令,然后在强一致性的情况下,将始终返回V1,但是在最终一致性的情况下,可以返回V1或V0.我的理解是否正确?
如果是,如果写入操作返回成功但数据未更新到所有副本并且我们发出强一致性读取怎么办?如何确保在这种情况下返回最新写入值?
以下链接 AWS DynamoDB在写入一致性后读取 - 它在理论上如何工作?试图解释这背后的架构,但不知道这是否真的有效?通过此链接后我想到的下一个问题是:DynamoDb是基于单主机,多从机架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他.
fab*_*pro 31
简短回答:在强一致模式下成功写入要求您的写入在大多数可以包含记录的服务器上成功,因此任何未来的一致读取将始终看到相同的数据,因为一致的读取必须读取大多数可以读取的服务器包含所需的记录.如果您不执行强一致性读取,系统将询问随机服务器以获取记录,并且数据可能不是最新的.
想象一下三台服务器.服务器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
小智 17
您可以在这里找到问题的答案:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html
当您发出强一致性读取请求时,Amazon DynamoDB 返回包含最新数据的响应,该数据反映了 Amazon DynamoDB 返回成功响应的所有先前相关写入操作的更新。
在您的示例中,如果将updateItem值更新为 的请求v0成功v1,则后续的强一致性读取请求将返回v1。
希望这可以帮助。
Kir*_*irk 12
是的,强一致性读取是最新的,但仅限于从基表或本地二级索引读取时。强一致性读取始终来自数据所在分区的领导节点。为了更好地理解这一点,您必须了解 DynamoDB 中的写入工作原理。当您写入一个项目时,为了让客户端获得 200 OK ack,写入必须转到该分区的领导节点和一个跟随者(副本)。如果没有发生这种情况,您将不会收到 200 OK 回复。因此,如果您请求强一致性读取,则该读取来自该分区的领导者。在这种情况下,它很可能也被写入分区中的第三个节点,但这并不是返回给客户端的确认所必需的。
如果您请求最终一致读取(默认),则读取可以来自该分区的三个节点中的任何一个。您有 2/3 的机会在分区中获取具有该项目的最新版本的节点,并且假设第三个节点(可能已经发生)上尚未发生写入。
如果您正在从全球二级索引 (GSI) 中读取数据,那么截至撰写本文时,这些读取结果始终是一致的。
如需了解更多信息,我推荐Jaso Sorenson 2018 年的 re:Invent 演讲。
免责声明:我是 DynamoDB 团队的前成员。
免责声明:以下内容无法根据公开的 DynamoDB 文档进行验证,但它们可能非常接近事实
从理论出发,DynamoDB利用的法定人数,其中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 会自动解决此类冲突(例如,通过根据本地时间选择最新的冲突),而无需客户端协调。但是,我认为这不太可能是真的,因为 DynamoDB 文档中没有这样的参考。即使在这种情况下,其余的推理保持不变。
| 归档时间: |
|
| 查看次数: |
24024 次 |
| 最近记录: |