본문 바로가기
DB|Cache/Redis

Redis Cluster 테스트 환경 구축하기

by 크라크라 2024. 3. 14.

레디스를 단순하게 쓰시는 분도 있고, 어렵고 고성능을 위해서 사용하시는 분도 있으실겁니다. 

 

고수들은 많지만 저 같이 배워나가는 사람들은 일단 간단하게라도 테스트 환경을 구축해보고 이것저것 실험해보는 것이 많은 도움이 됩니다. 혹시나 또 저 같은 분들을 위해서 간단하게 레디스 공홈에서 레디스 클러스터에 대한 로컬 테스트 환경 설정하는 부분을 가져와봤습니다. 

 

https://redis.io/docs/management/scaling/

 

Scale with Redis Cluster

Horizontal scaling with Redis Cluster

redis.io

 

마찬가지로 WSL 이 설정이 되어있어야하고요, 리눅스이신 분들은 바로 따라서 실험해보셔도 무방할 것 같습니다.

윈도우에서 진행해보시는 분들의 경우 WSL 및 최초 레디스 설치는 이 글을 따라해보시면 좋을 것 같습니다.

 

Window에서 Redis 테스트 환경 구축하기

 

Window에서 Redis 테스트 환경 구축하기

기존의 방식은 리눅스 용으로 개발되었던 버전을 윈도우용으로 포팅한 라이브러리를 설치해서 사용하는 것이었습니다. https://github.com/microsoftarchive/redis/releases Releases · microsoftarchive/redis Redis is a

toycoding.tistory.com

 


 

<테스트 환경 설정 목표>

 

1. 포트 7000 ~ 7005 를 사용해서 Master 3개, Slave 3개 노드를 생성합니다.

2. 간단한 데이터들 입력할 때 자유롭게 여러 노드들을 이동하면서 데이터가 입력되는 것을 확인합니다. 

 

 


 

 

<Redis-Cluster 설정하기>

 

 기본설정에 따라서 설치를 했다면 /etc/redis 폴더 안에 redis.conf 파일이 있고 이것으로 실행한 레디스는 6379포트로 연결이 되어있을 것입니다. 7000~ 7005번에 각각 레디스를 띄워서 마치 여러 개의 서버/노드인 것처럼 구성을 하겠습니다. 

차후에 실제 운영 서버에 배포할 때는 각각의 서버에 맞는 설정으로 적용될 것입니다. 

 

관리하기가 까다로우므로 /etc/redis 폴더 안에 cluster-test 라는 폴더를 생성합니다. 

이 폴더 안에는 다시 각각의 포트번호로 폴더를 생성합니다. 

cd /etc/redis
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

 

그 안에 redis.conf 파일을 복사합니다. ( find exec 구문의 사용법이라고 합니다.)

cd /etc/redis
find cluster-test/700* -type d -exec cp redis.conf {} \;

 

그리고 각 포트번호 폴더 안에 들어가서 redis.conf 를 수정합니다. (이것이 불편하신 분들은 기본 redis.conf 를 일단 먼저 수정하신 다음에 복사를 하시면 될 것 같습니다. ) redis cluster 에 관련된 설정을 변경해주고, redis 가 실행되는 포트 번호를 각각의 폴더에 맞게 변경해줍니다. 

 

각각의 기본 설정은 다음과 같습니다. (고급 설정은 별도로 포스팅하도록 하겠습니다. ) 

cluster-port 설정은 레디스 노드간 통신을 하도록 해주는 별도의 port 인데 기본값은 설정된 레디스 포트 +10000 번 포트를 사용하게 되어있습니다. 별도 설정시에만 세팅을 해주면 됩니다. 

참고로 로컬이 아닌 환경에서는 클라이언트가 클러스터에 접근하는 포트 (기본 port ) 가 방화벽이 오픈되어있어야하고, 각 노드간 통신을 위해서 각 노드의 클러스터 버스 포트가 각각의 노드에서 방화벽이 오픈되어 있어야합니다. 

# 각 폴더의 포트번호를 사용 7000 ~ 7005
port 7000
cluster-enabled yes
# nodes.conf 가 기본값이나 로컬용은 같은 서버에 띄우기 때문에 이름이 동일하면 서비스 띄울 때 오류가 난다
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
cluster-port 17000

 

이제 설정이 끝났다면 각각을 모두 실행해봅시다. 실행되는 것을 각각 분리해서 보고 싶다면 여러 개의 창을 띄워두는 것이 좋습니다. 윈도우를 사용할 경우라면 Windows Terminal 이라는 프로그램을 Windows Store 에서 받아서 사용하면 창을 여러 개 띄우는 것을 편리하게 할 수 있습니다. 리눅스라면 일반적으로 사용하는 프로그램에서 접속 창을 여러 개 띄워두면 됩니다. 

 

cd /etc/redis/cluster-test
# 각각의 포트번호에 해당하는 폴더
cd 7000
redis-server ./redis.conf

 

그러면 아래처럼 nodeID를 확인할 수 있게 됩니다. 

[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1

 

확인이 안되는 경우에는 /var/log/redis/redis-server.log 를 확인해보면 거기에서 실행되면서 작성된 로그에 내용이 남아있습니다. 실제로 로그를 확인해보면 이런 식의 로그를 확인해 볼 수 있습니다. 

2073:C 14 Mar 2024 00:11:25.337 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
2073:C 14 Mar 2024 00:11:25.337 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2074:C 14 Mar 2024 00:11:25.337 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2074:C 14 Mar 2024 00:11:25.337 * Redis version=7.2.4, bits=64, commit=00000000, modified=0, pid=2074, just started
2074:C 14 Mar 2024 00:11:25.337 * Configuration loaded
2074:M 14 Mar 2024 00:11:25.338 * Increased maximum number of open files to 10032 (it was originally set to 1024).
2074:M 14 Mar 2024 00:11:25.338 * monotonic clock: POSIX clock_gettime
2074:M 14 Mar 2024 00:11:25.338 # Failed to write PID file: No such file or directory
2074:M 14 Mar 2024 00:11:25.338 * Running mode=cluster, port=7001.
2074:M 14 Mar 2024 00:11:25.338 * Node configuration loaded, I'm 004c29b97653f435ff5f3a67b6749f437b22ee8c
2074:M 14 Mar 2024 00:11:25.339 * Server initialized
2074:M 14 Mar 2024 00:11:25.341 * Reading RDB base file on AOF loading...
2074:M 14 Mar 2024 00:11:25.341 * Loading RDB produced by version 7.2.4
2074:M 14 Mar 2024 00:11:25.341 * RDB age 30 seconds
2074:M 14 Mar 2024 00:11:25.341 * RDB memory usage when created 1.51 Mb
2074:M 14 Mar 2024 00:11:25.341 * RDB is base AOF
2074:M 14 Mar 2024 00:11:25.341 * Done loading RDB, keys loaded: 0, keys expired: 0.
2074:M 14 Mar 2024 00:11:25.341 * DB loaded from base file appendonly.aof.1.base.rdb: 0.002 seconds
2074:M 14 Mar 2024 00:11:25.341 * DB loaded from append only file: 0.002 seconds
2074:M 14 Mar 2024 00:11:25.341 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
2074:M 14 Mar 2024 00:11:25.341 * Ready to accept connections tcp

 

 

7000 포트부터 7005 포트에 대해서 모두 실행을 했다면 이제 이 레디스 들을 클러스터로 묶어봅시다. 

 

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

 

이렇게 하면 각각의 마스터가 하나의 복제본을 가지도록 설정됩니다. 최소 3개의 노드가 각각 1개씩의 복제본을 가지므로 최소 설정에서 6개의 노드가 필요한 것이죠. 만약에 복제본 숫자를 (cluster-replicas) 를 2로 올리게 되면 최소 9개의 노드를 가지고 시도하라는 내용의 에러 메시지를 확인할 수 있습니다. 

 

정상적인 시도를 하게 된다면 다음 처럼 3개의 마스터가 각각 포트 7000, 7001, 7002 에 생기게 되고 슬롯 0부터 16383 까지의 슬롯을 각 마스터에서 나뉘어 가지게 되는 것을 볼 수 있습니다. ( 샤딩이죠?) 

 

그리고 7003,7004,7005 노드는 마스터의 복제본을 생성되는 것을 볼 수 있습니다. 

 

>>> 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
# 로컬 테스트 때문에 slave 와 master 가 같은 서버에 있어서 나오는 경고 메시지
[WARNING] Some slaves are in the same host as their master
M: c459f2a525f5a5ab7221d170eff4939ca3be4ffd 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: 5146072ec530414e15ebea06892e0815a06bd2fd 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
M: 5419e2cc9639ce3d632f0ecfcc7b2b119daa0597 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
S: d48e05e1443bcf77ad49a71a3807d3543a9c01a8 127.0.0.1:7003
   replicates c459f2a525f5a5ab7221d170eff4939ca3be4ffd
S: 23a600d3c67a05e27c6c820fd9e304dd453ce679 127.0.0.1:7004
   replicates 5146072ec530414e15ebea06892e0815a06bd2fd
S: ed412848e5ca69f3bcb58d69f80fe51a4fd09d4a 127.0.0.1:7005
   replicates 5419e2cc9639ce3d632f0ecfcc7b2b119daa0597

 

마지막에 yes/no 를 묻는 것은 yes를 입력해줍니다.

정상적으로 클러스터 설정이 된다면 다음의 메시지가 출력됩니다.

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

 


 

< 간단한 입출력 테스트 >

 

이렇게 기본 환경 설정을 마쳤습니다. 이제 여기에 간단한 데이터들을 입/출력해보면서 클러스터를 확인해보겠습니다. 

 

각각의 레디스는 별개로 떠 있기 때문에 기본 방식대로 접근이 가능합니다. 다만 기본 방식으로 사용하면 클러스터의 기능을 쓸 수 없습니다. 클러스터의 기능을 쓴 다는 것을 명시해줘야 합니다. 

# 기본 접근방식
redis-cli -p 7000
# 클러스터 접근 방식
redis-cli -c -p 7000

 

클러스터 방식으로 접근하게 되면 7000 - 7005 번 어떤 포트로 접근해서 데이터를 저장하더라도 마스터로 데이터가 넘어가게 됩니다. 기본 방식으로 접근하면 데이터 저장이 불가능하고, 마스터로 접근했을 때만 데이터 확인이 가능합니다. 

 

커맨드 마스터 여부 기본 클러스터
set foo5 bar5 Master O/X O
set foo5 bar5 Slave X O
get foo5 Master O O
get foo5 Slave X O

 

또한 클러스터 기능을 사용할 때는 자동적으로 데이터가 저장되는 노드로 redirect 가 일어나게 됩니다.

클러스터 기능을 사용시에는 Master / Slave 모두 저장이 됩니다.

# Slave 로 클러스터 접속 
redis-cli -c -p 7005

# Slave 에서 데이터 저장 O 
127.0.0.1:7005> set foo2 bar2
-> Redirected to slot [1044] located at 127.0.0.1:7000
OK
# Master 에서 데이터 저장 O 
127.0.0.1:7000> set foo0 bar0
-> Redirected to slot [9302] located at 127.0.0.1:7001
OK

 

클러스터 기능을 사용하지 않을 경우에는 Master에서는 저장이 될 수도 있고, 안될 수도 있으며 Slave에서는 저장이 되지 않는다. 

# Slave 에서 데이터 저장 X
redis-cli -p 7005
127.0.0.1:7005> set foo1 bar1
(error) MOVED 13431 127.0.0.1:7002

# Master 에서 데이터 저장 O/X
redis-cli -p 7002
127.0.0.1:7002> set foo1 bar1
OK
127.0.0.1:7002> set foo3 bar3
(error) MOVED 5173 127.0.0.1:7000

 

조회 시에는 클러스터 기능을 사용하게 되면 실제 모든 노드를 다 뒤져서 데이터를 확인하는데, 기본 기능으로 사용하게 되면 접근한 해당 노드에서만 데이터를 확인하게 됩니다. 

 

 

각 클러스터의 전체 정보를 체크해보기 위해서는 다음 커맨드를 실행해보면 됩니다. 

클러스터에 해당하는 노드라면 어떤 노드를 가지고 체크해도 무방합니다. 

redis-cli --cluster check 127.0.0.1:7000

 

이것에 대한 응답은 다음과 같습니다.

각 마스터가 몇 개의 key , slot , slave 를 가지고 있고 전체 master에 총 몇 개의 key 가 있는지 정상적인 상태인지 확인해볼 수 있습니다.

127.0.0.1:7002 (5419e2cc...) -> 2 keys | 5461 slots | 1 slaves.
127.0.0.1:7001 (5146072e...) -> 1 keys | 5462 slots | 1 slaves.
127.0.0.1:7000 (c459f2a5...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7005)
S: ed412848e5ca69f3bcb58d69f80fe51a4fd09d4a 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 5419e2cc9639ce3d632f0ecfcc7b2b119daa0597
S: 23a600d3c67a05e27c6c820fd9e304dd453ce679 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 5146072ec530414e15ebea06892e0815a06bd2fd
M: 5419e2cc9639ce3d632f0ecfcc7b2b119daa0597 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 5146072ec530414e15ebea06892e0815a06bd2fd 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: c459f2a525f5a5ab7221d170eff4939ca3be4ffd 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: d48e05e1443bcf77ad49a71a3807d3543a9c01a8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates c459f2a525f5a5ab7221d170eff4939ca3be4ffd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

 

이것을 바탕으로 여러 가지 설정들을 테스트 해 본 뒤에 실제 서비스에 적용해볼 수 있으면 좋겠습니다.

'DB|Cache > Redis' 카테고리의 다른 글

Redis 온라인에서 무료로 사용하기  (0) 2024.06.23
Window에서 Redis 테스트 환경 구축하기  (2) 2024.03.13

댓글