repl-backlog-size过小会导致从节点重连时因offset被覆盖而触发全量同步;安全值应按峰值写入速率×最大断连时间×1.3~1.5计算,并需重启复制连接和持久化配置。

repl-backlog-size太小会直接触发全量同步
主节点的复制积压缓冲区(repl-backlog-buffer)是环形内存区,只保留最近的写命令字节流。一旦从节点断连重连,它会带上自己的 slave_repl_offset 向主节点请求增量数据;如果这个 offset 已被新写入覆盖(即超出 repl_backlog_size 范围),主节点只能返回 Partial resynchronization not possible (no cached master),接着启动 BGSAVE ——这就是全量同步的起点。
默认 repl-backlog-size 是 1MB,对任何真实业务都远远不够。哪怕每秒只写入 50KB,撑不过 20 秒就会覆盖旧 offset。一次 30 秒的网络抖动,就足以让所有从节点集体降级为全量同步。
- 不是“网络不稳定”本身导致问题,而是缓冲区没扛住写入洪峰期间的数据量
- 缓冲区填满后老数据被覆盖,offset 一旦丢失就永远无法找回
- 多个从节点时,必须按「最慢/最不稳定」的那个来规划,不能取平均值
怎么算出安全的 repl-backlog-size 值
核心公式: repl-backlog-size ≥ 峰值写入速率(字节/秒) × 最大可容忍断连时间(秒),再上浮 30%~50% 作为余量。
例如:监控显示过去一小时 instantaneous_ops_per_second 峰值为 8000,平均 SET 命令大小约 256 字节(含 key + value + 协议开销),则峰值写入速率为 8000 × 256 = 2,048,000 字节/秒 ≈ 2MB/s;历史日志里最长断连间隔为 92 秒,则最低需要 2MB × 92 ≈ 184MB,建议设为 256MB(即 268435456 字节)。
- 别依赖
INFO replication里的静态差值(如master_repl_offset - slave_repl_offset),那是快照,不是压力窗口 - 用
redis-cli --latency-history -i 1查网络毛刺持续时间分位值,95% 分位比平均值更有参考价值 - 写入速率要抓「突发峰值」,不是日常均值;可用
Prometheus + redis_exporter的redis_commands_total{cmd=~"set|lpush|hset|zadd"}求和后乘以平均响应体大小估算
CONFIG SET 后不生效?因为从节点没重建复制连接
CONFIG SET repl-backlog-size 268435456 立即生效,但只影响后续新建的复制连接。已存在的主从关系仍使用旧缓冲区,repl_backlog_histlen 不会变,repl_backlog_active 也不会扩容。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
必须让从节点主动断开并重连,才能触发新 backlog 初始化。操作步骤是:
- 在从节点执行
REPLICAOF no one(注意:若该从节点承担读流量,需提前切走) - 再执行
REPLICAOF <master_host><master_port></master_port></master_host> - 观察主节点
INFO replication中repl_backlog_histlen是否接近新设置值,且repl_backlog_active持续非零
这个过程会短暂中断从节点服务,且重连初期可能因同步压力升高 CPU 和带宽。线上务必错峰操作。
别忘了持久化配置,否则重启就回退
CONFIG SET 是运行时修改,Redis 重启后恢复默认值或配置文件中的旧值。必须同步更新 redis.conf:
- 手动编辑配置文件,添加或修改
repl-backlog-size 268435456 - 或执行
CONFIG REWRITE(前提是原配置由CONFIG SET修改过,且redis.conf可写) - 检查
CONFIG GET repl-backlog-size和redis.conf内容是否一致,避免遗漏
最容易被忽略的是:调大 repl-backlog-size 后,主节点 RSS 内存会上升固定额度(就是这个 buffer 占用的内存),且不计入 used_memory。如果机器内存紧张,得确认 used_memory_rss 加上这个 buffer 后不会触发 OOM。










