aof rewrite 期间主节点主线程被阻塞,新写命令仍需同步给从节点,导致复制缓冲区(slave output buffer)积压超限而断连。

调大 client-output-buffer-limit slave 是解决 AOF rewrite 期间主从断连、连接超时的直接有效手段,但必须配合 repl-timeout 和磁盘 I/O 状态一起看,否则只是掩盖症状。
为什么 AOF rewrite 会触发 client-output-buffer-limit 超限?
AOF rewrite 过程中,Redis 主节点一边在内存里重写 AOF 文件,一边仍要持续接收写命令。这些新命令必须同步给从节点——但此时主线程被 rewrite 占用(尤其是 fsync 阻塞或磁盘慢),复制缓冲区(即 slave 类型的 output buffer)无法及时清空。一旦积压超过 client-output-buffer-limit slave 设置的硬限或软限,主节点就强制断开从节点连接。
从节点发现断连后立即重试 SLAVEOF,又触发新一轮全量同步(bgsave + RDB 传输),进一步加剧主节点负载和缓冲区压力,形成“断-连-积-断”循环。
常见错误现象包括:
-
OOM command not allowed when used memory > 'maxmemory'报错频发,但used_memory_rss明显高于used_memory -
redis-cli info replication中master_sync_in_progress:1反复出现,slave_repl_offset停滞或跳变 - 日志中反复出现
Connection with slave x.x.x.x:6379 lost或Client id=xxx addr=x.x.x.x:6379 ... omem=256000000
如何安全调大 slave 缓冲区限制?
不能只改配置,得按场景分级处理:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 若从节点网络延迟高、带宽窄,或主节点写入 QPS 持续 > 5k,建议设为
client-output-buffer-limit slave 1024mb 256mb 120(硬限 1GB,软限 256MB 持续 120 秒) - 若主节点磁盘 I/O 已严重瓶颈(见
redis-cli info persistence中aof_last_write_status:err或日志频繁报Asynchronous AOF fsync is taking too long),则必须先优化磁盘,否则调大缓冲区只会延缓崩溃而非解决问题 - 极端情况可临时禁用限制:
CONFIG SET client-output-buffer-limit "slave 0 0 0",但需立刻跟进CONFIG REWRITE并监控client_longest_output_list是否持续 > 1000 - 务必同步检查
repl-timeout:它应 ≥ 软限持续时间的 2 倍(如软限是 120 秒,repl-timeout至少设为 240),否则从节点还没等缓冲区溢出就先因心跳超时断连了
client-output-buffer-limit pubsub 和 normal 的设置要不要动?
一般不用动。AOF rewrite 引发的连接超时几乎只影响 slave 类型客户端,因为只有主从同步是主节点单向、持续、不可暂停的数据推送流。
pubsub 客户端虽然也存在缓冲区堆积风险,但它的触发场景是订阅者消费慢(如消息处理逻辑卡顿),与 AOF rewrite 无直接关联;normal 客户端默认不限制(0 0 0),且其输出缓冲区只在命令响应瞬间存在,不会长期累积。
误调 pubsub 限值反而容易导致正常消息被截断或订阅者被踢,尤其在直播弹幕、实时通知等高吞吐场景下更危险。
真正容易被忽略的点:缓冲区不是内存泄漏,但释放有延迟
当一个从节点被断开,它的 output buffer 内存并不会立刻归还——Redis 在连接关闭后仍会保留该缓冲区最多 1 秒(由 client-output-buffer-limit 的 soft seconds 间接影响),等待可能的快速重连复用。这意味着你看到 used_memory_rss 突然飙升后回落缓慢,不是配置没生效,而是释放机制本身就有滞后性。
所以排查时别只盯 INFO memory,一定要用 CLIENT LIST 实时抓取具体连接的 omem 值,再结合 redis-cli --stat 观察每秒连接数波动,才能确认是真实堆积还是瞬时抖动。










