master 설정 변경
vi redis.confbind 0.0.0.0
requirepass test123
masterauth test123
slave 설정 변경
vi redis.confbind 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"