Redis原生主从不支持跨地域容灾,因异步复制导致高延迟与数据丢失;所谓多活方案均需外部组件或替换引擎(如KeyDB、DragonflyDB、TiKV),且切换必须人工确认并校验数据一致性。
直接用原生 SLAVEOF 或 replicaof 配置一个远端从库,只是“连得上”,不是“可接管”。主从复制异步、无状态承诺、不感知网络分区——跨地域(如北京 ⇄ 新加坡)下 master_repl_offset 和 slave_repl_offset 差值常达数万,滞后数秒到数十秒。主库断电瞬间未同步的命令永久丢失,从库仍会响应读请求(slave-serve-stale-data yes 默认开启),返回陈旧数据。
所谓“Active-Active增强版插件”,在 Redis 官方生态中并不存在。Redis 6.0+ 的 redis-cli --cluster、redis-sentinel、redis-server --cluster-enabled yes 均不提供多主写入或自动冲突解决能力。任何宣称“开箱即用 Redis 多活”的第三方插件,大概率是封装了外部协调层(如基于 Kafka 的变更日志重放)或替换了底层存储引擎(如 KeyDB、DragonflyDB)。
KeyDB 是 Redis 的多线程 fork,其 Active Replication 功能依赖 MVCC 和全局事务 ID(opid),需所有节点启用 multi-master yes 并配置双向 replicaof。它不是 Redis 的动态加载模块,不能通过 MODULE LOAD 加载进标准 Redis 进程。
keydb-server,而非 redis-server
repl-timeout 60、增大 repl-backlog-size 至 2GB+,否则频繁全量同步INFO replication,而是 INFO keydb 中的 active_replication_status 和 conflict_count
原生 Redis 协议层没有分布式共识机制,强行做双向复制必然面临脑裂与数据覆盖风险。可行路径只有三条,且都放弃“纯 Redis”假设:
RedisGears 订阅 __keyevent@0__:*,将写操作序列化为结构化事件,发往 Kafka;异地消费者按 opid 顺序重放,配合本地幂等表去重DragonflyDB(兼容 Redis 协议),启用其 --replication-mode=multi-master,它在协议栈内嵌 Raft 日志同步,RPO 可压至毫秒级TiKV + RedisShake:TiKV 提供强一致多副本,RedisShake 实时捕获源 Redis AOF,转换为 TiKV 的 MVCC 写入;异地 TiKV 集群间走 Raft 同步所有方案都要额外部署组件、改造客户端路由、增加链路延迟(通常 +15~40ms),但换来的是可验证的一致性窗口,而不是“看起来在同步”的幻觉。
哪怕用了 KeyDB 或 DragonflyDB,跨地域故障时也不能直接执行 SLAVEOF NO ONE 或 CLUSTER FAILOVER。真实场景中,网络闪断、BGP 路由抖动、运营商丢包都会触发误判。
必须先做三件事:
redis-cli -h <slave> info replication | grep "master_link_status|lag"</slave> 确认从库已断连超 5 分钟,且 master_link_status:down
redis-cli --rdb dump.rdb 导出从库 RDB,运行 redis-check-rdb dump.rdb 验证完整性,再比对 redis-cli -h <slave> info server | grep "used_memory_human|redis_version"</slave> 与主库历史快照是否匹配LLEN queue:pending 是否归零)跨地域容灾最易被忽略的点,从来不是“怎么同步”,而是“怎么证明此刻能切”。所有自动化脚本只该做通知和锁止,最终决策权必须留在人手上——因为机器无法区分“主库挂了”和“我们暂时看不见它了”。