断线重连的缓冲带
repl-backlog 是主库维护的一块环形缓冲,用来保存最近一段复制流。从库短暂断线后重新连上时,如果它的偏移仍落在缓冲覆盖范围内,就只需要补发差量完成部分重同步,而不必做代价高昂的全量同步。容量由 repl-backlog-size 决定,默认 1MB;当所有从库都长期离线时,主库可以在 repl-backlog-ttl 指定的时间之后释放这块内存。
基本信息
| 容量参数 | repl-backlog-size,默认 1mb |
|---|---|
| 释放策略 | repl-backlog-ttl,默认 3600 秒 |
| 作用 | 决定断线重连能否走部分重同步 |
| 相关字段 | INFO replication 中的 backlog 相关项 |
| 内存代价 | 占用主库的常驻内存,与数据集共享预算 |
典型使用场景
- 网络抖动较多的环境放大容量,减少全量同步次数
- 从库维护窗口前估算需要覆盖多长的断线时间
- 排查「每次重连都触发全量同步」的问题
- 高写入实例评估缓冲大小对内存占用的影响
- 重建从库与主从切换流程中的参数核对
查询与调整
查询与调整
redis-cli CONFIG GET repl-backlog-size
redis-cli CONFIG GET repl-backlog-ttl
redis-cli CONFIG SET repl-backlog-size 64mb # 按速率与容忍时长估算
redis-cli INFO replication | grep -E 'repl_backlog|master_repl_offset'
redis-cli INFO stats | grep -E 'sync_full|sync_partial_ok|sync_partial_err' # 部分同步成效
redis-cli CONFIG REWRITE容量估算示例
| 输入项 | 示例值 | 说明 |
|---|---|---|
| 峰值写入速率 | 5MB/s | 决定每秒占用多少缓冲 |
| 可容忍断线时长 | 60 秒 | 业务可接受的最长同步中断 |
| 估算结果 | 至少 300MB | 速率乘以时长即最小容量 |
| 内存预算 | 主库可用内存 | 缓冲与数据集共享同一份内存 |
部分重同步是否有效可以从统计项看出来:全量同步次数持续增长而部分同步成功数不增长,说明缓冲覆盖不了实际的断线时长,需要放大容量或缩短故障处理时间。
缓冲只在主库侧维护,而从库反复全量同步的代价也主要落在主库:一次全量同步会触发一次 fork 并生成快照文件,还要把快照完整传输给从库,消耗的 CPU、内存、网络与磁盘资源都远超补发差量的部分重同步。
调整容量时建议同时记录一次真实的断线重连过程:观察部分重同步是否成功、耗时多长、主库指标是否平稳,用实测结果校准容量,比单纯按公式估算更可靠。