全量同步超时中断主因是bgsave卡顿、输出缓冲区溢出或从节点接收慢,需同步调优repl-timeout(建议300秒)、client-output-buffer-limit slave(如"1024mb 512mb 120")和repl-backlog-size(≤512MB),并排查系统级阻塞。

全量同步超时中断,根本不是网络带宽或磁盘慢的问题,而是主节点在 bgsave 过程中卡住、输出缓冲区溢出,或从节点接收不及时,导致连接被 repl-timeout 主动掐断。调优必须同时盯住三处:主节点生成 RDB 的稳定性、主节点发数据的缓冲能力、从节点收数据的吞吐节奏。
repl-timeout 设置过短会直接中断全量同步
默认 repl-timeout 60 在全量同步期间形同虚设——主节点执行 bgsave fork 子进程时,如果内存大(比如 50GB+),fork 可能卡住几秒甚至十几秒;子进程写 RDB 到磁盘又耗时几十秒;再加上网络传输几百 MB 的 RDB 文件,整个过程轻松突破 60 秒。一旦超时,主节点日志出现 MASTER aborted replication with an error: ERR timeout,从节点立刻重连,重新触发全量,陷入死循环。
- 高压场景下建议设为
repl-timeout 300(5 分钟),给bgsave+ 传输留出安全窗口 - 这个值不能无限制拉长:若实际同步总耗时稳定超过 300 秒,说明底层存在真实瓶颈(如磁盘 I/O 拖累
rdb_last_bgsave_time_sec过长),得查INFO persistence - 改完务必执行
CONFIG REWRITE,否则重启后失效
client-output-buffer-limit slave 不够大会强制断连
全量同步时,主节点一边生成 RDB,一边还要把 RDB 数据塞进每个从节点的输出缓冲区。这个缓冲区由 client-output-buffer-limit slave 控制,默认是 256mb 64mb 60(硬限 256MB,软限 64MB 持续 60 秒就断)。一旦 RDB 文件 >256MB 或传输速率太快撑爆缓冲区,主节点会静默断开从节点连接,日志里只显示 Connection with master lost,没有明确错误提示。
- 立即生效命令:
CONFIG SET client-output-buffer-limit "slave 1024mb 512mb 120" - 数值要按最大 RDB 文件大小 × 1.5 来预估,比如你最大 RDB 是 600MB,那就至少设 1024MB
- 注意:这个参数和
repl-backlog-size是两套缓冲区,别混淆;前者管“发 RDB”,后者管“发增量命令”
repl-backlog-size 和 bgsave 并发竞争内存
很多人以为调大 repl-backlog-size 就能保增量同步,但忽略了它和 bgsave 共享同一块内存资源。主节点在做全量同步时,仍会持续写入新命令到 repl-backlog,如果 backlog 太大(比如设了 2GB),加上 bgsave fork 的内存拷贝,可能瞬间触发 OOM Killer 杀 Redis 进程。
- 生产环境推荐
repl-backlog-size控制在 512MB 以内,优先保障bgsave稳定性 - 如果你真需要更大的 backlog(比如容忍 10 分钟断连),必须同步调高系统
vm.overcommit_memory=1,并监控used_memory_peak是否逼近物理内存 - 别迷信“越大越好”:环形缓冲区会覆盖旧数据,关键是覆盖前能否撑过抖动窗口,而不是堆内存
从节点接收慢也会反向拖垮主节点
全量同步不是主节点单方面“推”,而是 TCP 流式传输,从节点接收太慢(比如 CPU 打满、磁盘写满、内核 net.core.rmem_max 太小),会导致主节点 TCP 发送缓冲区堆积,最终触发 client-output-buffer-limit 断连。
- 检查从节点
INFO replication中的master_sync_in_progress和master_sync_left_bytes,看是否长期卡在某个值不动 - 确认从节点所在机器的
vm.swappiness=1、禁用transparent_hugepage,避免加载 RDB 时被 swap 拖慢 - 不要忽略 SELinux 或防火墙:某些环境下,从节点的
bind配置没放开本地回环,或防火墙只放行了客户端端口(6379),没放通复制端口(也是 6379,但走的是不同 socket 路径)
真正卡住的地方,往往不在 Redis 配置本身,而在于 bgsave 与 client-output-buffer-limit 之间的内存博弈,以及从节点加载 RDB 时的系统级阻塞。这些细节不打日志、不报错,但会让全量同步反复失败。











