在分布式云机房或混合云网络环境中,内网交换机闪断可能导致哨兵(Sentinel)集群无法与 Master 通信,误认为主节点已死并选出新 Master,而旧 Master 仍有部分客户端在写入,这就是典型的“集群脑裂”,后续合并时会导致这部分写入数据彻底丢失。
一、脑裂场景复盘与丢单机理
旧 Master 与 Sentinel 断开、但与老客户端网络通畅。新从机晋升为新 Master。当网络恢复后,Sentinel 将老 Master 降级为 Slave,老 Master 会清空自身内存并执行全量同步,脑裂期间写入的数万笔交易订单数据随之灰飞烟灭。
二、生产核心防御参数配置
纳海川运维标准中强制要求在 `redis.conf` 配置双重约束:
# 至少要有 1 个 Slave 的同步复制延迟小于 10 秒
min-replicas-to-write 1
min-replicas-max-lag 10
当网络发生分区且主节点失去与从节点的同步连接超过 10 秒时,老主节点立刻拒绝外部写入请求(向客户端抛出 `READONLY You can't write against a read only replica` 异常),从而从物理层面截断脏数据写入。
三、客户端失败补偿降级
当客户端收到 Redis 只读拒绝异常时,应用服务自动将订单持久化至本地 SQLite 容灾队列或本地磁盘日志,待集群拓扑更新就绪后再行补发重试。
架构启示:真正的分布式高可用必须做最坏的设想,通过限制写入来保护数据的强一致性与可审计性。