全量重同步为什么会形成风暴
从库与主库断开后重连时,若无法增量续传就会触发全量重同步:主库 fork 生成快照并把整份数据传给从库。多个从库同时上线意味着多份快照与多路传输叠加,主库的内存峰值、磁盘 IO 与网络带宽会被同时占满。缓解手段集中在三点:避免快照落盘、用延迟窗口合并多路同步请求、把从库上线时间错峰。
基本信息
| 适用平台 | Redis 4.0+ 支持无盘同步,7.0 起默认开启 |
|---|---|
| 相关参数 | repl-diskless-sync、repl-diskless-sync-delay、repl-diskless-load |
| 触发条件 | 首次同步或增量续传失败 |
| 观察指标 | INFO replication 的 sync_full 与 sync_partial_err |
| 常见诱因 | backlog 太小、网络闪断、从库长时间离线 |
典型使用场景
- 批量扩容从库:多台新副本需要同时初始化
- 机房迁移:新环境搭建副本期间与旧集群并行运行
- 网络抖动后大量从库同时重连
- 从库长时间离线后重新加入
- 故障恢复:快速拉起替换节点的副本
配置与观察
配置与观察
CONFIG GET repl-diskless-sync
CONFIG GET repl-diskless-sync-delay
CONFIG GET repl-backlog-size
# 观察全量同步与增量同步的失败次数
INFO replication | grep -E 'sync_full|sync_partial_ok|sync_partial_err'
# 查看从库列表与状态
INFO replication | head -20
# 从库批量上线要错峰,避免同时触发多份快照
# for r in r1 r2 r3; do sync_replica $r; sleep 300; done参数与影响
| 参数 | 作用 | 设置建议 |
|---|---|---|
| repl-diskless-sync | 直接通过 socket 传快照,不落盘 | 磁盘慢或空间紧张时开启 |
| repl-diskless-sync-delay | 等待窗口,合并多路同步请求 | 默认几秒,短窗口可接受即可 |
| repl-diskless-load | 从库侧无盘加载方式 | 需评估从库内存余量 |
| repl-backlog-size | 增量复制缓冲区大小 | 偏小会导致频繁全量同步 |
| client-output-buffer-limit replica | 从库输出缓冲上限 | 过小会断开同步,过大有内存风险 |
全量同步是必要但不便宜的机制:与其优化它的速度,不如减少它发生的次数——合理设置 backlog、保持网络稳定、避免从库长时间离线。
同时挂载多个从库:主库需要为每路同步分别 fork 与传输,内存与带宽被同时打满,可能反过来影响在线请求。