Database/Redis

[Redis] 클러스터 구성 및 정보 확인하기, 클러스터 접속방법

꽁담 2020. 3. 22. 02:52

Redis 클러스터 구동 전 사전 설정


redis.conf

3개의 노드를 구성할 conf 파일을 설정해 줍니다.

cluster-enabled : 클러스터로 사용합니다.

cluster-config-file : 노드별로 클러스터 노드 정보를 conf 파일에 저장합니다.

cluster-node-timeout : 노드간 통신이 되지 않아 timeout 되는 시간을 설정합니다.

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
29
$ cat redis_7000.conf
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 3000
port 7000
dir /home/psh/7000
appendonly yes
daemonize yes
logfile "redis_7000.log"
 
$ cat redis_8000.conf
cluster-enabled yes
cluster-config-file nodes-8000.conf
cluster-node-timeout 3000
port 8000
dir /home/psh/8000
appendonly yes
daemonize yes
logfile "redis_8000.log"
 
$ cat redis_9000.conf
cluster-enabled yes
cluster-config-file nodes-9000.conf
cluster-node-timeout 3000
port 9000
dir /home/psh/9000
appendonly yes
daemonize yes
logfile "redis_9000.log"
cs


port

클러스터에서는 conf파일에 설정한 '포트 + 10000' 번의 추가 포트를 열어주어야 합니다.

이 포트는 클러스터끼리의 통신을 위해 사용됩니다.


위의 conf 파일에서 7000, 8000, 9000 의 포트를 사용했으므로 17000, 18000, 19000 의 포트를 추가로 통신허용 해야합니다.


최소 노드

클러스터 구성을 위해서는 최소 3개의 노드가 필요합니다. ( redis-cli 명령어 사용 시 )

3개의 노드가 필요한 이유는 정족 수 때문입니다.

(정족 수는 https://mozi.tistory.com/378 링크의 맨 하단을 참고해 주세요)



클러스터 구성 방법


1. conf 파일에서 구성한 클러스터를 구동합니다.

1
2
3
$ redis-server 7000/redis_7000.conf 
$ redis-server 8000/redis_8000.conf 
$ redis-server 9000/redis_9000.conf 
cs


로그를 확인하면 아래와 같이 클러스터 모드라는 것을 알 수 있습니다.

참고로 레디스는 시작했지만 클러스터까지 구성된 상태는 아닙니다.

1
4279:M 22 Mar 2020 02:13:57.005 * Running mode=cluster, port=7000.
cs



2. 클러스터로 묶어줍니다.

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
29
$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:8000 127.0.0.1:9000
 
>>> Performing hash slots allocation on 3 nodes...
Master[0-> Slots 0 - 5460
Master[1-> Slots 5461 - 10922
Master[2-> Slots 10923 - 16383
M: 8b27f9ee6a0389ff9902883f298c24dbbcd7e192 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: d0d90875d0cab217ea8c5470b6f42877dacb647a 127.0.0.1:8000
   slots:[5461-10922] (5462 slots) master
M: f3ebf6b11ee07bb404d2a2d1b8e76c58916873d0 127.0.0.1:9000
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 8b27f9ee6a0389ff9902883f298c24dbbcd7e192 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: f3ebf6b11ee07bb404d2a2d1b8e76c58916873d0 127.0.0.1:9000
   slots:[10923-16383] (5461 slots) master
M: d0d90875d0cab217ea8c5470b6f42877dacb647a 127.0.0.1:8000
   slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered
cs

Line 1 : 클러스터로 구성하는 명령어 입니다.

Line 4-6 : 마스터별로 할당되는 슬롯범위를 출력합니다.

Line 7-12 : 노드별로 ID값과 슬롯번호를 구성합니다.

Line 16 : 클러스터에 조인합니다.

Line 26-29 : 클러스터가 구성이 되었습니다.


그리고 각 노드의 로그파일에는 클러스터가 구성되었다는 로그가 기록됩니다.

1
4279:M 22 Mar 2020 02:17:46.823 # Cluster state changed: ok
cs



클러스터 접속 방법 및 정보 확인방법


클러스터 접속 방법

클러스터로 접속할 때는 -c 옵션을 사용해주어야 합니다.

아래 cluster info 에서 접속할 때 명령어를 참고해 주세요.


cluster info 명령어

클러스터 상태 정보를 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ redis-cli --7000
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:403
cluster_stats_messages_pong_sent:400
cluster_stats_messages_sent:803
cluster_stats_messages_ping_received:398
cluster_stats_messages_pong_received:403
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:803
cs


Line 3 : 클러스터가 정상인 상태입니다.

Line 4 : 클러스터에 할당된 슬롯 개수 입니다.

Line 5 : 현재 구동된 클러스터에 할당된 슬롯 개수 입니다. (특정 노드 다운 시, 해당 노드의 슬롯 개수가 빠지게 됩니다.)

Line 7 : 인식하지 못하는 슬롯 개수입니다.

Line 8 : 클러스터에 구성된 모든 노드 수 입니다.

Line 9 : 클러스터 마스터 노드 수 입니다.


cluster nodes 명령어

각 클러스터 노드 ID와 IP, PORT 를 확인할 수 있습니다.

1
2
3
4
127.0.0.1:7000> cluster nodes
f3ebf6b11ee07bb404d2a2d1b8e76c58916873d0 127.0.0.1:9000@19000 master - 0 1584811339022 3 connected 10923-16383
d0d90875d0cab217ea8c5470b6f42877dacb647a 127.0.0.1:8000@18000 master - 0 1584811338510 2 connected 5461-10922
8b27f9ee6a0389ff9902883f298c24dbbcd7e192 127.0.0.1:7000@17000 myself,master - 0 1584811338000 1 connected 0-5460
cs



클러스터 모드에서 클라이언트 데이터 처리방법


클라이언트 데이터 처리방법

클라이언트는 레디스 서버에 접속해서 각 서버에 할당된 슬롯 정보를 먼저 가져옵니다.

키 입력 시, 서버와 동일한 Hash 알고리즘으로 슬롯값을 구한 후 해당 슬롯에 맞는 노드에 접속하여 요청을 처리합니다.


set, get 테스트 해보기

key에 mozi값을 할당할 때, Hash 함수에 의해 12539 슬롯값으로 지정되었고, 이 값은 9000노드에 있어 Redirect 되었습니다.

1
2
3
4
5
127.0.0.1:7000> set key mozi
-> Redirected to slot [12539] located at 127.0.0.1:9000
OK
127.0.0.1:9000> get key
"mozi"
cs


다른 노드에서 key를 조회하는 경우,

클러스터 노드에서 주는 슬롯정보를 사용하여 키가있는 노드로 Redirect 되어 데이터를 가져옵니다. 

1
2
3
127.0.0.1:7000> get key
-> Redirected to slot [12539] located at 127.0.0.1:9000
"mozi"
cs