健康副本不足就拒写
最少副本数与最大延迟是一组写保护:当在线且确认延迟不超过阈值的从库少于要求数量时,主库直接拒绝写入。目的是避免主库在复制链断掉、自己成了孤岛时继续接收写入——那些写入一旦随主库故障消失,业务却以为已经落到了多处。
基本信息
| 设定项 | 最少副本数,默认 0 表示关闭保护 |
|---|---|
| 最大延迟 | 副本确认延迟上限,默认 10 秒 |
| 生效位置 | 配置在主库侧,从库上的设置无效 |
| 判定依据 | 从库周期性上报的复制确认及其时间间隔 |
| 拒绝报错 | NOREPLICAS,提示健康副本不足 |
典型使用场景
- 关键写入链路:宁可写失败也不接受没有副本承载的写入
- 计划维护:从库下线前先评估会不会触发保护,避免业务意外中断
- 网络分区兜底:主库与从库断链时停止写入,降低脑裂后两边都写的风险
- 作为额外保险:在哨兵或集群切换机制之外再加一道写入闸门
配置与验证
配置与验证
redis-cli CONFIG GET min-replicas-to-write min-replicas-max-lag # 查看当前阈值
redis-cli CONFIG SET min-replicas-to-write 1 # 至少 1 个健康从库
redis-cli CONFIG SET min-replicas-max-lag 10 # 从库延迟不超过 10 秒
redis-cli INFO replication | grep -E 'connected_slaves|lag' # 看健康副本数
redis-cli SET k v # 保护触发时返回副本不足错误
redis-cli CONFIG REWRITE # 固化到配置文件判定与行为
| 条件 | 判定结果 | 主库行为 |
|---|---|---|
| 健康从库数不足 | 数量小于设定阈值 | 写命令返回副本不足错误,读命令仍可用 |
| 某个从库延迟超标 | 距上次收到确认超过上限秒数 | 该从库不计入健康副本数 |
| 阈值设为 0 | 保护关闭 | 主库不再检查副本数量 |
| 从库恢复正常 | 确认恢复且延迟回到阈值内 | 写入自动恢复,无需人工干预 |
| 新从库刚建立复制 | 尚未开始上报确认 | 短时间内不计数,需容忍启动抖动 |
延迟判定用的是从库上报确认的时间间隔,粒度以秒计。上限设置得比正常抖动还小,会在链路轻微波动时误伤写入,建议先观察一段时间的延迟基线再定值。
需要更强的语义时,可以在关键写入后显式等待指定数量的副本确认(带超时)。写保护是常态闸门,单次等待是逐次约束,两者解决的不是同一个问题。
保护触发后的表现是业务写入全部失败,比数据静默丢失更显性,但仍会造成故障。必须配套明确的告警与人工处置流程,先判断是链路问题还是从库真的挂了,否则一次网络抖动会被放大成业务事故。