Redis主从同步中,repl-timeout过短导致中断和死循环重启。应适当延长该值,并同步调整client-output-buffer-limit、从节点心跳周期及tcp-keepalive参数。注意云服务可能屏蔽configset命令,需在控制台配置。
先说一个核心结论:repl-timeout设得太短,是主从同步中断并引发死循环重启的罪魁祸首。这不只是“可以考虑优化”的事,而是必须调、必须认真调。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
repl-timeout 设置过短是主从同步中断并触发死循环重启的直接诱因,不是“可以考虑”,而是必须调。
Redis 6.0+ 默认 repl-timeout 是 60 秒,乍一看够用,但只要网络延迟稍微高一点、大 key 同步频繁一点、或者主库负载一上来,这个值就彻底撑不住了。一旦从节点在那60秒内没有收到主节点发来的心跳(REPLCONF ACK),主节点二话不说就把连接断开——从节点重连后发现位点丢了,只能发起全量同步。可全量同步本身又可能超时,结果就是“断开 → 全量 → 再超时 → 再断开”的死循环,重启多少次都白搭。
Connection with sla ve xxx lost, waiting for it to reconnect,紧接着一堆 Failed to bind to port 6379(实际是重连风暴把端口队列堵死了)redis-cli config get repl-timeout,如果返回 60,同时网络 RTT 超过 15ms,就已经站在风险区边缘了repl-timeout 只管主节点等从节点心跳的时间,跟客户端 timeout、client-output-buffer-limit 根本不是一回事,别搞混很多人习惯性加到120秒或180秒,觉得“翻倍总够了吧”——但实际测试下来,还是可能失败。关键在于要盯住你最差的同步场景来算。推荐按这个逻辑走:
repl-backlog-size 设了1GB,bgsa ve加传输大概要3~5分钟,那 repl-timeout 最低也要设为300秒config set repl-timeout 600 热生效,不用重启maxclients 耗尽,更麻烦延长了 repl-timeout,如果从节点卡住不干活,主节点的输出缓冲区(client-output-buffer-limit sla ve)就会一直堆积数据,直到撑爆,强制断连,前面的调整全白费。
config set client-output-buffer-limit "sla ve 1024mb 512mb 60"(硬限1GB,软限512MB持续60秒)repl-timeout,否则缓冲区在超时前就会爆掉redis-cli config get client-output-buffer-limit,确认返回值里能看到 sla ve 对应的配置就算 repl-timeout 和缓冲区都调了,死循环依然可能卷土重来——问题往往出在下面三个容易被忽略的地方:
config set 命令,你在命令行改了根本没生效,得去控制台配置页操作repl-ping-replica-period 默认10秒,如果它发心跳的频率太低,主节点等不到 ACK 照样断连;建议同步改成30秒tcp-keepalive 默认是0,内核可能提前把空闲连接回收掉;设成300秒能有效保活这三个参数不联动调整,repl-timeout 的延长就成了纸面功夫,遇到真实场景照样崩。调一次,把全套补齐,才能彻底摆脱断连→重启的死循环。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述