Redis从节点OOM崩溃主因是主节点client-output-buffer-limit slave配置过小,导致断连重试循环堆积缓冲区内存;应设为“1024mb 256mb 120”并同步调大repl-backlog-size至1024mb,且需手动重启从节点使新配置生效。

从节点OOM崩溃不是内存不够,是缓冲区配置错
Redis从节点在复制过程中OOM崩溃,90%以上不是因为机器内存小,而是主节点的client-output-buffer-limit slave配置太紧,导致从节点接收RDB或命令积压时被强制断连,重试又触发新一轮同步,缓冲区内存反复堆积最终撑爆。此时INFO memory看到的used_memory_rss远高于used_memory,CLIENT LIST里大量flags=S连接的omem值持续飙高(常超500MB),日志刷出scheduled to be closed ASAP for overcoming of output buffer limits。
必须改主节点的slave缓冲区三参数
不能只调大从节点maxmemory,关键在主节点输出缓冲区控制逻辑。三个参数必须协同设置:
-
hardlimit:硬上限,超了立刻断连。生产建议设为1024mb(即1073741824字节),不建议设0(等于关闭保护) -
softlimit:软上限,比如256mb,允许短暂冲高 -
softseconds:软上限持续时间,比如120秒,给慢速从节点加载RDB留足窗口
立即生效命令:config set client-output-buffer-limit "slave 1073741824 268435456 120";配置文件写法:client-output-buffer-limit slave 1024mb 256mb 120。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
配套必须调大repl-backlog-size
只改缓冲区不够,repl-backlog-size太小会迫使断连后无法增量同步,直接退化全量——又掉进缓冲区雪崩循环。它和client-output-buffer-limit是一对搭档:
- 默认
1mb完全不够用,尤其写入峰值高、网络不稳定时 - 按「写入带宽 × 断连容忍时长」估算:例如峰值5MB/s、容忍2分钟,至少设
600mb,生产建议起步1024mb - 执行:
config set repl-backlog-size 1073741824,并同步写入redis.conf
改完配置后旧连接仍按老规则运行
Redis不会自动清理已有从节点连接的缓冲区状态。即使配置已生效,正在同步的从节点仍沿用旧限制,可能继续OOM。必须手动触发重连:
- 在从节点执行
REPLICAOF NO ONE再REPLICAOF <master_ip><master_port></master_port></master_ip> - 或直接重启从节点进程(更彻底)
- 确认重连后
CLIENT LIST中omem值回落、oll趋近于0
真正危险的是忽略这点:配置改了但没清旧连接,问题照旧,直到下一次RDB生成或网络抖动再次触发雪崩。

















