Cassandra如何处理两副本间的数据不一致?特定写入冲突场景疑问
Cassandra 异步写入冲突场景的处理逻辑
场景回顾
- T1时刻:副本1收到写入请求:
name = amit, language = english(对应Lamport时间戳为T1) - T1+1时刻:副本2收到更新请求:
language = japanese where name = amit(对应时间戳为T1+1),此时副本2未同步到副本1的初始写入
实际处理流程
Cassandra不会像你猜测的那样主动向其他副本请求旧数据,而是基于**最后写入胜出(LWW)**机制和异步同步组件处理:
- 副本2直接处理更新写入:
副本2会直接写入这条时间戳为T1+1的更新记录,无需等待前置的初始写入同步。此时副本2本地仅存有name=amit的language=japanese条目(时间戳T1+1)。 - 异步同步补全数据:
- Hinted Handoff(提示移交):如果副本1在执行初始写入时,发现副本2不可达,会生成一条"写入提示"暂存。当副本2恢复可达后,副本1会把这条初始写入推送给它。此时副本2会收到时间戳T1的初始写入,但因为T1 < T1+1,读取时会自动忽略旧版本,仅返回时间戳更大的
japanese值。 - Read Repair(读取修复):当客户端发起读取
name=amit的请求时,会查询所有副本,发现副本1有T1的记录、副本2有T1+1的记录,此时会自动将最新版本同步到所有副本,确保全局数据最终一致。
- Hinted Handoff(提示移交):如果副本1在执行初始写入时,发现副本2不可达,会生成一条"写入提示"暂存。当副本2恢复可达后,副本1会把这条初始写入推送给它。此时副本2会收到时间戳T1的初始写入,但因为T1 < T1+1,读取时会自动忽略旧版本,仅返回时间戳更大的
对猜测的纠正
Cassandra的设计是无协调者的分布式写入模型,每个副本独立处理写入请求,不会主动检查时间戳并向其他副本拉取旧数据。一致性依赖后续的异步同步机制和读取时的修复逻辑来保证最终一致。
内容的提问来源于stack exchange,提问作者voila
相关产品推荐
相关产品推荐

