서론
오랜만에 한다...Redis...
까먹었을까봐 끄적여봅디다..
구성한다 Cluster 아래와 같은 아키텍쳐로!!
각 서버에 각 인스턴스를 올리는게 베스트겠지만, 서버를 그렇게 많이 준비할 순 없으니까..
3개의 서버에 각 2개의 인스턴스(master,replica)를 올리고 가용성을 위해 크로스로 cluster를 구성하려합니다.
(최대한 서버를 죽지않게 하기위해..)
본론
서버 정보 - Redis버전정보
서버1
CentOS Linux release 7.3.1611 (Core) - Redis 6.2.1
서버2
Red Hat Enterprise Linux Server release 7.6 (Maipo) - Redis 6.2.3
서버3
Red Hat Enterprise Linux Server release 7.6 (Maipo) - Redis 6.2.3
(서버를 긁어모으다보니 개판이다)
Redis 인스턴스 준비
깔끔한 상태, 데이터가 없는 Redis 인스턴스 6대 준비
config 설정
기본설정
bind 0.0.0.0
port <useport>
daemonize yes
requirepass <password>
cluster 설정
masterauth <password>
cluster-enabled yes
cluster-config-file <conf file name>
깔끔한 master 상태의 인스턴스 6대
master cluster 구성
구성은 한서버에서만 진행하며, redis-cli 를 이용해 cluster를 구성합니다.
redis-cli -a <password> --cluster create <ip:port> <ip:port> <ip:port>
Replica 까지 한번에 구성하려면?
redis-cli -a <password> --cluster create <ip:port> <ip:port> <ip:port> \
<ip:port> <ip:port> <ip:port> --cluster-replicas 1
-- cluster-replicas 1 은 각 마스터 마다 1개의 복제본이 필요하다는 뜻으로
각 마스터가 하나의 Replica를 가진채 cluster가 구성됩니다.
다만 위와같은 경우에 복제본에 마스터가 지정되지않고 임의의 마스터를 가지게 됩니다.
따라서 여러번의 failover가 이루어졌을때 원할한 failover 가 이루어지지 않게 될수있어
ex)같은 서버에 master가 2대
단일 서버에 여러 인스턴스를 올려 구성할때는 가용성 측면에서 아래와 같이 마스터를 지정해서 cluster를 구성해주는것이 좋다고 생각합니다.
(각 인스턴스가 물리적으로 분리된 서버의 경우는 노프라블럼..)
미리 슬롯이 할당되는 구성을 알려주고 이대로 구성할것인지 묻는다.
# redis-cli -a <password> --cluster create 10.65.50.70:7000 10.65.50.71:7000 10.65.50.72:7000
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000
slots:[0-5460] (5461 slots) master
M: 10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000
slots:[5461-10922] (5462 slots) master
M: 0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000
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 10.65.50.70:7000)
M: e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000
slots:[0-5460] (5461 slots) master
M: 0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000
slots:[10923-16383] (5461 slots) master
M: 10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000
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.
해당 인스턴스에 접속해보면 cluster 구성이 잘 이루어진 것을 볼 수 있습니다.
마스터를 지정하기 위해선 ip 앞에 마스터 id 정보를 알아야하기떄문에 메모장에 복붙해두시고
127.0.0.1:7000> cluster nodes
0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000@17000 master - 0 1681106270328 3 connected 10923-16383
e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000@17000 myself,master - 0 1681106267000 1 connected 0-5460
10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000@17000 master - 0 1681106269326 2 connected 5461-10922
현재 이상태로 구성이 되어있는 것
이제 여기다가 replica를 하나씩 붙여줍니다.
#작업 서버와 master노드 서버가 같을때
redis-cli -a <password> --cluster add-node <replicaip:port> <masterip:port> --cluster-slave
ex) 70번 서버에서 70번 서버의 7000번 포트 인스턴스에 71번 서버의 8000포트의 인스턴스를 replica로 붙이기
# redis-cli -a <password> --cluster add-node 10.65.50.72:8000 10.65.50.70:7000 --cluster-slave
>>> Adding node 10.65.50.72:8000 to cluster 10.65.50.70:7000
>>> Performing Cluster Check (using node 10.65.50.70:7000)
...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 10.65.50.70:7000
>>> Send CLUSTER MEET to node 10.65.50.72:8000 to make it join the cluster.
Waiting for the cluster to join
>>> Configure node as replica of 10.65.50.70:7000.
[OK] New node added correctly.
구성확인
127.0.0.1:7000> cluster nodes
e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000@17000 myself,master - 0 1681111274000 1 connected 0-5460
0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000@17000 master - 0 1681111275474 3 connected 10923-16383
83e877e62a2511953a2196a44a6f2f65d6dfee18 10.65.50.72:8000@18000 slave e6f8b931e56271774ac47df44ec1828496c7fabe 0 1681111273472 1 connected
10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000@17000 master - 0 1681111274473 2 connected 5461-10922
slave로 붙어있는 것을 볼 수 있습니다.
작업 서버와 지정해줄 master노드의 서버가 다르면 master노드의 id를 지정해주야합니다.
ip가 다른데 위와 같은 방식으로 진행하면 해당 ip의 해당 port들만 cluster구성을 공유하고, 같은 ip의 다른 포트의 인스턴스,다른ip의 인스턴스들은 공유가 되지 않기때문에 주의해야합니다.
(으악 싶을정도로 꼬여버리게됩니다..)
#작업 서버와 master노드 서버가 다를때
redis-cli -a <password> --cluster add-node <replicaip:port> <masterip:port> --cluster-slave\
--cluster-master-id <masterid>
ex) 70번 서버에서 72번 서버의 7000번 포트 인스턴스에 71번 서버의 8000포트의 인스턴스를 replica로 붙이기
#redis-cli -a kom8544 --cluster add-node 10.65.50.71:8000 10.65.50.72:7000 --cluster-slave --cluster-master-id 0e756a5fe56f5458659e2f605a0c228f4b60204a
>>> Adding node 10.65.50.71:8000 to cluster 10.65.50.72:7000
>>> Performing Cluster Check (using node 10.65.50.72:7000)
...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.65.50.71:8000 to make it join the cluster.
Waiting for the cluster to join
>>> Configure node as replica of 10.65.50.72:7000.
[OK] New node added correctly.
역시 slave로 붙어있는 것을 볼 수 있습니다.
127.0.0.1:7000> cluster nodes
e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000@17000 master - 0 1681111914607 1 connected 0-5460
10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000@17000 master - 0 1681111914000 2 connected 5461-10922
83e877e62a2511953a2196a44a6f2f65d6dfee18 10.65.50.72:8000@18000 slave e6f8b931e56271774ac47df44ec1828496c7fabe 0 1681111915000 1 connected
0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000@17000 myself,master - 0 1681111913000 3 connected 10923-16383
06cbf9e4ed0f7a01f5eb0bd679a02df8bb94d75c 10.65.50.71:8000@18000 slave 0e756a5fe56f5458659e2f605a0c228f4b60204a 0 1681111915611 3 connected
결론
두 방법 중 하나를 사용해 남은 인스턴스도 하나 더 붙여주면
위와 같은 구조의 cluster 완성:)
failover 테스트
-70번 서버 master를 다운
-72번 서버의 replica가 master로 올라올 것
#127.0.0.1:8000> role
1) "slave"
2) "10.65.50.70"
3) (integer) 7000
4) "connect"
5) (integer) -1
#127.0.0.1:8000> role
1) "master"
2) (integer) 3500
3) (empty array)
#127.0.0.1:8000> cluster nodes
8080ce8bef3c3fa74fa09a2778bd21f8076f2054 10.65.50.70:8000@18000 slave 10c6361aead5dd9a3d07367a8c3bfe868da05da4 0 1681113033833 2 connected
83e877e62a2511953a2196a44a6f2f65d6dfee18 10.65.50.72:8000@18000 myself,master - 0 1681113032000 4 connected 0-5460
10c6361aead5dd9a3d07367a8c3bfe868da05da4 10.65.50.71:7000@17000 master - 0 1681113032000 2 connected 5461-10922
349aaf1efdc9473bbaa59a133c921b3801130821 10.65.50.71:8000@18000 slave 0e756a5fe56f5458659e2f605a0c228f4b60204a 0 1681113033000 3 connected
e6f8b931e56271774ac47df44ec1828496c7fabe 10.65.50.70:7000@17000 master,fail - 1681112992527 1681112990520 1 disconnected
0e756a5fe56f5458659e2f605a0c228f4b60204a 10.65.50.72:7000@17000 master - 0 1681113031000 3 connected 10923-16383
failover도 생각대로 잘 이루어진다:)
'DB > Redis' 카테고리의 다른 글
[Redis]Cluster 인스턴스 실행 오류,Unrecoverable error: corrupted cluster config file. (3) | 2023.04.11 |
---|---|
[Redis] redis 7.0 Snapcraft 설치하기 (1) | 2022.05.25 |
[Redis]sentinel 원하는 Master로 지정승격하기,승격우선순위 (0) | 2021.06.23 |
[Redis] 인스턴스 실행오류,bind 오류 (0) | 2021.06.22 |
[Redis]Redis 시작하기, 서버 설치 스크립트 사용법 (0) | 2021.06.16 |