구축하려는 Redis-Cluster 아키텍쳐는 아래와 같다.
wget https://download.redis.io/redis-stable.tar.gz
을 이용하거나 https://redis.io/download/#redis-downloads 에서 Latest Stable 항목에서 파일 다운로드 후 서버에 업로드하여 작업할 수 있다.
$ tar xvfzp redis-stable.tar.gz # 압축 해제
$ cd redis-stable
$ make # 소스 컴파일
3개 서버 모두에 설치해준다.
1번 서버에는 6300
6401
6402
포트
2번 서버에는 6301
6400
6502
포트
3번 서버에는 6302
6501
6500
포트
총 9개의 노드를 구성할 것이므로 redis.conf
파일을 복사하여 해당되는 서버에 아래처럼 설정파일명을 변경하고, 값을 설정한다.
$ vi redis_[각자포트].conf
port [각자포트]
# 백그라운드에서 시작하도록 설정
daemonize yes
# 클러스터를 사용하겠다.
cluster-enabled yes
# 클러스터 구성 내용을 저장한는 파일명 지정 (자동 생성됨)
cluster-config-file nodes-[각자포트].conf
# 클러스터 노드가 다운되었는지 판단하는 시간 (3s)
cluster-node-timeout 3000
# rdb파일명
dbfilename dump_[각자포트].rdb
# 프로세스 아이디 저장 경로 설정
pidfile /var/run/redis_[각자포트].pid
# 로그 파일 저장 경로 지정
logfile logs/redis_[각자포트].log
# 서로 다른 서버와 통신하기 위한 ip 명시
bind [각자 서버 IP] -::1
# 외부 서버 연결 허용
protected-mode no
logfile
설정값에 logs
폴더를 참조하도록 설정하였으므로, logs
폴더를 수동생성한다.
$ mkdir logs
설정을 마쳤다면 Redis의 각서버의 9개 노드를 모두 기동한다.
$ src/redis-server redis_[각자포트].conf
데몬으로 정상적으로 기동되었는지 각 서버를 확인한다.
$ ps -ef | grep redis
58509 1 0 9월15 ? 00:15:59 src/redis-server [1번서버ip]:6300 [cluster]
63969 1 0 9월15 ? 00:16:53 src/redis-server [1번서버ip]:6401 [cluster]
63986 1 0 9월15 ? 00:16:55 src/redis-server [1번서버ip]:6402 [cluster]
Master 노드를 생성하고, Slave 노드를 지정하여 Master 노드에 연결되도록 등록한다.
#master node create
$ src/redis-cli --cluster create [1번서버ip]:6300 [2번서버ip]:6301 [3번서버ip]:6302
#slave of master 6300 create
$ src/redis-cli --cluster add-node [2번서버ip]:6400 [1번서버ip]:6300 --cluster-slave
$ src/redis-cli --cluster add-node [3번서버ip]:6500 [1번서버ip]:6300 --cluster-slave
#slave of master 6301 create
$ src/redis-cli --cluster add-node [1번서버ip]:6401 [2번서버ip]:6301 --cluster-slave
$ src/redis-cli --cluster add-node [3번서버ip]:6501 [2번서버ip]:6301 --cluster-slave
#slave of master 6302 create
$ src/redis-cli --cluster add-node [1번서버ip]:6402 [3번서버ip]:6302 --cluster-slave
$ src/redis-cli --cluster add-node [2번서버ip]:6502 [3번서버ip]:6302 --cluster-slave
redis-cli
로 노드 중 하나에 연결하여, cluster nodes
로 노드 구성 확인
$ src/redis-cli -p 6300 -h [1번서버ip] -c
[1번서버]:6300> cluster nodes
5ffa9b6c5097c330cd5c604f4b1d742a19859fee [1번서버ip]:6402@16402 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663227748558 3 connected
85f1e733d24b4b00cfe18850c6fa52bc5dc51136 [1번서버ip]:6300@16300 myself,master - 0 1663227748000 6 connected 0-5460
08f7b7984921f0a508e40548d68e5b758237f7b9 [3번서버ip]:6302@16302 master - 0 1663227748000 3 connected 10923-16383
b20561b2ec96420ec820d3861ecba5012109d6a3 [3번서버ip]:6500@16500 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663227748760 3 connected
70f3d3b3b9dba9a4a70eb9ceaa1bd4e0c5eff1ff [1번서버ip]:6401@16401 slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663227749061 2 connected
683a043148eedfaab6cec58c5c6364249ef7c385 [2번서버ip]:6400@16400 slave 85f1e733d24b4b00cfe18850c6fa52bc5dc51136 0 1663227749000 6 connected
e17cfb86f37f4525fdf1adeb99ead329f4499321 [2번서버ip]:6301@16301 master - 0 1663227749062 2 connected 5461-10922
aac7e04e1939256757f29297a30b5e40221dd6ea [3번서버ip]:6501@16501 slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663227749062 2 connected
d29182da3ad9ff5681f5a8e5a71cc7b7db7cf22c [2번서버ip]:6502@16502 slave 85f1e733d24b4b00cfe18850c6fa52bc5dc51136 0 1663227749000 6 connected
테스트를 위해 1번서버의 6300 Master 노드를 Kill 한다.
$ src/redis-cli -p 6300 -h [1번서버ip] shutdown
$ ps -ef |grep redis
63969 1 0 9월15 ? 00:16:55 src/redis-server [1번서버ip]:6401 [cluster]
63986 1 0 9월15 ? 00:16:57 src/redis-server [1번서버ip]:6402 [cluster]
아직 살아있는 6401 노드에 접속하여 노드 구성정보를 확인한다.
$ src/redis-cli -p 6401 -h [1번서버ip] cluster nodes
683a043148eedfaab6cec58c5c6364249ef7c385 [2번서버ip]:6400@16400 master - 0 1663745953534 7 connected 0-5460
70f3d3b3b9dba9a4a70eb9ceaa1bd4e0c5eff1ff 127.0.0.1:6401@16401 myself,slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663745953000 2 connected
85f1e733d24b4b00cfe18850c6fa52bc5dc51136 [1번서버ip]:6300@16300 master,fail - 1663745899475 1663745898000 6 disconnected
e17cfb86f37f4525fdf1adeb99ead329f4499321 [2번서버ip]:6301@16301 master - 0 1663745953000 2 connected 5461-10922
aac7e04e1939256757f29297a30b5e40221dd6ea [3번서버ip]:6501@16501 slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663745953000 2 connected
08f7b7984921f0a508e40548d68e5b758237f7b9 [3번서버ip]:6302@16302 master - 0 1663745953000 3 connected 10923-16383
5ffa9b6c5097c330cd5c604f4b1d742a19859fee [1번서버ip]:6402@16402 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663745953534 3 connected
b20561b2ec96420ec820d3861ecba5012109d6a3 [3번서버ip]:6500@16500 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663745953735 3 connected
d29182da3ad9ff5681f5a8e5a71cc7b7db7cf22c [2번서버ip]:6502@16502 slave 683a043148eedfaab6cec58c5c6364249ef7c385 0 1663745953534 7 connected
6300 노드가 disconnected
되고, 6400 노드가 새로운 Master로 승격되었음을 확인할 수 있다.
6300 노드를 재기동하면 아래와 같이 Slave 서버로 다시 재기동 된다.
$ src/redis-server redis_6300.conf
$ src/redis-cli -p 6401 -h [1번서버ip] cluster nodes
683a043148eedfaab6cec58c5c6364249ef7c385 [2번서버ip]:6400@16400 master - 0 1663746125527 7 connected 0-5460
70f3d3b3b9dba9a4a70eb9ceaa1bd4e0c5eff1ff 127.0.0.1:6401@16401 myself,slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663746124000 2 connected
85f1e733d24b4b00cfe18850c6fa52bc5dc51136 [1번서버ip]:6300@16300 slave 683a043148eedfaab6cec58c5c6364249ef7c385 0 1663746124924 7 connected
e17cfb86f37f4525fdf1adeb99ead329f4499321 [2번서버ip]:6301@16301 master - 0 1663746125527 2 connected 5461-10922
aac7e04e1939256757f29297a30b5e40221dd6ea [3번서버ip]:6501@16501 slave e17cfb86f37f4525fdf1adeb99ead329f4499321 0 1663746126029 2 connected
08f7b7984921f0a508e40548d68e5b758237f7b9 [3번서버ip]:6302@16302 master - 0 1663746125527 3 connected 10923-16383
5ffa9b6c5097c330cd5c604f4b1d742a19859fee [1번서버ip]:6402@16402 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663746126028 3 connected
b20561b2ec96420ec820d3861ecba5012109d6a3 [3번서버ip]:6500@16500 slave 08f7b7984921f0a508e40548d68e5b758237f7b9 0 1663746125527 3 connected
d29182da3ad9ff5681f5a8e5a71cc7b7db7cf22c [2번서버ip]:6502@16502 slave 683a043148eedfaab6cec58c5c6364249ef7c385 0 1663746126029 7 connected
Master 노드 중 한 곳에 데이터를 저장하고 다른 Master 노드가 해당 데이터를 참조가능한지 확인해보자
1번서버에는 모두 Slave 노드로 변경되었으므로, 2번서버의 6400 Master 노드에 접속하여 데이터를 추가한다.
$ src/redis-cli -p 6400 -h [2번서버ip]
[2번서버ip]:6400> set fruit banana
OK
[2번서버ip]:6400> get fruit
"banana"
다른 Master 노드인 6301 노드에 접속하여 데이터를 확인한다.
$ src/redis-cli -p 6301 -h [2번서버ip]
[2번서버ip]:6301> get fruit
(error) MOVED 1821 [2번서버ip]:6400
MOVED
에러가 발생하지만 해당 값이 어떤 노드에 위치해 있는지를 알려준다.
다른 노드에서도 값을 자유롭게 조회하고 싶다면 아래 명령어를 사용하여 접속 후 조회하면 된다.
# -h : hostname -p : port -c : clustermode
$ src/redis-cli -p 6301 -h [2번서버ip] -c
[2번서버ip]:6301> get fruit
-> Redirected to slot [1821] located at [2번서버ip]:6400
"banana"