repl-timeout 应设为网络RTT的P99.5值或master_last_io_seconds_ago的P95值加2–3秒,通常建议30–90秒;需同步调大client-output-buffer-limit slave的时间阈值,并开启tcp-keepalive、匹配repl-ping-replica-period。

repl-timeout 设置多少才不算盲目调大
云环境里主从断连,十次有八次不是 Redis 本身出问题,而是网络抖动——比如宿主机迁移、安全组策略刷新、VPC 路由收敛延迟。这时候 repl-timeout 就成了第一道缓冲阀。但它不是越大越好:repl-timeout 超过 60 秒,从节点会主动断开复制连接并尝试重连,而重连过程可能触发全量同步(SYNC),尤其在大实例上,带宽和 fork 开销都不可忽视。
实操建议:
- 先用
redis-cli -h 主节点 -p 端口 info replication查看当前master_last_io_seconds_ago,这个值反映主从最近一次通信延迟,取它 P95 的观测值再加 2–3 秒,就是较合理的repl-timeout下限 - 云厂商若提供“网络延迟监控”(如阿里云 VPC 流量镜像、AWS CloudWatch NetworkPackets),直接抓取主从部署所在可用区之间的 RTT 分布,把 P99.5 值作为基准
- 避免设成 120 或 300:这会让短暂抖动被掩盖,但真正发生主节点宕机时,从节点无法及时感知故障,影响 failover 判断
调整后必须同步检查 client-output-buffer-limit slave
repl-timeout 加长了等待窗口,但没解决数据积压问题。如果主节点在抖动期间持续写入,而从节点卡在等待响应,积压的复制缓冲区(output buffer)可能爆掉,触发 OOM command not allowed when used memory > 'maxmemory' 或直接断连。
所以调 repl-timeout 必须配平 client-output-buffer-limit slave:
- 默认值
client-output-buffer-limit slave 256mb 64mb 60表示:缓冲区超 256MB 或连续 60 秒超过 64MB 就断连 - 若将
repl-timeout设为 90 秒,建议至少把第三个参数(时间阈值)同步提到 90+,否则缓冲区还没等到心跳恢复就被强制清理 - 内存宽松的场景可放宽到
512mb 128mb 120,但要注意:该缓冲区是主节点内存占用,不计入maxmemory统计,容易被监控遗漏
云环境特有的心跳干扰项:TCP keepalive 和中间件劫持
即使 repl-timeout 和缓冲区都调得合理,某些云环境仍会悄无声息地 kill 掉“空闲连接”。这不是 Redis 的错,而是:
- 云平台 NAT 网关或 SLB 默认 60–300 秒 TCP 连接空闲超时,且不转发 TCP keepalive 包
- 部分安全组/ACL 策略只放行初始 SYN,后续保活包被丢弃
- 容器平台(如 Kubernetes Service)对 long-lived connection 的连接池管理异常
验证方式:在从节点执行 redis-cli -h 主节点 info clients,观察 connected_clients 正常但 client_longest_output_list 持续增长,同时 netstat -tn | grep :6379 显示连接状态为 ESTABLISHED 却无实际流量 —— 这大概率是中间链路静默中断。
应对措施:
- 在 Redis 配置中显式开启
tcp-keepalive 60(单位秒),让内核每 60 秒发一个 keepalive 探针 - 确认云平台控制台中对应负载均衡/NAT 网关的“空闲连接超时”设置 ≥
repl-timeout + 30 - K8s 场景下,避免使用 ClusterIP Service 做主从通信,改用 Headless Service 或 hostNetwork
别忘了从节点自身的 repl-ping-replica-period
主节点靠 repl-timeout 判定从节点是否失联,但从节点也会主动 ping 主节点,默认每 10 秒一次(repl-ping-replica-period)。这个周期如果远小于 repl-timeout,会导致大量无效 ping 在抖动期间堆积;如果过大,则主节点已断连,从节点却迟迟不触发重试。
建议保持二者节奏匹配:
- 当
repl-timeout设为 90 秒时,repl-ping-replica-period可设为 25–30 秒(即 3–4 个 ping 周期覆盖 timeout 窗口) - 切勿设成 1 秒:高频 ping 会增加主节点 event loop 压力,尤其在百节点规模集群中,易引发
latency spikes - 该参数热修改有效:
CONFIG SET repl-ping-replica-period 30,无需重启
网络抖动从来不是单点参数能兜住的事。repl-timeout 是开关,但背后连着 TCP 栈、云网络策略、缓冲区水位、心跳节奏——调一个,漏三个,复制链路照样断。











