全量同步卡顿需分三阶段定位:主节点rdb生成(查bgsave_in_progress、cpu及bigkey)、rdb传输(看master_sync_left_bytes下降速度及repl-backlog配置)、从节点加载(避aof重写冲突、用ssd、禁save)。

怎么看全量同步卡在哪一步?用监控+日志交叉验证
全量同步慢不是“感觉慢”,而是三个环节中至少一个明显拖后腿:主节点生成RDB、RDB文件传输、从节点加载RDB。不拆开看,容易误判是网络问题,实际是主库CPU被bgsave压垮了。
实操建议:
- 在主节点执行
redis-cli --stat,观察bgsave_in_progress是否长期为1,同时used_cpu_sys和used_cpu_user是否飙升——说明RDB生成阶段已成瓶颈 - 在从节点查看
INFO replication输出中的master_sync_in_progress:1持续时间,再对比master_sync_left_bytes下降速度:如果字节数下降极慢,大概率是网络或主节点发送卡住 - 启用
slowlog并设阈值为100ms(CONFIG SET slowlog-log-slower-than 100000),重点抓bgrewriteaof、bgsave、replconf类命令是否频繁超时
主节点RDB生成慢:别只怪fork,先查内存和大key
很多人以为bgsave慢=机器配置低,其实更常见的是Redis实例内存过大(>10GB)+ 存在bigkey,导致fork子进程耗时暴涨,主线程被阻塞,复制缓冲区replication buffer迅速积压,最终触发全量重试。
实操建议:
- 用
redis-cli --bigkeys扫描,重点关注hash/zset中元素数超5000或单value >1MB的key;这类key会显著拉长bgsave的内存页拷贝时间 - 避免在高峰时段手动触发
SAVE或BGSAVE,它们会直接加剧主线程压力;改用CONFIG SET save ""临时禁用RDB自动保存,仅靠AOF保障数据安全(需评估业务容忍度) - 确认是否启用了THP(Transparent Huge Pages):
cat /sys/kernel/mm/transparent_hugepage/enabled,若显示[always],必须关掉——它会让fork时的写时复制单位从4KB变成2MB,延迟翻倍
网络传输卡顿:不是带宽不够,而是缓冲区配置失配
跨机房同步时,即使带宽有1Gbps,repl-backlog-size设太小也会导致增量同步失败,反复退化为全量同步;而client-output-buffer-limit slave设太紧,又会让主节点在RDB传输中途就断开从节点连接。
实操建议:
- 按公式粗略估算
repl-backlog-size:假设主库写QPS为5000,平均命令大小200B,预期容忍断连120秒 → 至少需要5000 × 200 × 120 = 120MB;生产环境建议直接设为1024mb(环形缓冲,不怕设大) -
client-output-buffer-limit slave不能只看内存上限,更要关注512mb 60这类“60秒内累计超512MB即断连”的软限制;高写入场景下应调为1024mb 512mb 60,避免RDB传输未完成就被踢 - 禁用
repl-diskless-sync no(默认),改用repl-diskless-sync yes+repl-diskless-sync-delay 5,让主节点跳过落盘RDB文件,直接通过socket把RDB流式发给从节点,减少磁盘IO和临时文件开销
从节点加载慢:别急着加CPU,先看磁盘和AOF重写冲突
从节点收到RDB后,并非“解压完就完事”。它要清空本地数据、加载RDB、再回放repl_backlog里的增量命令——这三个步骤都可能被阻塞,尤其是当从节点同时开启AOF且正在做bgrewriteaof时,磁盘I/O竞争会导致加载停滞数分钟。
实操建议:
- 检查从节点
INFO persistence中aof_rewrite_in_progress:1是否与loading:1共存;若是,立刻CONFIG SET auto-aof-rewrite-percentage 0临时禁用AOF重写 - 确保从节点使用SSD,且
vm.swappiness设为0(避免内存交换到慢速磁盘);加载RDB是纯顺序IO,机械盘极易成为瓶颈 - 从节点不要开启
save配置项(如save 900 1),防止加载RDB中途触发自动快照,引发二次bgsave竞争
真正卡住全量同步的,往往不是单一环节,而是RDB生成慢 → 复制缓冲区溢出 → 增量同步失败 → 触发新一轮全量 → 循环恶化。所以排查时必须按时间线串起来看:主节点bgsave起止时间、RDB传输开始/结束时间、从节点loading_start_time/loading_end_time,缺一不可。









