- 现象:A Set Key :A -> B,A -> C,B -> A, B -> C …
- 网络风暴
- 数据不一致
- 解决方案:同步数据携带一些来源信息,根据来源信息来决策是否同步给其他服务
- 现象: A set a v1 , B set a v2
- 会存在数据不一致的情况
1
2
3
4
5
6
7
8
9
1. v1 v1
2. v2 v2
3. v1 v2
4. v2 v1
- 解决方案:通过 LWW - Last-Writer-Wins , 通过时间 以最后写入时间为准
引申出:服务器 Clock 问题,时钟 – 分布式系统永远的痛
Linux 服务器依赖 NPT-Server 同步时间,但是服务器之间同步时间存在延时(时钟快慢)
Vector Clock (逻辑时钟)自定义向量来表示操作前后
现象:A set k1 v1, B del k1, 同步后便会出现不一致,LWW 方式 数据已经被删除便没办法比较
解决方案:Tombstone , 执行 Del 命令 伪删除,将数据放置到 Tombstone,让其他后续的命令,能够和之前的命令有一个对比。数据的存留与否也就有了判定的依据
现象 :因为使用了 Tombstone 导致一部分数据删除了,但是没有真正的移出内存
解决方案:GC 利用 VectorClock 实现 GC, 判断数据存活:1. 引用计算 ; 2. GC Root
- Key Expire 冲突?
- 现象:在双写的Redis 集群中,Key 是否要设置一致的过期时间?1. 设置一致 解决冲突成本很高; 2. 不一致,数据会不一致?不会,假死:A set key 30s ; B set key 60 s ,A 集群触发过期,同步给 B ,B 也就删除了