redis_m / redis_s 두 대의 redis 서버를 준비한 후 replication 설정한 내용입니다.

master 설정 변경

vi redis.conf

bind 0.0.0.0
requirepass test123
masterauth test123

slave 설정 변경

vi redis.conf

bind 0.0.0.0
replicaof 172.17.0.3 6379
requirepass test123
masterauth test123

replication 관련 설정

  • replicaof 172.17.0.3 6379
    => 복사해올 master의 IP PORT , async replication

  • masterauth foobared
    => slave node 에서 설정하는 것으로 master node 의 패스워드

  • replica-read-only yes
    => slave read_only 설정

  • repl-diskless-sync no
    => master => slave full resyncronization을 수행할 때 master 는 RDB dump 를 생성하여 slave로 전송하고
    slave 는 RDB dump를 메모리로 load 하여 sync를 맞추게 됨
    diskleass sync yes 는 네트워크 성능은 좋으나 disk 성능이 좋지 않을 때를 위한 옵션으로 RDB dump를 디스크에 생성 후 slave 로 전송하는 게 아니라 직접 소켓으로 전송함

  • repl-diskless-sync-delay 5

  • repl-ping-replica-period
    => slave 는 repl-ping-replica-period 간격으로 master에게 ping 을 보냄

  • repl-timeout 60
    => master <-> slave 간 연결이 끊겼다고 인식하는 시간.
    master는 1초마다 replconf command를 slave 로 보내는데 ack 가 repl-timeout 동안 오지않으면 slave 연결을 해제하고 정보를 지움
    slave는 repl-ping-replica-period 간격으로 master 에게 ping을 보내는데 ack 가 repl-timeout 동안 오지않으면 master와 연결이 끊긴 것으로 인식함
127.0.0.1:6001> info replication
# Replication
role:slave
master_host:172.17.0.3
master_port:6001
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:3329
master_link_down_since_seconds:5
  • repl-backlog-size 1mb
    => slave 와 연결이 끊어졌을 때 master 의 데이터를 repl-backlog-buffer에 저장했다가 slave가 정상으로 인식되면 backlog-buffer의 데이터를 slave에 sync 시킴.
    master 의 데이터가 backlog-buffer 크기보다 작아서 backlog-buffer 로만 sync 하는 방식을 partial resynchronization이라고 하며 backlog-buffer 보다 master의 데이터가 큰 경우에는 full sync를 하게됨

  • repl-backlog-ttl 3600
    => 설정값 내에 연결이 끊어진 slave node 가 정상으로 올라오지 않는 경우 해당 slave node 를 위한 backlog 파일 삭제, 0 : 삭제안함

  • replica-priority 100
    => slave 가 여러대인 상황에서 master 가 down 되는 경우 master 로 승격되는 우선 순위, 0이면 slave node가 단 하나가 아닌 이상 master로 승격 안됨.

  • min-replicas-to-write 0 (default 기능 비활성)
    => 복제 성공한 slave가 설정값 보다 작으면 master 는 write 명령 수행 불가
127.0.0.1:6001> set repl_test "test"
(error) NOREPLICAS Not enough good replicas to write.
  • min-replicas-max-lag 10
    => 복제가 설정값 시간 내에 성공해야 함. master가 slave로 1초마다 보내는 replconf ack 로 확인하는데
    복제 실패 시 min_slaves_good_slaves 가 줄어듬
127.0.0.1:6001> info replication
# Replication
role:master
connected_slaves:1
min_slaves_good_slaves:1   <======
slave0:ip=172.17.0.4,port=6001,state=online,offset=357,lag=0

replication 확인

  • M / S redis 기동

  • master log (나중에 수정한 내용이라 수행 시간대는 다르나 내용은 동일합니다)
39:M 30 Nov 2019 04:29:03.487 * Replica 172.17.0.4:6001 asks for synchronization
39:M 30 Nov 2019 04:29:03.487 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for 'b72ca0f0f59fb399aed279a8adc78b38f266d7e3', my replication IDs are 'e4067cd14f8d810f685f5630f4f66bd1d61051d2' and '0000000000000000000000000000000000000000')
39:M 30 Nov 2019 04:29:03.487 * Starting BGSAVE for SYNC with target: disk
39:M 30 Nov 2019 04:29:03.488 * Background saving started by pid 46
46:C 30 Nov 2019 04:29:03.494 * DB saved on disk
46:C 30 Nov 2019 04:29:03.495 * RDB: 0 MB of memory used by copy-on-write
39:M 30 Nov 2019 04:29:03.586 * Background saving terminated with success
39:M 30 Nov 2019 04:29:03.586 * Synchronization with replica 172.17.0.4:6001 succeeded
  • replica로 부터 동기화를 받고 master_replid를 비교하는데 아직 둘 다 master 인 상태이므로 서로 replid가 다름 => repl-backlog-buffer를 통한 부분 동기화 불가
  • replica 를 전체 동기화 하기 위해 rdb dump file을 생성함
  • replica 서버로 rdb dumpfile 전송

  • slave log
38:S 24 Nov 2019 07:58:49.979 # Server initialized
38:S 24 Nov 2019 07:58:49.979 * DB loaded from disk: 0.000 seconds
38:S 24 Nov 2019 07:58:49.979 * Ready to accept connections
38:S 24 Nov 2019 07:58:49.979 * Connecting to MASTER 172.17.0.3:6001
38:S 24 Nov 2019 07:58:49.980 * MASTER <-> REPLICA sync started
38:S 24 Nov 2019 07:58:49.980 * Non blocking connect for SYNC fired the event.
38:S 24 Nov 2019 07:58:49.980 * Master replied to PING, replication can continue...
38:S 24 Nov 2019 07:58:49.982 * Partial resynchronization not possible (no cached master)
38:S 24 Nov 2019 07:58:49.984 * Full resync from master: 50dd3a815e739404d415f8d4a398896cf3c15d29:0
38:S 24 Nov 2019 07:58:49.999 * MASTER <-> REPLICA sync: receiving 186 bytes from master
38:S 24 Nov 2019 07:58:49.999 * MASTER <-> REPLICA sync: Flushing old data
38:S 24 Nov 2019 07:58:49.999 * MASTER <-> REPLICA sync: Loading DB in memory
38:S 24 Nov 2019 07:58:49.999 * MASTER <-> REPLICA sync: Finished with success
  • MASTER - info replication
127.0.0.1:6001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.4,port=6001,state=online,offset=560,lag=1
master_replid:50dd3a815e739404d415f8d4a398896cf3c15d29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:560
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:560

127.0.0.1:6001> set replication_test "ok"
OK
  • SLAVE - info replication
127.0.0.1:6001> info replication
# Replication
role:slave
master_host:172.17.0.3
master_port:6001
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:252
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:50dd3a815e739404d415f8d4a398896cf3c15d29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:252
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:252

127.0.0.1:6001> set replication_test "hi"
(error) READONLY You can't write against a read only replica.
127.0.0.1:6001> get replication_test
"ok"