假设我们有两个节点(没有分片的简单副本)即 N1、N2,复制因子为 2。我使用默认的读写一致性级别,即R
和W
1,这意味着它将从单个节点读取/写入单个节点
场景 1
- 考虑写入请求转到节点
N1
以更新记录R1
。说名字scott
更新为scott_update1
- 在它被复制到之前
N2
,N1
崩溃了 - 另一个写入请求转到节点
N2
以更新相同的记录R1
。现在scott
更新为scott_update2
- 现在
N1
回来时,名称scott_update1
会更新为scott_update2
吗?
场景 2
- 考虑写入请求转到节点
N1
以更新记录R1
。说名字scott
更新为scott_update1
- 在它被复制到之前
N2
,N1
崩溃了 - 读取请求转到节点
N2
以读取相同的记录R1
。它返回scott
- 现在
N1
回来时,名称scott_update1
会更新为scott
还是保留scott_update1
?
在这两种情况下,一切都取决于节点
N1
离线的时间,以及提示是否启用的位置......在场景 1 中,如果停机时间少于 3 小时(存储提示的默认窗口),那么
N1
离线时所做的更改将被重播,并且值将被更新为,scott_update2
因为该值具有更大的时间戳。如果停机时间大于此窗口 - 那么您需要运行修复。对于场景 2,有两件事 - 它可能在读取修复发生时最终被修复,或者您可以显式运行修复。
但谈到复制——写入通常同时发生在所有副本上,一致性级别指定需要回答多少节点才能认为请求成功,因此在大多数情况下 N2 也可以更新。