Cassandra如何处理两个副本之间的不一致?

carvr3hs  于 2022-11-05  发布在  Cassandra
关注(0)|答案(2)|浏览(181)

我有一个简单的问题,关于 cassandra 在以下情况下选择的策略

方案

1.在T1,复制品1接收类似于name = amit, language = english的写入突变
1.在T1 + 1,副本2接收更新,如language = japanese where name = amit
假设,如果当记录的更新已经到来时写记录没有在复制品2上复制,则Cassandra如何处理该情形。
我的猜测-可能是复制品2将检查update消息的lamport时间戳,说它是102,并向复制品1询问小于102的任何记录,以便它(复制品2)可以首先执行它们,然后执行更新语句。
任何帮助都将不胜感激。

zmeyuzjn

zmeyuzjn1#

实际上(对于普通操作,而不是LWT)INSERT和UPDATE都是UPSERT--它们不依赖于先前的状态来执行数据更新。当你执行UPDATE时,Cassandra只是放入相应的值,而不检查相应的主键是否存在,仅此而已。即使前面的操作是在后面进行的,Cassandra也会检查“写时间”来解决冲突。
对于您的情况,它将如下所示:

  • 副本1接收写入,并将其重新传输到群集中的其他副本,包括副本2。如果副本2此时不可用,则将写入该突变作为提示,并在副本2启动时重放。
  • 复制品2可以接收新的更新,并且还将其重新发送到其他复制品。
bgibtngc

bgibtngc2#

协调器根据所使用的一致性级别(CL)处理不一致性。还有其他细微的行为也与读写请求的一致性级别有关。

案例A -写入失败

如果您得应用程序使用ONELOCAL_ONE得弱一致性进行写入,则协调器将(1)向客户端/驱动程序返回一个成功得写入响应,即使只有一个复制副本确认了该写入,并且(2)将为未响应得复制副本存储一个提示.
当复制品恢复在线时,协调器将(3)向复制品重放提示(重新发送写入/突变)以使其与其他复制品保持同步。
如果您的应用程序使用LOCAL_QUORUMQUORUM的强一致性进行写入,则当所需数量的副本已确认写入时,协调器将(4)向客户端/驱动程序返回成功的写入响应。如果任何副本未响应,则应用(2)中的相同提示存储和(3)中的提示重放。

用例B -使用弱CL读取

如果应用程序发出CL为ONELOCAL_ONE的读取请求,则协调器将只查询一个副本,并返回该副本的结果。
由于应用仅从一个副本请求数据,因此不会将该数据与任何其他副本进行比较。这就是我们建议使用强一致性级别(如LOCAL_QUORUM)的原因。

CASE C -使用强CL读取

对于CL为LOCAL_QUORUM的针对本地复制因子为3的密钥空间的读请求,协调器将(5)请求来自2个副本的数据。如果副本不匹配,则(6)具有最新时间戳的数据获胜,并且(7)触发读修复以修复不一致的副本。
如需详细信息,请参阅下列文件:

相关问题