cluster_design
Redis CLUSTER Design
레디스 클러스터 교육 |
레디스 정기점검/기술지원 Redis Technical Support |
레디스 엔터프라이즈 서버 Redis Enterprise Server |
---|
CLUSTER Design
레디스 클러스터 설계하는 다양한 경우(Case)를 레디스 클러스터 명령을 사용해서 구성한다.
레디스 클러스터를 redis-cli --cluster (4.x 이하에서는 redis-trib.rb)를 사용하지 않고, 클러스터 명령을 직접 사용해서 다양한 구성을 해본다.
redis-cli는 3 노드 이상이어야 하는 제한이 있고, 노드 구성을 마음대로 할 수 없는 단점이 있다.
클러스터 명령을 직접 사용해서 클러스터를 구성하는 것이 어려운 것처럼 보이지만,
3 개 명령만 알면 클러스터를 마음대로 쉽게 구성할 수 있다.
실습 중 제대로 되지 않거나, 결과가 다르거나, 의문 사항이 있으면 댓글을 달아 주시기 바랍니다.
이 문서는 버전 3.2.0을 기준으로 만들었습니다.
테스트 준비
- 각 포트별로 working directory 만들기
- redis.conf 파일 수정하기: 원 redis.conf 파일을 각 작업 디렉토리에 복사하고 다음 내용을 수정한다. 포트가 들어간 부분은 각 포트에 맞게 수정한다.
- 각 경우(Case) 테스트 후에는 다음 테스트를 위해서 각 working directory에 nodes.conf, appendonly.aof, dump.rdb 파일을 삭제한다.
port 7000
dir "/root/redis-3.2.0/7000"
cluster-config-file nodes.conf
클러스터 구성
- Case 1: Master 1
- Case 2: Master 1 - Slave 1
- Case 3: Master 1 - Slave 1 - Slave 1
- Case 4: Master 2
- Case 5: Master 2 - Slave 2
- Case 6: Master 3 - Slave 3
- 주의 사항
클러스터 확장
- Case 1: Master 1 -> Master 2
- Case 2: Master 1 -> Master 1 - Slave 1
- Case 3: Master 1 -> Master 1 - Slave 1 - Slave 1
- Case 4: Master 2 - Slave 2 -> Master 3 - Slave 3
클러스터 축소
클러스터로 전환
클러스터 구성
Case 1: Master 1 목차로 가기
마스터 1대로 클러스터를 구성한다.
조회되는 정보는 필요한 것만 표시했다.
입력하는 내용(Typing)은 굵은 글씨로 표시했다.
- 서버 시작과 내용 확인
- 클러스터 구성: 1대로 구성하므로 cluster meet 명령은 필요없다. 바로 슬롯을 할당한다. redis-cli에서 슬롯을 추가하려면 슬롯 하나씩 일일이 해야 한다. 여기서는 shell의 기능을 이용해서 한 번에 추가한다. 1. cluster addslots
- 데이터 입력과 확인
[redis-3.2.0]# src/redis-cli -p 7000
127.0.0.1:7000> info Replication
# Replication
role:master
127.0.0.1:7000> info cluster
# Cluster
cluster_enabled:1
127.0.0.1:7000> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_known_nodes:1
cluster_size:0
127.0.0.1:7000> cluster nodes
7c06ed76265f2c8fa4f5a17110e707d4200387eb :7000 myself,master - 0 0 0 connected
OK
[redis-3.2.0]# src/redis-cli -c -p 7000
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:1
cluster_size:1
127.0.0.1:7000> cluster nodes
7c06ed76265f2c8fa4f5a17110e707d4200387eb :7000 myself,master - 0 0 0 connected 0-16383
[redis-3.2.0]# src/redis-cli -c -p 7000
127.0.0.1:7000> dbsize
(integer) 100
Case 2: Master 1 - Slave 1 목차로 가기
마스터 1대와 복제 1대로 클러스터를 구성한다.
- 서버 시작과 내용 확인
- 클러스터 구성: 2대로 구성하므로 이제부터 cluster meet 명령을 사용해야 하고, 복제를 구성하므로 replicate 명령을 사용해야 한다. 1. cluster meet
- 데이터 입력과 확인
- 꼭 필요한 명령만 모으면
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-cli -p 7001
127.0.0.1:7001> cluster nodes
a0bcfe4d170e6825898bdcd0d310da0723c2bc2a :7001 myself,master - 0 0 0 connected
2. cluster replicate ---» replicaof(slaveof) 명령은 standalone 모드에서만 사용한다.
3. cluster addslots
OK
127.0.0.1:7001> cluster nodes
b4ba8719b121756dc2f3a467962afbab6cfefe4c 127.0.0.1:7000 master - 0 1466670623919 0 connected
a0bcfe4d170e6825898bdcd0d310da0723c2bc2a 127.0.0.1:7001 myself,master - 0 0 1 connected
127.0.0.1:7001> cluster replicate b4ba8719b121756dc2f3a467962afbab6cfefe4c
OK
127.0.0.1:7001> cluster nodes
b4ba8719b121756dc2f3a467962afbab6cfefe4c 127.0.0.1:7000 master - 0 1466670737134 0 connected
a0bcfe4d170e6825898bdcd0d310da0723c2bc2a 127.0.0.1:7001 myself,slave b4ba8719b121756dc2f3a467962afbab6cfefe4c 0 0 1 connected
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
OK
[redis-3.2.0]# src/redis-cli -p 7000
127.0.0.1:7000> dbsize
(integer) 100
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:2
cluster_size:1
127.0.0.1:7000> cluster nodes
b4ba8719b121756dc2f3a467962afbab6cfefe4c 127.0.0.1:7000 myself,master - 0 0 0 connected 0-16383
a0bcfe4d170e6825898bdcd0d310da0723c2bc2a 127.0.0.1:7001 slave b4ba8719b121756dc2f3a467962afbab6cfefe4c 0 1466670857439 1 connected
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-cli -p 7001 cluster meet 127.0.0.1 7000
[redis-3.2.0]# src/redis-cli -p 7001 cluster replicate b4ba8719b121756dc2f3a467962afbab6cfefe4c
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
Case 3: Master 1 - Slave 1 - Slave 1 목차로 가기
마스터 1대와 복제 1대, 복제의 복제 1대, 총 3대로 클러스터를 구성한다.
- 서버 시작과 내용 확인
- 클러스터 구성: 마지막 복제이 될 노드에서 부터 cluster replicate 명령을 수행한다. 1. cluster meet
- 데이터 입력과 확인
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-server 7002/redis.conf
2. cluster replicate
3. cluster addslots
127.0.0.1:7002> cluster meet 127.0.0.1 7000
OK
127.0.0.1:7002> cluster meet 127.0.0.1 7001
OK
127.0.0.1:7002> cluster nodes
88d8655613a882cb8d8e42182e5a98a15b9d8527 127.0.0.1:7000 master - 0 1466672988899 1 connected
b22417fd7d6eb55c5323b2a57dc1a0c795416832 127.0.0.1:7002 myself,master - 0 0 0 connected
0e6b271119e1eb11cebd81496723f4f5ce42d53f 127.0.0.1:7001 master - 0 1466672989400 2 connected
127.0.0.1:7002> cluster replicate 0e6b271119e1eb11cebd81496723f4f5ce42d53f
OK
127.0.0.1:7002> cluster nodes
88d8655613a882cb8d8e42182e5a98a15b9d8527 127.0.0.1:7000 master - 0 1466673014044 1 connected
b22417fd7d6eb55c5323b2a57dc1a0c795416832 127.0.0.1:7002 myself,slave 0e6b271119e1eb11cebd81496723f4f5ce42d53f 0 0 0 connected
0e6b271119e1eb11cebd81496723f4f5ce42d53f 127.0.0.1:7001 master - 0 1466673014445 2 connected
127.0.0.1:7002> exit
[redis-3.2.0]# src/redis-cli -p 7001
127.0.0.1:7001> cluster replicate 88d8655613a882cb8d8e42182e5a98a15b9d8527
OK
127.0.0.1:7001> exit
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
OK
[redis-3.2.0]# src/redis-cli -p 7000
127.0.0.1:7000> dbsize
(integer) 100
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:3
cluster_size:1
Case 4: Master 2 목차로 가기
마스터 2대로 클러스터를 구성한다.
- 서버 시작과 내용 확인
- 클러스터 구성: 복제 노드는 없다. 1. cluster meet
- 데이터 입력과 확인
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
c5c7d42440d2a4a2b0f06f519875e07cdf411202 :7001 myself,master - 0 0 0 connected
2. cluster addslots
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
c5c7d42440d2a4a2b0f06f519875e07cdf411202 127.0.0.1:7001 myself,master - 0 0 0 connected
a8dae027e0636afea75a1291cf0ac8b2c7f88190 127.0.0.1:7000 master - 0 1466699570427 1 connected
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..8191}
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {8192..16383}
OK
[redis-3.2.0]# src/redis-cli -p 7000 cluster slots
1) 1) (integer) 8192
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7001
3) "c5c7d42440d2a4a2b0f06f519875e07cdf411202"
2) 1) (integer) 0
2) (integer) 8191
3) 1) "127.0.0.1"
2) (integer) 7000
3) "a8dae027e0636afea75a1291cf0ac8b2c7f88190"
OK
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 51
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 49
Case 5: Master 2 - Slave 2 목차로 가기
마스터 2대, 복제 2대로 클러스터를 구성한다.
- 서버 시작과 내용 확인
- 클러스터 구성 1. cluster meet
- 데이터 입력과 확인
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-server 7002/redis.conf
[redis-3.2.0]# src/redis-server 7003/redis.conf
2. cluster replicate
3. cluster addslots
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7002
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7003
[redis-3.2.0]# src/redis-cli -p 7003 cluster nodes
1ae4f040e4be0b57626123504402987b0370626e 127.0.0.1:7001 master - 0 1466724388707 1 connected
43e05c833ed0af02410dadb0d11e107ea5d53fc9 127.0.0.1:7002 master - 0 1466724387705 2 connected
f1c68c4736f1e042b07f27228cecfa1a8ea0f208 127.0.0.1:7000 master - 0 1466724388707 0 connected
5ac5312e7b050558082622e7185a79b18c918d19 127.0.0.1:7003 myself,master - 0 0 3 connected
[redis-3.2.0]# src/redis-cli -p 7003 cluster replicate 1ae4f040e4be0b57626123504402987b0370626e
OK
[redis-3.2.0]# src/redis-cli -p 7002 cluster replicate f1c68c4736f1e042b07f27228cecfa1a8ea0f208
OK
[redis-3.2.0]# src/redis-cli -p 7003 cluster nodes
1ae4f040e4be0b57626123504402987b0370626e 127.0.0.1:7001 master - 0 1466724544973 1 connected
43e05c833ed0af02410dadb0d11e107ea5d53fc9 127.0.0.1:7002 slave f1c68c4736f1e042b07f27228cecfa1a8ea0f208 0 1466724545475 2 connected
f1c68c4736f1e042b07f27228cecfa1a8ea0f208 127.0.0.1:7000 master - 0 1466724545976 0 connected
5ac5312e7b050558082622e7185a79b18c918d19 127.0.0.1:7003 myself,slave 1ae4f040e4be0b57626123504402987b0370626e 0 0 3 connected
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..8191}
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {8192..16383}
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
5ac5312e7b050558082622e7185a79b18c918d19 127.0.0.1:7003 slave 1ae4f040e4be0b57626123504402987b0370626e 0 1466724652843 3 connected
1ae4f040e4be0b57626123504402987b0370626e 127.0.0.1:7001 myself,master - 0 0 1 connected 8192-16383
f1c68c4736f1e042b07f27228cecfa1a8ea0f208 127.0.0.1:7000 master - 0 1466724653344 0 connected 0-8191
43e05c833ed0af02410dadb0d11e107ea5d53fc9 127.0.0.1:7002 slave f1c68c4736f1e042b07f27228cecfa1a8ea0f208 0 1466724652342 2 connected
[redis-3.2.0]# src/redis-cli -p 7001 cluster slots
1) 1) (integer) 8192
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7001
3) "1ae4f040e4be0b57626123504402987b0370626e"
4) 1) "127.0.0.1"
2) (integer) 7003
3) "5ac5312e7b050558082622e7185a79b18c918d19"
2) 1) (integer) 0
2) (integer) 8191
3) 1) "127.0.0.1"
2) (integer) 7000
3) "f1c68c4736f1e042b07f27228cecfa1a8ea0f208"
4) 1) "127.0.0.1"
2) (integer) 7002
3) "43e05c833ed0af02410dadb0d11e107ea5d53fc9"
[redis-3.2.0]# src/redis-cli -p 7001 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:4
cluster_size:2
OK
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 51
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 49
Case 6: Master 3 - Slave 3 목차로 가기
마스터 3대, 복제 3대로 클러스터를 구성한다.
- 서버 시작과 내용 확인
- 클러스터 구성 1. cluster meet
- 데이터 입력과 확인
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-server 7002/redis.conf
[redis-3.2.0]# src/redis-server 7003/redis.conf
[redis-3.2.0]# src/redis-server 7004/redis.conf
[redis-3.2.0]# src/redis-server 7005/redis.conf
2. cluster replicate
3. cluster addslots
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7002
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7003
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7004
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7005
[redis-3.2.0]# src/redis-cli -p 7000 cluster nodes
edb5917163a96daa299252e15f9bb1eed68a3f9c 127.0.0.1:7004 master - 0 1466731246137 0 connected
38fb923d9f2c6a4b6f2dbee7d80d438224c607c8 127.0.0.1:7001 master - 0 1466731246137 2 connected
5d9bd6f24b6afbe3d67641df3ee31606de99a4bb 127.0.0.1:7003 master - 0 1466731245136 4 connected
18aea71965bde9c72153017df83f8153c3913c5c 127.0.0.1:7000 myself,master - 0 0 1 connected
22c3e48877e11aa246790fd23e228c8dd661e32f 127.0.0.1:7005 master - 0 1466731245136 5 connected
0b15f7ea229442b55e61a8b67c734b30d2e21f67 127.0.0.1:7002 master - 0 1466731245637 3 connected
[redis-3.2.0]#
[redis-3.2.0]# src/redis-cli -p 7003 cluster replicate 18aea71965bde9c72153017df83f8153c3913c5c
[redis-3.2.0]# src/redis-cli -p 7004 cluster replicate 38fb923d9f2c6a4b6f2dbee7d80d438224c607c8
[redis-3.2.0]# src/redis-cli -p 7005 cluster replicate 0b15f7ea229442b55e61a8b67c734b30d2e21f67
[redis-3.2.0]# src/redis-cli -p 7005 cluster nodes
38fb923d9f2c6a4b6f2dbee7d80d438224c607c8 127.0.0.1:7001 master - 0 1466731696653 2 connected
edb5917163a96daa299252e15f9bb1eed68a3f9c 127.0.0.1:7004 slave 38fb923d9f2c6a4b6f2dbee7d80d438224c607c8 0 1466731697152 2 connected
22c3e48877e11aa246790fd23e228c8dd661e32f 127.0.0.1:7005 myself,slave 0b15f7ea229442b55e61a8b67c734b30d2e21f67 0 0 5 connected
18aea71965bde9c72153017df83f8153c3913c5c 127.0.0.1:7000 master - 0 1466731696653 1 connected
5d9bd6f24b6afbe3d67641df3ee31606de99a4bb 127.0.0.1:7003 slave 18aea71965bde9c72153017df83f8153c3913c5c 0 1466731697152 4 connected
0b15f7ea229442b55e61a8b67c734b30d2e21f67 127.0.0.1:7002 master - 0 1466731697152 3 connected
[redis-3.2.0]#
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..5461}
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {5462..10922}
[redis-3.2.0]# src/redis-cli -p 7002 cluster addslots {10923..16383}
[redis-3.2.0]#
[redis-3.2.0]# src/redis-cli -p 7005 cluster slots
1) 1) (integer) 5462
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 7001
3) "38fb923d9f2c6a4b6f2dbee7d80d438224c607c8"
4) 1) "127.0.0.1"
2) (integer) 7004
3) "edb5917163a96daa299252e15f9bb1eed68a3f9c"
2) 1) (integer) 0
2) (integer) 5461
3) 1) "127.0.0.1"
2) (integer) 7000
3) "18aea71965bde9c72153017df83f8153c3913c5c"
4) 1) "127.0.0.1"
2) (integer) 7003
3) "5d9bd6f24b6afbe3d67641df3ee31606de99a4bb"
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7002
3) "0b15f7ea229442b55e61a8b67c734b30d2e21f67"
4) 1) "127.0.0.1"
2) (integer) 7005
3) "22c3e48877e11aa246790fd23e228c8dd661e32f"
OK
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 32
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 33
[redis-3.2.0]# src/redis-cli -p 7002 dbsize
(integer) 35
주의 사항 목차로 가기
레디스 클러스터는 마스터 서버가 3대 이상이어야 마스터 다운 시 복제이 마스터 역할을 이어 받는다.
마스터 서버가 2대 이하면 failover가 진행되지 않는다.
복제 개수는 아무리 많아도 failover에 참여하지 못한다.
그러므로 여기서 마스터 서버가 2대 이하인 구성으로 클러스터를 사용하려면,
마스터 다운 시 빨리 알아내서 직접(manual)으로 failover 처리를 해야 한다.
이 경우 failover 명령은 cluster failover takeover이다.
마스터 1 - 복제 1 또는 2의 구성은 센티널(sentinel)을 사용하는 것을 권장한다.
클러스터 확장
Case 1: Master 1 ---» Master 2 목차로 가기
마스터 1대를 마스터 2대로 확장하는 방법이다. 마스터를 하나 더 추가하는 것은 클러스터 명령으로 가능하나, 새 마스터로 슬롯과 키를 이동(MIGRATE)하는 것은 클러스터 명령으로 하는 방법과 redis-cli로 하는 방법을 제시했다. 이 경우 클러스터 명령으로 처리하는 과정이 복잡하므로 redis-cli를 사용하는 것을 권장한다.
- Master 1 구성하고 데이터 넣기
- Master 2 구성하기
- 클러스터 명령을 사용해서 슬롯과 데이터(키) 이동하기 슬롯에 데이터(키)가 없는 경우: 간단히 cluster setslot를 하면 된다.
- redis-cli를 사용해서 슬롯과 데이터(키) 이동하기 이 테스트는 클러스터를 다시 구성해서 했기 때문에 이전과 node-id 가 다르다.
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -c -p 7000 set key$i value$i; done
OK
[redis-3.2.0]# src/redis-cli -c -p 7000 dbsize
(integer) 100
[redis-3.2.0]# src/redis-cli -p 7001 cluster meet 127.0.0.1 7000
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
c7e016a3b4ad4a195f0480f532dcc6f1fd0281e2 127.0.0.1:7000 myself,master - 0 0 0 connected 0-16383
0ee6d185de94d381e085ed42954c651c42b0f783 127.0.0.1:7001 master - 0 1466741786494 1 connected
(integer) 0
127.0.0.1:7000> cluster setslot 8191 node 0ee6d185de94d381e085ed42954c651c42b0f783
OK
(integer) 1
127.0.0.1:7000> cluster getkeysinslot 12180 1
1) "key97"
127.0.0.1:7000> cluster setslot 12180 node 0ee6d185de94d381e085ed42954c651c42b0f783
(error) ERR Can't assign hashslot 12180 to a different node while I still hold keys for this hash slot.
127.0.0.1:7000> MIGRATE 127.0.0.1 7001 key97 0 1000
(error) ERR Target instance replied with error: MOVED 12180 127.0.0.1:7000
127.0.0.1:7000> exit
[redis-3.2.0]# src/redis-cli -c -p 7001
127.0.0.1:7001> CLUSTER SETSLOT 12180 IMPORTING c7e016a3b4ad4a195f0480f532dcc6f1fd0281e2
OK
127.0.0.1:7001> exit
[redis-3.2.0]# src/redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER SETSLOT 12180 MIGRATING 0ee6d185de94d381e085ed42954c651c42b0f783
OK
127.0.0.1:7000> MIGRATE 127.0.0.1 7001 key97 0 1000
OK
127.0.0.1:7000> cluster setslot 12180 node 0ee6d185de94d381e085ed42954c651c42b0f783
OK 127.0.0.1:7000> exit
[redis-3.2.0]# src/redis-cli -c -p 7001
127.0.0.1:7001> cluster setslot 12180 node 0ee6d185de94d381e085ed42954c651c42b0f783
OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: e58e556766e4d2dba1d386baa0868824b24c618b 127.0.0.1:7000
slots:0-16383 (16384 slots) master
0 additional replica(s)
M: c9d6c978c8bf4134cbe56844cd4da15a9ba852f6 127.0.0.1:7001
slots: (0 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 8191
What is the receiving node ID? c9d6c978c8bf4134cbe56844cd4da15a9ba852f6
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:e58e556766e4d2dba1d386baa0868824b24c618b
Source node #2:done
...
Moving slot 8190 from e58e556766e4d2dba1d386baa0868824b24c618b
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 0 from 127.0.0.1:7000 to 127.0.0.1:7001:
...
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
c9d6c978c8bf4134cbe56844cd4da15a9ba852f6 127.0.0.1:7001 myself,master - 0 0 1 connected 0-8190
e58e556766e4d2dba1d386baa0868824b24c618b 127.0.0.1:7000 master - 0 1466737119544 0 connected 8191-16383
[redis-3.2.0]# src/redis-cli -p 7001 cluster slots
1) 1) (integer) 0
2) (integer) 8190
3) 1) "127.0.0.1"
2) (integer) 7001
3) "c9d6c978c8bf4134cbe56844cd4da15a9ba852f6"
2) 1) (integer) 8191
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7000
3) "e58e556766e4d2dba1d386baa0868824b24c618b"
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 49
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 51
Case 2: Master 1 ---» Master 1 - Slave 1 목차로 가기
Master1(7000) - Slave1(7001)
이 경우는 슬롯을 이동할 필요가 없으므로 Case 1에 비해서 간단하다.
- Master 1 구성하고 데이터 넣기
- Slave 1 구성하기
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -c -p 7000 set key$i value$i; done
OK
[redis-3.2.0]# src/redis-cli -c -p 7000 dbsize
(integer) 100
[redis-3.2.0]# src/redis-cli -p 7001 cluster meet 127.0.0.1 7000
OK
[redis-3.2.0]# src/redis-cli -p 7001
127.0.0.1:7001> cluster nodes
e27a2ddb712e8f2c001003e1c137bd2c56936d07 127.0.0.1:7000 master - 0 1466743100882 0 connected 0-16383
2bdbf54c88c171def238bc30fd43367be167f64b 127.0.0.1:7001 myself,master - 0 0 1 connected
127.0.0.1:7001> cluster replicate e27a2ddb712e8f2c001003e1c137bd2c56936d07
OK
127.0.0.1:7001> dbsize
(integer) 100
Case 3: Master 1 ---» Master 1 - Slave 1 - Slave 1 목차로 가기
Master1(7000) - Slave1(7001) - Slave2(7002)
- Master 1 구성하고 데이터 넣기
- Slave 1 - Slave 1 구성하기 Cluster slots 명령으로 보면 Slave2(7002)는 보이지 않는다. 하지만 cluster nodes로 보면 볼 수 있다.
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -c -p 7000 set key$i value$i; done
OK
[redis-3.2.0]# src/redis-cli -c -p 7000 dbsize
(integer) 100
[redis-3.2.0]# src/redis-server 7002/redis.conf
[redis-3.2.0]# src/redis-cli -p 7001 cluster meet 127.0.0.1 7000
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster meet 127.0.0.1 7002
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster nodes
349d3ed435d6ce127654035d26ccf52fbd33bce3 127.0.0.1:7000 master - 0 1466744187432 1 connected 0-16383
a5c8b6b2728ed2105783d5ac021b77b9a2687cec 127.0.0.1:7002 master - 0 1466744186931 0 connected
709da7db5177f5a97a86df4efc63ac9495bfb790 127.0.0.1:7001 myself,master - 0 0 2 connected
[redis-3.2.0]# src/redis-cli -p 7002 cluster replicate 709da7db5177f5a97a86df4efc63ac9495bfb790
OK
[redis-3.2.0]# src/redis-cli -p 7001 cluster replicate 349d3ed435d6ce127654035d26ccf52fbd33bce3
OK
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 100
[redis-3.2.0]# src/redis-cli -p 7002 dbsize
(integer) 100
[redis-3.2.0]# src/redis-cli -c -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:3
cluster_size:1
[redis-3.2.0]# src/redis-cli -p 7002 cluster slots
1) 1) (integer) 0
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7000
3) "349d3ed435d6ce127654035d26ccf52fbd33bce3"
4) 1) "127.0.0.1"
2) (integer) 7001
3) "709da7db5177f5a97a86df4efc63ac9495bfb790"
[redis-3.2.0]# src/redis-cli -c -p 7000 cluster nodes
a5c8b6b2728ed2105783d5ac021b77b9a2687cec 127.0.0.1:7002 slave 709da7db5177f5a97a86df4efc63ac9495bfb790 0 1466744622764 2 connected
709da7db5177f5a97a86df4efc63ac9495bfb790 127.0.0.1:7001 slave 349d3ed435d6ce127654035d26ccf52fbd33bce3 0 1466744623264 2 connected
349d3ed435d6ce127654035d26ccf52fbd33bce3 127.0.0.1:7000 myself,master - 0 0 1 connected 0-16383
Case 4: Master 2 - Slave 2 ---» Master 3 - Slave 3 목차로 가기
- Master 2 - Slave 2 구성
- Master 1 - Slave 1 준비
- Master 3 - Slave 3으로 확장 슬롯과 키(데이터)의 이동은 redis-cli를 사용한다. 5460개 슬롯을 7000(Master1)과 7001(Master2)에서 7004(Master3)로 이동한다.
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-server 7002/redis.conf
[redis-3.2.0]# src/redis-server 7003/redis.conf
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7001
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7002
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7003
[redis-3.2.0]# src/redis-cli -p 7003 cluster replicate 9b1ec8841317253400cd50f6fe2b003af3001cd6
[redis-3.2.0]# src/redis-cli -p 7002 cluster replicate 748d0aa88482dad4acfb502e960cf3a433527845
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..8191}
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {8192..16383}
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -c -p 7000 set key$i value$i; done
[redis-3.2.0]# src/redis-server 7005/redis.conf
[redis-3.2.0]# src/redis-cli -p 7004 cluster meet 127.0.0.1 7000
[redis-3.2.0]# src/redis-cli -p 7005 cluster meet 127.0.0.1 7000
[redis-3.2.0]# src/redis-cli -p 7005 cluster replicate d199f2f6e369a502564c077e98bc9d9969e8008e
OK
[redis-3.2.0]# src/redis-cli -c -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:6
cluster_size:2
[redis-3.2.0]# src/redis-cli -c -p 7000 cluster nodes
d199f2f6e369a502564c077e98bc9d9969e8008e 127.0.0.1:7004 master - 0 1466777308416 0 connected
c1b7106db3a24713b7d4a4198ab20d1fb0100172 127.0.0.1:7005 myself,slave d199f2f6e369a502564c077e98bc9d9969e8008e 0 0 4 connected
748d0aa88482dad4acfb502e960cf3a433527845 127.0.0.1:7000 master - 0 1466777308416 1 connected 0-8191
0fa914665e0669ec74f6766b3535f11e5c4f4210 127.0.0.1:7003 slave 9b1ec8841317253400cd50f6fe2b003af3001cd6 0 1466777309419 2 connected
fa5aee204ef4cc7c65e1b15f85f626472c6f2251 127.0.0.1:7002 slave 748d0aa88482dad4acfb502e960cf3a433527845 0 1466777308416 1 connected
9b1ec8841317253400cd50f6fe2b003af3001cd6 127.0.0.1:7001 master - 0 1466777309619 2 connected 8192-16383
아래 내용이 좀 많은 것은 reshard 후 cluster info, cluster slots, dbsize 명령으로 확인한 데이터를 같이 놓아서이다.
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 748d0aa88482dad4acfb502e960cf3a433527845 127.0.0.1:7000
slots:0-8191 (8192 slots) master
1 additional replica(s)
M: 9b1ec8841317253400cd50f6fe2b003af3001cd6 127.0.0.1:7001
slots:8192-16383 (8192 slots) master
1 additional replica(s)
S: c1b7106db3a24713b7d4a4198ab20d1fb0100172 127.0.0.1:7005
slots: (0 slots) slave
replicates d199f2f6e369a502564c077e98bc9d9969e8008e
M: d199f2f6e369a502564c077e98bc9d9969e8008e 127.0.0.1:7004
slots: (0 slots) master
1 additional replica(s)
S: fa5aee204ef4cc7c65e1b15f85f626472c6f2251 127.0.0.1:7002
slots: (0 slots) slave
replicates 748d0aa88482dad4acfb502e960cf3a433527845
S: 0fa914665e0669ec74f6766b3535f11e5c4f4210 127.0.0.1:7003
slots: (0 slots) slave
replicates 9b1ec8841317253400cd50f6fe2b003af3001cd6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 5460
What is the receiving node ID? d199f2f6e369a502564c077e98bc9d9969e8008e
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:748d0aa88482dad4acfb502e960cf3a433527845
Source node #2:9b1ec8841317253400cd50f6fe2b003af3001cd6
Source node #3:done
...
Moving slot 10921 from 9b1ec8841317253400cd50f6fe2b003af3001cd6
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 0 from 127.0.0.1:7000 to 127.0.0.1:7004:
...
[redis-3.2.0]#
[redis-3.2.0]# src/redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:6
cluster_size:3
[redis-3.2.0]# src/redis-cli -c -p 7000 cluster slots
1) 1) (integer) 10922
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7001
3) "9b1ec8841317253400cd50f6fe2b003af3001cd6"
4) 1) "127.0.0.1"
2) (integer) 7003
3) "0fa914665e0669ec74f6766b3535f11e5c4f4210"
2) 1) (integer) 2730
2) (integer) 8191
3) 1) "127.0.0.1"
2) (integer) 7000
3) "748d0aa88482dad4acfb502e960cf3a433527845"
4) 1) "127.0.0.1"
2) (integer) 7002
3) "fa5aee204ef4cc7c65e1b15f85f626472c6f2251"
3) 1) (integer) 0
2) (integer) 2729
3) 1) "127.0.0.1"
2) (integer) 7004
3) "d199f2f6e369a502564c077e98bc9d9969e8008e"
4) 1) "127.0.0.1"
2) (integer) 7005
3) "c1b7106db3a24713b7d4a4198ab20d1fb0100172"
4) 1) (integer) 8192
2) (integer) 10921
3) 1) "127.0.0.1"
2) (integer) 7004
3) "d199f2f6e369a502564c077e98bc9d9969e8008e"
4) 1) "127.0.0.1"
2) (integer) 7005
3) "c1b7106db3a24713b7d4a4198ab20d1fb0100172"
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 38
[redis-3.2.0]# src/redis-cli -p 7001 dbsize
(integer) 35
[redis-3.2.0]# src/redis-cli -p 7004 dbsize
(integer) 27
클러스터 축소
Case 1: Master 2 ---» Master 1 목차로 가기
- Master 2 구성
- Master 1 제거: 슬롯, 키(데이터) 이동 그리고 FORGET
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7001
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..8191}
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {8192..16383}
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -c -p 7000 set key$i value$i; done
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: a60b0da33b3c7f8c59402a51583180ab05c2d8ff 127.0.0.1:7000
slots:0-8191 (8192 slots) master
0 additional replica(s)
M: f89ae256270bd7424aa08ae8c44cddd1813fc773 127.0.0.1:7001
slots:8192-16383 (8192 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 8192
What is the receiving node ID? a60b0da33b3c7f8c59402a51583180ab05c2d8ff
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:f89ae256270bd7424aa08ae8c44cddd1813fc773
Source node #2:done
[redis-3.2.0]# src/redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:2
cluster_size:1
[redis-3.2.0]# src/redis-cli -p 7000 cluster forget f89ae256270bd7424aa08ae8c44cddd1813fc773
OK
[redis-3.2.0]# src/redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_known_nodes:1
cluster_size:1
클러스터로 전환
Case 0: redis-cli --cluster import 기능 사용
redis-cli --cluster import 바로 가기
Case 1: standalone ---» cluster master 1 목차로 가기
여기서는 Standalone으로 운영하던 서버를 클러스터로 전환하는 방법을 설명한다. Standalone일때와 같은 포트를 사용하든, 다른 포트를 사용하든 데이터 파일(appendonly.aof 또는 dump.rdb)을 잘 보존하면 된다. 여기서는 다른 포트를 사용하고 appendonly 파일을 사용해서 전환하는 방법을 설명한다. RDB 파일을 사용해도 된다.
- Standalone 서버 시작과 데이터 넣기: 6000번 포트 사용
- Cluster 7000번 포트 서버 시작: 이 때 7000번 working directory에 데이터 파일(appendonly.aof 또는 dump.rdb)가 없어야 한다. nodes.conf 파일도 없어야 한다.
- 슬롯이 할당되지 않은 서버에 데이터 파일이 있으면 서버 시작 시 다음과 같은 에러가 반복해서 서버 로그에 남는다.
[redis-3.2.0]# for i in {1..100}; do src/redis-cli -p 6000 set key$i value$i; done
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..16383}
OK
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 0
[redis-3.2.0]# src/redis-cli -p 7000 shutdown
[redis-3.2.0]# cp 6000/appendonly.aof 7000/
[redis-3.2.0]# src/redis-server 7000/redis.conf
[redis-3.2.0]# src/redis-cli -p 7000 dbsize
(integer) 100
Case 2: standalone ---» cluster master 2 목차로 가기
여기서는 이전 테스트에서 만들어서 사용했던 데이터 파일(appendonly.aof)을 사용한다.
- Master 2 노드: 클러스터 구성 후 종료한다.
- Appendonly.aof 파일을 복사하고 서버를 시작한다.
- 데이터를 확인해 보니, 어찌된 영문인지 7000번 서버에 모든 데이터(키)가 들어갔다. cluster nodes 명령으로 보면 7001번 서버에 들어갈 키들이 importing 되어 있는 것을 알 수 있다. 이 경우 이미 importing 되어 있으므로 redis-cli --cluster reshard로도 할 수 없고, cluster setslot stable로 importing을 취소한 다음 reshard 하든지, 하나하나 클러스터 명령을 사용해야 한다. 따라서 이 방법 보다는 위 Case1에서 제시한 Master 1로 전환하고 Master 1을 확장하는 방법을 택하는 편이 작업하기 훨씬 편리하다.
- 7000번 서버 로그에 아래와 같은 메시지가 반복해서 남는다.
- RDB 파일을 사용해도 7000번 서버에 모든 데이터(키)가 들어간다. 그런데, 이때는 좀 더 이상한 결과가 된다. 7000번에 할당된 슬롯이 키가 들어있는 슬롯만 남고 다른 슬롯은 삭제된 상태가 된다. 그리고 7001번과 클러스터 연결은 끊어진다. 이러한 결과는 RDB 파일을 읽어서 DB에 넣을때 클러스터 상황을 고려하지 않는 내부 명령을 사용하기 때문이다. 어찌 되었건, RDB 파일은 정상적인 결과를 얻을 수 없으므로 사용하지 말기 바랍니다.
- RDB 파일을 로드했을때 서버 로그에는 다음과 같은 메시지가 반복해서 남는다.
[redis-3.2.0]# src/redis-server 7001/redis.conf
[redis-3.2.0]# src/redis-cli -p 7000 cluster meet 127.0.0.1 7001
[redis-3.2.0]# src/redis-cli -p 7000 cluster addslots {0..8191}
[redis-3.2.0]# src/redis-cli -p 7001 cluster addslots {8192..16383}
[redis-3.2.0]# src/redis-cli -p 7001 shutdown
[redis-3.2.0]# src/redis-cli -p 7000 shutdown
[redis-3.2.0]# src/redis-server 7000/redis.conf
[redis-3.2.0]# src/redis-server 7001/redis.conf
(integer) 100
127.0.0.1:7000> cluster nodes
9566a49d676bfda3d779676820556c6e27dd8dee 127.0.0.1:7000 myself,master - 0 0 1 connected 0-8191
[8221-<-f712ec3fd7fef3ff4cbf9c3afcbbc6c67947aed6]
[8345-<-f712ec3fd7fef3ff4cbf9c3afcbbc6c67947aed6]
...
[16309-<-f712ec3fd7fef3ff4cbf9c3afcbbc6c67947aed6]
f712ec3fd7fef3ff4cbf9c3afcbbc6c67947aed6 127.0.0.1:7001 master - 0 1466811594136 0 connected 8192-16383
[redis-3.2.0]# src/redis-cli --cluster reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9566a49d676bfda3d779676820556c6e27dd8dee 127.0.0.1:7000
slots:0-8191 (8192 slots) master
0 additional replica(s)
M: f712ec3fd7fef3ff4cbf9c3afcbbc6c67947aed6 127.0.0.1:7001
slots:8192-16383 (8192 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 127.0.0.1:7000 has slots in importing state (8221,8345,8593,8941,9039,...,16309).
[WARNING] The following slots are open: 8221,8345,8593,8941,9039,...,16309
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Please fix your cluster problems before resharding
[redis-3.2.0]#
(integer) 100
[redis-3.2.0]# src/redis-cli -p 7000 cluster info
cluster_state:fail
cluster_slots_assigned:100
cluster_slots_ok:100
cluster_known_nodes:1
cluster_size:1
[redis-3.2.0]# src/redis-cli -p 7000 cluster nodes
02c46449e246d9f3488143c76673cc90cdde8221 :7000 myself,master - 0 0 0 connected 95 219 641 781 803 905 935 1663 1787 2035 2413 2537 2623 2747 2871 3072 3103 3204 3227 3653 3674 3917 3922 4041 4054 4222 4346 4768 4866 4908 4998 5032 5726 5728 5850 6098 6476 6600 6686 6810 6934 7201 7230 7333 7354 7780 7803 8044 8051 8168 8183 8221 8345 8593 8941 9039 9057 9163 9189 9789 9913 10279 10543 10667 10877 11001 11330 11357 11462 11481 11594 11605 12047-12048 12171 12180 12348 12472 12720 13004 13120 13166 13290 13852 13976 14342 14606 14730 14940 15064 15459 15484 15591 15608 15723 15732 16174 16177 16298 16309
[redis-3.2.0]#
소스 코드
redis-trib.rb 중 reshard 부분 소스
소스는 클러스터 명령이 있는 부분을 중심으로 간추렸다.
클러스터 명령만 정리해 보면 다음과 같다.
1. cluster setslot importing
2. cluster setslot migrating
3. cluster getkeysinslot
4. migrate
5. cluster setslot node
<< redis-trib.rb | Cluster Design | Cluster Failover >> |
---|