必须手动调大repl-backlog-size,1mb默认值在真实业务中完全不够,否则断连重连将大概率触发全量同步;合理值应按“平均写入速率(字节/秒)×最大断连时间(秒)”计算,并上浮30%~50%作为余量,同时需确保repl_backlog_active=1且repl-backlog-ttl略大于断连容忍时间。

repl-backlog-size 必须手动调大,1MB 默认值在任何真实业务中都不够用,否则从节点断连重连大概率触发全量同步。
怎么算出合理的 repl-backlog-size 值
核心不是拍脑袋,而是按写入压力和断连容忍时间推算:
- 先确认主节点平均写入速率(字节/秒):用
INFO replication查instantaneous_ops_per_second,再乘以典型命令平均大小(比如 200B),或直接看net_input_bytes每秒增量 - 确定你允许从节点最长断连多久(秒):比如网络抖动、滚动重启、运维窗口,常见设为 60~300 秒
- 套公式:
repl-backlog-size ≥ 写入速率 × 断连时间,结果再上浮 30%~50% 作为安全余量 - 示例:写入 1.5MB/s,容忍断连 120 秒 → 至少需要 1.5 × 1024 × 1024 × 120 ≈ 188MB,建议设为 256MB(即
268435456)
CONFIG SET repl-backlog-size 为什么没生效
不是配置错了,而是缓冲区根本没被激活:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 执行
INFO replication,检查repl_backlog_active是否为1;如果是0,说明缓冲区压根没分配 -
repl-backlog只在至少有一个从节点成功完成过一次同步后才会初始化——哪怕现在断开了也行 - 如果主节点长期没从节点,
CONFIG SET后内存不会涨,因为 Redis 不预分配空缓冲区 - 临时解法:起一个测试从节点连上来,等
repl_backlog_active变1后再断开,此时新repl-backlog-size才真正载入
别只调 repl-backlog-size,还得配 repl-backlog-ttl
缓冲区不是永久存在的,ttl 控制它“死后”还能活多久:
-
repl-backlog-ttl默认 3600 秒(1 小时),指最后一个从节点断开后,缓冲区保留时间 - 如果设得太短(比如 60 秒),而你的从节点恢复时间常超过这个值,照样因 offset 找不到而全量同步
- 建议设为略大于你最长预期断连时间,比如断连容忍是 120 秒,
repl-backlog-ttl至少设 180 秒 - 注意:这个值不影响缓冲区大小,只影响它是否还“在线”
真正容易被忽略的点是:repl-backlog 是环形缓冲区,只按字节累积、不按时间保留;一旦写满,老数据就被覆盖,offset 丢失不可逆。所以不是“调大就万事大吉”,得结合实际写入节奏和网络稳定性反复验证。










