Redis-Cluster 설치

lightcat·2022년 9월 21일
0

Redis-Cluster 기본개념

  • 기본적으로 데이터는 Master 노드 중 한곳에 저장
  • Master 노드가 죽으면 Slave 노드가 Master로 자동 Failover됨
  • 최소 3개의 마스터 노드가 존재해야 구성 가능 (3개의 노드를 지정하지 않으면 Error 발생)

Redis-Cluster Architecture

구축하려는 Redis-Cluster 아키텍쳐는 아래와 같다.

  • 서버 1,2,3 에 구축하여 3개 서버중 2대가 죽더라도 3개의 Cluster Node를 유지할수 있도록 구성
  • 각 Master Node에 2개의 Slave Node를 연결
  • 각 Slave Node를 Master Node와 다른 서버에 위치시킴으로써 서버종료로 인한 Failover 수행이 가능하도록 구성

Redis 설치, 설정 및 기동

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]

Cluster Node 구성

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

FailOver Check

테스트를 위해 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

Redirect Check

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"

참고
5분 안에 구축하는 Redis-Cluster
Redis CLUSTER Redis-cli 사용법

0개의 댓글

관련 채용 정보