0

根据Cassandra 的 Datastax 文档

“如果协调器无法写入足够多的副本来满足请求的一致性级别,它会抛出一个不可用的异常并且不执行任何写入。”

这是否意味着在写入过程中,写入更新的数据将不可用于读取请求?我的意思是可能有 4/5 个节点已成功向协调器发送了 SUCCESS,这意味着它们的数据已更新。但是第五个还没有写。现在,如果一个读取请求进入并转到这 4 个节点之一,它仍然会显示旧数据,直到协调器收到来自第 5 个节点的确认并将新数据标记为有效?

4

1 回答 1

2

如果协调器在尝试写入之前知道它不可能实现一致性,那么它将在执行写入之前立即使请求失败。(这在给出的报价中有所描述)

但是,如果协调器认为在尝试时有足够的节点来达到其配置的一致性级别,它将开始将其数据发送给其对等方。如果其中一个节点没有返回成功,则请求将失败,您将进入失败的节点拥有旧数据而通过的节点拥有新数据的状态。

如果有读取请求进来,它将显示它在它到达的节点上找到的数据,无论它是旧的还是新的。

让我们以你的例子来证明。

如果您有 5 个节点并且有 3 个复制。这意味着这 5 个节点中的 3 个将具有您发送的写入。但是,三个节点之一向协调器返回了故障。现在,如果您阅读一致性级别 ALL。您将读取所有三个节点,并将始终获得新的写入(总是最新的时间戳)。

但是,如果您使用一致性级别 ONE 阅读,则有 1/3 的机会获得旧值。

于 2018-08-16T07:08:56.650 回答