Cluster 구성 튜토리얼
[Redis Documentation #2] 레디스 클러스터 튜토리얼
Redis 설치
docker로 ubuntu 18.04 실행하기
docker run -d -i --name ubuntu ubuntu:18.04
docker exec -it ubuntu /bin/bash
redis 설치
# repository 추가
apt install software-properties-common
add-apt-repository ppa:chris-lea/redis-server
apt-get update
# redis-server 설치 (redis-cli 포함)
apt-get install redis-server -y
# redis version
redis-server --version
redis 삭제
apt-get purge --auto-remove redis-server
Cluster 생성
최소한의 redis.conf 설정
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
cluster를 제대로 작동시키려면 최소 3대의 마스터 노드와 3대의 슬레이브 노드가 필요하다
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005 7006
vi redis.conf
...
cp redis.conf 7001
cp redis.conf 700...
redis-server 실행 (7000~7005까지 수행)
cd 700x
redis-server ./redis.conf
cluster create
3개의 마스터와 3개의 슬레이브가 있는 클러스터를 생성한다. cluster-replicas
옵션은 생성된 모든 마스터에 대해 슬레이브를 붙인다는 의미이다. redis-cli가 구성을 제안하면 yes
를 입력하여 수락하면 된다.
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: 443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003
replicates ade6e4a5f9068bb9385aec134780ccfc87865b98
S: 44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004
replicates 0e98eb736a9b57b552db664175d7ea8b9d207f80
S: 6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005
replicates e20bf8864a8ebc7c10be263b4680c19177fe1e5e
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: e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004
slots: (0 slots) slave
replicates 0e98eb736a9b57b552db664175d7ea8b9d207f80
S: 443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003
slots: (0 slots) slave
replicates ade6e4a5f9068bb9385aec134780ccfc87865b98
M: 0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005
slots: (0 slots) slave
replicates e20bf8864a8ebc7c10be263b4680c19177fe1e5e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Cluster에 set/get 해보기
redis-cli를 cluster mode로 접속하기 (-c)
redis-cli -c -h 127.0.0.1 # 127.0.0.1:6379
redis-cli -c -p 7000 # 127.0.0.1:7000
redis-cli -c -h 127.0.0.1 -p 7000 # 127.0.0.1:7000
redis 127.0.0.1:7000> _
cluster mode로 접속하면 redirect를 자동으로 커버해 준다.
root@f56882e252d7:/# redis-cli -c -h 127.0.0.1 -p 7000
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set hello world # 7002로 접속되었다
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get foo # 7000로 접속되었다
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
127.0.0.1:7002> get hello # 7002로 접속되었다
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"
127.0.0.1:7000> get hello # 7000로 접속되었다
"world"
127.0.0.1:7000>
Failover 테스트
클러스터의 구성을 확인한다
$ redis-cli -p 7000 cluster nodes
ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001@17001 master - 0 1630143660544 2 connected 5461-10922
44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004@17004 slave 0e98eb736a9b57b552db664175d7ea8b9d207f80 0 1630143659000 3 connected
443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003@17003 slave ade6e4a5f9068bb9385aec134780ccfc87865b98 0 1630143660000 2 connected
e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000@17000 myself,master - 0 1630143660000 1 connected 0-5460
0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002@17002 master - 0 1630143659538 3 connected 10923-16383
6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005@17005 slave e20bf8864a8ebc7c10be263b4680c19177fe1e5e 0 1630143659639 1 connected
클러스터의 master/slave 연결은 다음과 같다.
- master: 7000 - slave: 7005
- master: 7001 - slave: 7003
- master: 7002 - slave: 7004
7002 노드에 크래시를 발생시켜 죽여본다.
$ redis-cli -p 7002 debug segfault
Error: Server closed the connection
클러스터의 구성을 다시 확인한다
$ redis-cli -p 7000 cluster nodes
ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001@17001 master - 0 1630143890698 2 connected 5461-10922
44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004@17004 master - 0 1630143890000 7 connected 10923-16383
443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003@17003 slave ade6e4a5f9068bb9385aec134780ccfc87865b98 0 1630143890196 2 connected
e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000@17000 myself,master - 0 1630143890000 1 connected 0-5460
0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002@17002 master,fail - 1630143870073 1630143868000 3 disconnected
6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005@17005 slave e20bf8864a8ebc7c10be263b4680c19177fe1e5e 0 1630143889189 1 connected
클러스터의 master/slave 연결은 다음과 같다.
- master: 7000 - slave: 7005
- master: 7001 - slave: 7003
- master: 7004 - slave: N/A
- master: 7002 (fail)
7002노드에 있던 데이터를 조회해보자
$ redis-cli -c -p 7000 # 7002를 크래시 하기 전에 연결되어 있던 redis-cli
127.0.0.1:7000> get foo # 7004 노드로 연결되어 데이터가 조회된다
-> Redirected to slot [12182] located at 127.0.0.1:7004
"bar"
127.0.0.1:7004>
마스터 7004 노드에 새로운 슬레이브 7006을 연결한 후 7004를 죽여보자
7006 노드를 실행한다.
7006 $ redis-server ./redis-conf
No cluster configuration found, I'm 8c13c10532845b2f85a5d5d10a45851781b396d2
7006을 7004의 슬레이브로 추가한다. 7004의 id를 지정한다.
$ redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 44189bdcdbeff5640d2d94a8eb3789b652298513
$ redis-cli -p 7000 cluster nodes
ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001@17001 master - 0 1630144529600 2 connected 5461-10922
8c13c10532845b2f85a5d5d10a45851781b396d2 127.0.0.1:7006@17006 slave 44189bdcdbeff5640d2d94a8eb3789b652298513 0 1630144529601 7 connected
44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004@17004 master - 0 1630144528088 7 connected 10923-16383
443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003@17003 slave ade6e4a5f9068bb9385aec134780ccfc87865b98 0 1630144529000 2 connected
e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000@17000 myself,master - 0 1630144529000 1 connected 0-5460
0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002@17002 master,fail - 1630143870073 1630143868000 3 disconnected
6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005@17005 slave e20bf8864a8ebc7c10be263b4680c19177fe1e5e 0 1630144528592 1 connected
7006이 7004의 슬레이브로 연결된 것을 확인할 수 있다.
7004에서 크래시를 발생시킨다.
$ redis-cli -p 7004 debug segfault
Error: Server closed the connection
# 7004가 fail 상태가 되고 7006이 마스터로 승격했다.
$ redis-cli -p 7000 cluster nodes
ade6e4a5f9068bb9385aec134780ccfc87865b98 127.0.0.1:7001@17001 master - 0 1630144707564 2 connected 5461-10922
8c13c10532845b2f85a5d5d10a45851781b396d2 127.0.0.1:7006@17006 master - 0 1630144707000 8 connected 10923-16383
44189bdcdbeff5640d2d94a8eb3789b652298513 127.0.0.1:7004@17004 master,fail - 1630144647927 1630144645412 7 disconnected
443d28972a19da400abbe3c3d5979eb1c567255e 127.0.0.1:7003@17003 slave ade6e4a5f9068bb9385aec134780ccfc87865b98 0 1630144707000 2 connected
e20bf8864a8ebc7c10be263b4680c19177fe1e5e 127.0.0.1:7000@17000 myself,master - 0 1630144707000 1 connected 0-5460
0e98eb736a9b57b552db664175d7ea8b9d207f80 127.0.0.1:7002@17002 master,fail - 1630143870073 1630143868000 3 disconnected
6156ddfd8ac26bb44e9c065a68e4d5379836927a 127.0.0.1:7005@17005 slave e20bf8864a8ebc7c10be263b4680c19177fe1e5e 0 1630144707867 1 connected
7004가 크래시된 후 7006을 모르던 클라이언트에서 7006에서 데이터가 조회되는지 확인해보자.
7004에 연결되어 있던 client에서 7006에 있는 데이터를 조회해 본다 -> 실패
$ redis-cli -c -p 7000 # 7002를 크래시 하기 전에 연결되어 있던 redis-cli
... # 이전에 7004의 데이터를 조회했기 때문에 redirect 되어 7004에 연결되어 있는 상태이다.
127.0.0.1:7004>
(7004 크래시 발생, 7006이 마스터로 승격됨)
127.0.0.1:7004> get foo # 7004에서 요청을 받아줄 수 없기 때문에 오류
Could not connect to Redis at 127.0.0.1:7004: Connection refused
not connected>
7000에 연결되어 있던 client에서 7006에 있는 데이터를 조회해 본다 -> 성공
$ redis-cli -c -p 7000 # 7002를 크래시 하기 전에 연결되어 있던 redis-cli
127.0.0.1:7000>
(7004 크래시 발생, 7006이 마스터로 승격됨)
127.0.0.1:7000> get foo # 7006으로 redirect되어 데이터가 조회된다.
-> Redirected to slot [12182] located at 127.0.0.1:7006
"bar"
127.0.0.1:7006>
multi key command
mget을 여러 노드에 있는 key를 대상으로 수행 -> 에러 발생
127.0.0.1:7000> mget hello foo
(error) CROSSSLOT Keys in request don't hash to the same slot
key들의 해시값이 동일한 slot이 아니기 때문에 오류 발생함
동일한 노드에 있는 key를 대상으로 mget 수행
여러 개의 key를 생성한다.
- 127.0.0.1:7000 - hello3 [3359]
- 127.0.0.1:7001 - hello2 [7486], hello6 [7610]
- 127.0.0.1:7006 - hello1 [11613], hello4 [15864], hello5 [11737]
127.0.0.1:7000> set hello1 world1
-> Redirected to slot [11613] located at 127.0.0.1:7006
OK
127.0.0.1:7006> set hello2 world2
-> Redirected to slot [7486] located at 127.0.0.1:7001
OK
127.0.0.1:7001> set hello3 world3
-> Redirected to slot [3359] located at 127.0.0.1:7000
OK
127.0.0.1:7000> set hello4 world4
-> Redirected to slot [15864] located at 127.0.0.1:7006
OK
127.0.0.1:7006> set hello5 world5
OK
127.0.0.1:7006> set hello6 world6
-> Redirected to slot [7610] located at 127.0.0.1:7001
OK
7006노드에 있는 key 3개를 mget으로 조회한다. 단, hash slot은 다르다.
hash slot이 각각 다르기 때문에 조회가 안되는 것을 알 수 있다.
127.0.0.1:7006> mget hello1 hello4 hello5
(error) CROSSSLOT Keys in request don't hash to the same slot
즉, hash slot이 다른 key들은 multi key command를 사용할 수 없다.
필요하다면 hash slot을 모두 계산한 다음, 동일한 slot을 가지는 key들을 묶어서 multi key command를 수행해야 한다.
'잡다구리' 카테고리의 다른 글
reactor: 동기적인 블로킹 호출을 감싸기 (0) | 2022.08.13 |
---|---|
reactor: publishOn, subscribeOn() (0) | 2022.08.13 |
docker-compose에서 다른 서비스가 healthy 상태여야 특정 서비스를 기동하여야 할 때 (0) | 2022.08.13 |
스레드 상태 (Thread State) (0) | 2022.08.12 |
redis docker (0) | 2021.08.24 |
날짜와 시간 (0) | 2021.07.31 |
스프링 배치 완벽 가이드 - 6. 잡 실행하기 (0) | 2021.05.09 |
스프링 배치 완벽 가이드 - 5. JobRepository와 메타데이터 (0) | 2021.05.06 |
댓글