修复复制中断和无休止的全量重同步循环(backlog、副本缓冲区)
Redis复制命令
INFO replication
# Master: connected_slaves, slaveN:...,state=online,offset=,lag= Replica: master_link_status, master_last_io_seconds_ago, master_sync_in_progress
INFO stats
# sync_full / sync_partial_ok / sync_partial_err: repeated full syncs = backlog too small
CONFIG GET repl-backlog-size
CONFIG SET repl-backlog-size 256mb
# If the replica buffer exceeds its limit during a full sync, the link drops and sync starts over:
CONFIG GET client-output-buffer-limit
CONFIG SET client-output-buffer-limit "replica 1gb 512mb 120"作用
显示主节点和副本上的链路状态、偏移量差异以及部分/全量同步计数器;增大复制 backlog,使短暂断连不会变成全量同步,并增大副本输出缓冲区限制,使全量同步不会中途被切断。
适用场景
副本不断循环出现 'MASTER <-> REPLICA sync started'、sync_full 计数器增长,或主节点日志显示 'scheduled to be closed ASAP for overcoming of output buffer limits' 时。
注意
每次全量同步都意味着主节点上的一次 fork + RDB 生成;循环会给主节点的内存和磁盘带来压力。repl-backlog-size 从主节点内存中分配。提高副本缓冲区限制意味着全量同步期间主节点可能额外使用这么多内存;请将其计入 maxmemory 计算。需要 CONFIG REWRITE 或 redis.conf 才能持久化更改。