1. 什么是 Replication Backlog?
复制积压缓冲区(Replication Backlog)是主节点上的一个固定大小的循环缓冲区(circular buffer)。当主节点有从节点连接时,它会将写命令不仅发送给从节点,还会备份到这个 backlog 中。
2. 它的作用是什么?
它的核心作用是支持部分重同步(Partial Resynchronization)。
当从节点短暂断开连接(例如网络闪断、从节点重启)后又重新连接时,它需要追上主节点在这期间丢失的数据。从节点会将自己的复制偏移量(replication offset)发送给主节点:
如果主节点发现从节点缺失的数据仍然存在于 backlog 缓冲区中,就会直接将缓冲区里那部分数据发送给从节点。这个过程非常高效。
如果从节点断开时间太长,导致它需要的数据已经被新数据从循环缓冲区中覆盖掉了,那么主节点将不得不触发一次全量同步(Full Resynchronization),即生成一个 RDB 快照并发送,这会消耗大量的 CPU、内存和网络 I/O。
3. 为什么默认值(1MB)通常不够?
对于大多数生产环境来说,1MB 的默认值通常偏小。
网络稳定性:现代网络环境虽然稳定,但偶尔的抖动、故障转移是常态。
写流量:如果一个系统写操作(QPS)很高,1MB 的缓冲区可能几分钟甚至几秒钟就被新数据填满并覆盖了。
从节点维护:重启一个从节点进行维护(如升级)可能需要几分钟。如果 backlog 太小,重启完成后就需要全量同步,失去了增量同步的高效性。
4. 生产环境建议如何设置?
设置一个合适的 repl-backlog-size
是优化 Redis 主从复制性能的关键。
一个常见的经验法则是:
根据你的系统可能的最大断连时间和平均写流量来计算。
估算公式:repl-backlog-size = (平均写流量(字节/秒) * 最大可能断连时间(秒)) * 2
平均写流量:可以使用
INFO replication
命令中的master_repl_offset
变化来估算。例如,观察一分钟内它的增长量。最大可能断连时间:根据你的运维经验估算。例如,你预计从节点重启或网络修复最长需要 2 分钟。
乘以 2:为了提供一个安全余量,避免刚好写满。
举例:
假设你的系统平均每秒产生 50KB 的写数据,你希望即使从节点断开连接 5 分钟(300 秒)也能进行部分重同步。repl-backlog-size = (50 * 1024 * 300) * 2 ≈ 30.7 MB
在这种情况下,设置为 32mb
或 64mb
是一个比较合理和安全的选择。
配置方法:
在主节点的 redis.conf
文件中修改:
repl-backlog-size 64mb
修改后需要重启主节点或执行 CONFIG SET repl-backlog-size 64mb
使其生效。
总结
特性 | 说明 |
默认值 | 1mb |
作用 | 支持从节点断连重连后的部分同步,避免全量同步的开销。 |
过小的影响 | 从节点容易触发全量同步,增加主节点负载和恢复时间。 |
设置建议 | 生产环境务必调大。根据写流量和预期断连时间计算(如 |
配置位置 | 主节点的 |
0条评论
点击登录参与评论