使用 DynamoDB,两个独立的客户端尝试同时写入同一个项目,使用条件写入,并尝试更改条件引用的值。显然,这些写入之一注定会因条件检查而失败;没关系。
假设在写入操作期间发生了一些不好的事情,并且某些 DynamoDB 节点出现故障或彼此失去连接。我的写操作会发生什么?
它们会同时阻塞还是失败(牺牲 CAP 定理中的“A”)?他们会不会看起来都成功了,但后来才发现其中一个实际上被忽略了(牺牲了“C”)?或者,由于 DynamoDB 系统中发生的一些魔法(一致的哈希?),它们会以某种方式正常工作吗?
这似乎是一个非常困难的问题,但我找不到任何讨论条件写入可用性问题的可能性的内容(与一致性读取不同,一致性读取的可用性降低的可能性是明确的)。
这方面缺乏明确的信息,但我们可以做出一些相当有力的推论。许多人认为 DynamoDB 实现了其前身“Dynamo”的所有想法,但事实似乎并非如此,重要的是要在头脑中将两者分开。亚马逊在发电机纸 http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html。在思考这些问题时,如果您熟悉基于 Dynamo 思想的分布式数据库,例如 Riak 和 Cassandra,也会很有帮助。尤其,阿帕奇卡桑德拉 http://cassandra.apache.org/它提供了有关 CAP 的全方位权衡。
通过比较明显分布在 Cassandra 中可用选项的 DynamoDB,我想我们可以看到它在 CAP 空间中的位置。根据 Amazon 的说法,“DynamoDB 维护每个项目的多个副本以确保持久性。当您收到对写入请求的“操作成功”响应时,DynamoDB 会确保写入在多个服务器上持久。但是,传播更新需要时间到所有副本。” (数据读取和一致性注意事项 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html)。此外,DynamoDB 不要求应用程序像 Dynamo 那样解决冲突。假设他们希望提供尽可能多的可用性,因为他们说他们正在写入多个服务器,所以 DyanmoDB 中的写入相当于 CassandraQUORUM
等级。另外,DynamoDB 似乎不支持暗示切换 http://wiki.apache.org/cassandra/HintedHandoff,因为这可能会导致需要解决冲突的情况。为了获得最大可用性,不一致的读取只需相当于 Cassandra 的读取ONE
等级。但是,要在给定仲裁写入的情况下获得一致的读取,需要QUORUM
级别读取(遵循 R + W > N 以保持一致性)。有关 Cassandra 级别的更多信息,请参阅关于 Cassandra 中的数据一致性 http://www.datastax.com/docs/1.1/dml/data_consistency.
综上所述,我的结论是:
- 写入是“Quorum”,因此行复制到的大多数节点必须可用才能成功写入
- 不一致读取为“One”,因此只需具有该行的单个节点可用,但返回的数据可能已过时
- 一致性读取是“Quorum”,因此行复制到的大多数节点必须可用才能使读取成功
因此写入与一致读取具有相同的可用性。
为了具体解决有关两个同时条件写入的问题,一个或两个都会失败,具体取决于有多少节点已关闭。但是,永远不会出现不一致的情况。我认为写入的可用性实际上与它们是否有条件无关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)