복제 끊김과 끝없는 full resync 루프 해결 (backlog, replica buffer)
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"하는 일
master와 replica의 링크 상태, offset 차이, partial/full sync 카운터를 보여 준다. 짧은 끊김이 full sync로 바뀌지 않도록 replication backlog를 키우고, full sync가 중간에 끊기지 않도록 replica output buffer 한도를 키운다.
사용 시점
replica가 'MASTER <-> REPLICA sync started'에서 계속 반복될 때, sync_full 카운터가 증가할 때, 또는 master 로그에 'scheduled to be closed ASAP for overcoming of output buffer limits'가 나타날 때.
주의
full sync마다 master에서 fork + RDB 생성이 일어나므로 루프는 master 메모리와 디스크에 부담을 준다. repl-backlog-size는 master 메모리에서 할당된다. replica buffer 한도를 올리면 full sync 중 master가 그만큼 추가 메모리를 쓸 수 있으므로 maxmemory 계산에 포함한다. 변경을 영구화하려면 CONFIG REWRITE 또는 redis.conf가 필요하다.