Устранение обрывов репликации и бесконечного цикла полной ресинхронизации (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"Что делает
Показывает состояние связи, разницу смещений и счётчики частичной/полной синхронизации на мастере и реплике; увеличивает replication 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.