我有一个简单的问题,关于 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)可以首先执行它们,然后执行更新语句。
任何帮助都将不胜感激。
2条答案
按热度按时间zmeyuzjn1#
实际上(对于普通操作,而不是LWT)INSERT和UPDATE都是UPSERT--它们不依赖于先前的状态来执行数据更新。当你执行UPDATE时,Cassandra只是放入相应的值,而不检查相应的主键是否存在,仅此而已。即使前面的操作是在后面进行的,Cassandra也会检查“写时间”来解决冲突。
对于您的情况,它将如下所示:
bgibtngc2#
协调器根据所使用的一致性级别(CL)处理不一致性。还有其他细微的行为也与读写请求的一致性级别有关。
案例A -写入失败
如果您得应用程序使用
ONE
或LOCAL_ONE
得弱一致性进行写入,则协调器将(1)向客户端/驱动程序返回一个成功得写入响应,即使只有一个复制副本确认了该写入,并且(2)将为未响应得复制副本存储一个提示.当复制品恢复在线时,协调器将(3)向复制品重放提示(重新发送写入/突变)以使其与其他复制品保持同步。
如果您的应用程序使用
LOCAL_QUORUM
或QUORUM
的强一致性进行写入,则当所需数量的副本已确认写入时,协调器将(4)向客户端/驱动程序返回成功的写入响应。如果任何副本未响应,则应用(2)中的相同提示存储和(3)中的提示重放。用例B -使用弱CL读取
如果应用程序发出CL为
ONE
或LOCAL_ONE
的读取请求,则协调器将只查询一个副本,并返回该副本的结果。由于应用仅从一个副本请求数据,因此不会将该数据与任何其他副本进行比较。这就是我们建议使用强一致性级别(如
LOCAL_QUORUM
)的原因。CASE C -使用强CL读取
对于CL为
LOCAL_QUORUM
的针对本地复制因子为3的密钥空间的读请求,协调器将(5)请求来自2个副本的数据。如果副本不匹配,则(6)具有最新时间戳的数据获胜,并且(7)触发读修复以修复不一致的副本。如需详细信息,请参阅下列文件: