Database/Redis

[Redis] 클러스터 마스터노드 구성방법, 마스터 노드, 복제 노드 추가 방법

꽁담 2020. 3. 23. 04:00

클러스터 노드 구성 방법


redis-cli 혹은 redis-trib 의 create 옵션을 사용하여 클러스터를 구성하는 방법

https://mozi.tistory.com/381 포스팅을 참고해 주세요


매뉴얼을 사용하여 개별 구성하는 방법

마스터/복제노드를 사용자가 설정할 수 있습니다.

마스터와 복제노드를 사용자가 원하는 만큼 개별적으로 설정할 수 있습니다.



클러스터 매뉴얼대로 개별 구성 방법


마스터 노드 한 개로 클러스터 구성하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ redis-server 7000/redis_7000.conf 
 
$ redis-cli --7000
127.0.0.1:7000> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_size:0
127.0.0.1:7000> cluster nodes
960bb6ffc1514ceb1e3ceffdff11c23ade57f72d :7000@17000 myself,master - 0 0 0 connected
 
$ redis-cli -7000 cluster addslots {0..16383}
OK
 
$ redis-cli --7000
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_size:1
127.0.0.1:7000> cluster nodes
960bb6ffc1514ceb1e3ceffdff11c23ade57f72d :7000@17000 myself,master - 0 0 0 connected 0-16383
cs


Line 1 : Redis 를 구동합니다. 아직 클러스터로 조인된 것은 아닙니다.

Line 4-7 : 클러스터 정보를 확인하면 상태가 fail 이며 슬롯이 할당되지 않은 것을 확인할 수 있습니다.

Line 8-9 : 클러스터 enable 상태이기 때문에 ID 값을 가지고 있습니다.

Line 11 : 클러스터에 슬롯을 할당합니다.

Line 15-18 : 클러스터가 활성화 되었으며 클러스터 기능을 수행할 수 있습니다.


마스터 노드에 복제서버 추가하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ redis-server 7001/redis_7001.conf
 
$ redis-cli -7001 cluster meet 127.0.0.1 7000
OK
 
$ redis-cli --7001
127.0.0.1:7001> cluster nodes
960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 127.0.0.1:7000@17000 master - 0 1584900548040 0 connected 0-16383
9378f7f3c639d74e7102575213bc54cdb9f4476a 127.0.0.1:7001@17001 myself,master - 0 0 1 connected
 
$ redis-cli -7001 cluster replicate 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 
OK
 
$ redis-cli --7000
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_known_nodes:2
cluster_size:1
127.0.0.1:7000> cluster nodes
9378f7f3c639d74e7102575213bc54cdb9f4476a 127.0.0.1:7001@17001 slave 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 0 1584900281326 1 connected
960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 127.0.0.1:7000@17000 myself,master - 0 0 0 connected 0-16383
cs


Line 1 : 복제서버로 사용할 Redis(7001)를 구동합니다.

Line 3 : 마스터서버(7000)에 복제서버(7001)를 조인합니다.

Line 6-9 : 복제서버라는 것을 알려주지 않았으므로 아직 둘 다 마스터인 상태입니다.

Line 11 : 복제서버(7001)가 마스터서버ID(7000)의 복제역할을 한다는 것을 서버에 알려줍니다.

Line 15-19 : 노드는 2개로 늘었고, 마스터 서버는 1개 입니다.

Line 20-22 : 복제서버(7001) 은 slave 역할을 수행합니다.


혹은 redis-cli 명령어의 add-node 옵션을 통해서도 진행할 수 있습니다.

[슬레이브 IP:PORT] , [클러스터 노드 IP:PORT], [--cluster-slave 옵션], [마스터가 될 노드 ID] 순으로 입력해 주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ redis-server redis_7001.conf 
 
$ redis-cli --cluster add-node 127.0.0.1:7001 127.0.0.1:7000 --cluster-slave 869859e396c881b3c26f2a386c1495235225b57b
>>> Adding node 127.0.0.1:7001 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 869859e396c881b3c26f2a386c1495235225b57b 127.0.0.1:7000
   slots:[0-16383] (16384 slots) master
M: dcae268548d26662de97d3843f658318953004a7 127.0.0.1:8000
   slots: (0 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 127.0.0.1:7000
>>> Send CLUSTER MEET to node 127.0.0.1:7001 to make it join the cluster.
Waiting for the cluster to join
 
>>> Configure node as replica of 127.0.0.1:7000.
[OK] New node added correctly.
cs


복제노드에서 데이터 확인이 안되는 경우가 있습니다.. 왜그럴까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ redis-cli --7000
127.0.0.1:7000> set key mozi
OK
 
$ redis-cli --7001
127.0.0.1:7001> get key
-> Redirected to slot [12539] located at 127.0.0.1:7000
"mozi"
 
$ redis-cli --7001
127.0.0.1:7001> readonly
OK
127.0.0.1:7001> get key
"mozi"
cs

Cluster 에서는 READONLY 와 READWRITE 모드가 있습니다.
READONLY 옵션인 경우에 get 같은 명령을 수행하면 마스터서버로 redirect 되지 않습니다.
READWRITE 옵션인 경우에는 조회, 입력 명령을 수행하면 마스터서버로 redirect 됩니다.

이 옵션은 클라이언트에서 설정하는 명령어이기 때문에, 다른 클라이언트나 서버의 옵션에는 영향을 미치지 않습니다.

마스터 노드 추가하기

1
2
3
4
5
6
7
8
9
10
$ redis-server 8000/redis_8000.conf
 
$ redis-cli -8000 cluster meet 127.0.0.1 7000
OK
 
$ redis-cli --7000
127.0.0.1:7000> cluster nodes
9378f7f3c639d74e7102575213bc54cdb9f4476a 127.0.0.1:7001@17001 slave 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 0 1584901693471 1 connected
960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 127.0.0.1:7000@17000 myself,master - 0 1584901692000 0 connected 0-16383
5cd4603e77197a22f6c563942c11b36bdebed670 127.0.0.1:8000@18000 master - 0 1584901693988 2 connected
cs


Line 3 : 새로운 마스터서버(8000)을 기존 클러스터에 조인합니다.

Line 7-10 : 새로 추가된 마스터서버ID를 확인합니다.

Line 11-13 : 새로 추가된 마스터서버에 슬롯을 할당해 줍니다.

(슬롯에 데이터가 없는 경우에만 가능합니다. 슬롯에 데이터가 있는 경우 ERR 메시지가 발생합니다.)


혹은 redis-cli 명령어의 add-node 옵션을 통해서도 진행할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ redis-server redis_8000.conf 
 
$ redis-cli --cluster add-node 127.0.0.1:8000 127.0.0.1:7000
>>> Adding node 127.0.0.1:8000 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 869859e396c881b3c26f2a386c1495235225b57b 127.0.0.1:7000
   slots:[0-16383] (16384 slots) master
   1 additional replica(s)
S: e8b8e9115aab2a8bb42ec9aff1c62f1aeb3cc10c 127.0.0.1:7001
   slots: (0 slots) slave
   replicates 869859e396c881b3c26f2a386c1495235225b57b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:8000 to make it join the cluster.
[OK] New node added correctly.
cs


마스터 노드가 추가되었으면 reshard 명령어를 통해 slot 을 재 분배 해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ redis-cli --cluster reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d 127.0.0.1:7000
   slots:[0-16383] (16384 slots) master
   1 additional replica(s)
S: 9378f7f3c639d74e7102575213bc54cdb9f4476a 127.0.0.1:7001
   slots: (0 slots) slave
   replicates 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d
M: 5cd4603e77197a22f6c563942c11b36bdebed670 127.0.0.1:8000
   slots: (0 slots) master
[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? 5cd4603e77197a22f6c563942c11b36bdebed670
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: 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d
Source node #2: done
    ...
    Moving slot 8189 from 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d
    Moving slot 8190 from 960bb6ffc1514ceb1e3ceffdff11c23ade57f72d
Do you want to proceed with the proposed reshard plan (yes/no)? yes
...
Moving slot 8189 from 127.0.0.1:7000 to 127.0.0.1:8000
Moving slot 8190 from 127.0.0.1:7000 to 127.0.0.1:8000
cs


Line 1 : 재 샤딩을 하여 추가된 마스터에 슬롯을 할당해 줍니다.

Line 3-14 : 현재 마스터에 할당된 슬롯을 확인할 수 있습니다.

Line 15 : 슬롯을 이동할 개수를 입력합니다.

Line 16 : 슬롯을 이동할 Destination 마스터의 ID 를 입력합니다.

Line 20 : 슬롯이 있는 Source Node 를 입력합니다.

Line 22-24 : Source Node 로부터 슬롯번호를 이동합니다. (실제 이동은 아닙니다.)

Line 25 : 재 샤딩을 할 건지 한번 더 확인받습니다.

Line 26-28 : Destination 마스터로 슬롯을 이동합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ redis-cli --8000
127.0.0.1:8000> cluster slots
11) (integer) 0
   2) (integer) 8190
   31"127.0.0.1"
      2) (integer) 8000
      3"5cd4603e77197a22f6c563942c11b36bdebed670"
21) (integer) 8191
   2) (integer) 16383
   31"127.0.0.1"
      2) (integer) 7000
      3"960bb6ffc1514ceb1e3ceffdff11c23ade57f72d"
   41"127.0.0.1"
      2) (integer) 7001
      3"9378f7f3c639d74e7102575213bc54cdb9f4476a"
cs


Line 2-15 : 서버의 ID, Port, ID 값에 할당된 슬롯번호를 확인할 수 있습니다.