唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

Redis (各种中间件)跨机房双写存在的问题

  1. 复制回环

  • 现象:A Set Key :A -> B,A -> C,B -> A, B -> C …
  • 网络风暴
  • 数据不一致
  • 解决方案:同步数据携带一些来源信息,根据来源信息来决策是否同步给其他服务
  1. Set Key 冲突

  • 现象: 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 (逻辑时钟)自定义向量来表示操作前后

  1. 删除下数据不一致

  • 现象:A set k1 v1, B del k1, 同步后便会出现不一致,LWW 方式 数据已经被删除便没办法比较

  • 解决方案:Tombstone , 执行 Del 命令 伪删除,将数据放置到 Tombstone,让其他后续的命令,能够和之前的命令有一个对比。数据的存留与否也就有了判定的依据

  1. 内存占用 GC

  • 现象 :因为使用了 Tombstone 导致一部分数据删除了,但是没有真正的移出内存

  • 解决方案:GC 利用 VectorClock 实现 GC, 判断数据存活:1. 引用计算 ; 2. GC Root

  1. Key Expire 冲突?
  • 现象:在双写的Redis 集群中,Key 是否要设置一致的过期时间?1. 设置一致 解决冲突成本很高; 2. 不一致,数据会不一致?不会,假死:A set key 30s ; B set key 60 s ,A 集群触发过期,同步给 B ,B 也就删除了