【问题标题】:Cassandra write consistency level ALL clarificationCassandra写一致性级别ALL说明
【发布时间】:2018-08-16 03:59:25
【问题描述】:
根据Datastaxdocumentation for Cassandra:
“如果协调器无法写入足够多的副本来满足请求的一致性级别,它会抛出一个不可用的异常并且不执行任何写入。”
这是否意味着在写入过程中,写入更新的数据将不可用于读取请求?我的意思是可能有 4/5 个节点已成功向协调器发送了 SUCCESS,这意味着它们的数据已更新。但是第五个还没有写。现在如果有一个读请求进入到这 4 个节点之一,它仍然会显示旧数据,直到协调器收到来自第 5 个节点的确认并将新数据标记为有效?
【问题讨论】:
标签:
database
cassandra
nosql
cassandra-2.0
cap-theorem
【解决方案1】:
如果协调器在尝试写入之前知道它不可能实现一致性,那么它将在执行写入之前立即使请求失败。 (这在给出的报价中有所描述)
但是,如果协调器在尝试时认为有足够的节点来达到其配置的一致性级别,它将开始将其数据发送给其对等方。如果其中一个节点没有返回成功,则请求将失败,您将进入失败的节点拥有旧数据而通过的节点拥有新数据的状态。
如果有读请求进来,它会显示它在它到达的节点上找到的数据,无论它是旧的还是新的。
让我们以你的例子来演示。
如果您有 5 个节点并且您有 3 个复制。这意味着这 5 个节点中的 3 个将具有您发送的写入。但是,三个节点之一向协调器返回了故障。现在,如果您阅读一致性级别 ALL。您将读取所有三个节点并始终获得新的写入(总是最新的时间戳)。
但是,如果您使用一致性级别 ONE 阅读,则有 1/3 的机会获得旧值。