核心是级联复制将主库fork压力从N次降至1次,需中继节点开启replica-serve-stale-data、显式配置announce地址,孙节点直连中继,并调大repl-backlog-size与启用repl-diskless-sync协同优化。

主库同步压力大,核心不是“从库太多”,而是每个直连从库触发一次独立 fork 生成 RDB 快照——这个操作拷贝的是内存页表,不是数据本身。6GB 内存 + 高碎片时,单次 fork 就可能卡住主线程 3~5 秒;5 个从库同时重连,等于主库连续 fork 5 次,CPU 和延迟直接崩。
用级联复制把 fork 压力转移出去
让部分从库不连主库,改连另一个从库(中继节点),形成“主 → 中继 → 孙节点”结构:
- 只有中继节点向主库发起全量同步,主库 fork 次数从 N 次降到 1 次
- 中继节点需开启 replica-serve-stale-data yes,否则拒绝服务读请求,无法当上游
- 中继节点必须显式配置 replica-announce-ip 和 replica-announce-port,否则孙节点连不上它(默认广播的是监听地址,不是可访问地址)
- 孙节点只需一行配置:SLAVEOF <中继IP> <中继端口>
调大复制积压缓冲区,避免频繁全量重同步
网络抖动或从库短暂断连后,如果 repl_backlog_buffer 不够大,就无法走 PSYNC 增量恢复,只能触发新一轮全量同步——又是一次 fork。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 建议根据业务写入量和从库恢复时间预估:比如每秒写入 2MB,断连最长容忍 30 秒,则至少设为 60MB
- 配置项:repl-backlog-size 128mb(单位支持 mb、gb)
- 注意:repl-backlog-ttl 控制缓冲区空闲多久后释放,设为 0 表示永不过期(推荐)
启用无磁盘复制,减少 I/O 等待但不替代级联
repl-diskless-sync yes 可跳过本地写 RDB 文件,直接通过 socket 流式发送快照,对磁盘 I/O 和传输耗时有明显改善。
- 但它不减少 fork 次数,页表拷贝开销仍在,不能解决主库 CPU 和延迟飙升的根本问题
- 搭配 repl-diskless-sync-delay 3(默认 5),让主库多等几秒,聚合更多等待中的从库一起传输,提升效率
- 适合带宽受限但内存尚可的场景,应与级联复制配合使用
其他实用控制点
这些操作不改架构,但能快速缓解压力:
- 限制直连主库的从库数量,超出部分全部走中继;生产环境建议主库直连从库 ≤ 3 个
- 确保所有从库配置 replica-read-only yes(默认值),防止误写导致数据混乱
- 监控 latest_fork_usec(INFO stats)和 rdb_bgsave_in_progress,及时发现 fork 异常
- 避免在高峰时段手动触发 BGSAVE 或让从库集中重连,可通过错峰配置 repl-timeout 和心跳间隔

















