로컬에서 직접 Redis docker image로 cluster를 구성하는 방법은 복잡하지만,
grokzen/redis-cluster 이미지를 사용하면 따로 네트워크 설정이나 스크립트를 만들 필요없이 쉽게 Redis cluster 개발 환경을 구성할 수 있다.
다만 아쉬운 점은 최신 Redis 7.4 버전은 정식으로 지원하지 않는다는 점과
현재 기준으로 Redis 7.2.5 버전이 지원하는 가장 최신의 버전인데 7.2.x 버전은 오류가 나서 정상적으로 실행되지 않는다.
(관련 이슈)
그래서 실제로 사용할 수 있는 가장 최신 Redis 버전은 사실상 7.0.15 버전이다.
3 master nodes + 3 slave nodes
먼저 아래와 같은 3개의 1 master - 1 slave shard로 구성된 Redis cluster의 예제이다.
docker command
docker 명령어는 아래와 같다. 각 환경변수를 보면 어떤 설정값인지 쉽게 알 수 있다.
$ docker run \
-e "IP=0.0.0.0" \
-e "BIND_ADDRESS=0.0.0.0" \
-e "INITIAL_PORT=7001" \ # 처음으로 시작할 port
-e "MASTERS=3" \ # master node의 수
-e "SLAVES_PER_MASTER=1" \ # master 1대 당 slave의 수
-p 7001-7006:7001-7006 \ # 7001(INITIAL_PORT) 부터 6개의 노드의 port
--name redis-cluster-6 \
grokzen/redis-cluster:7.0.15
docker-compose script
위 docker 명령어를 docker-compose script로 바꾸면 아래와 같다.
services:
# 3 masters with slaves
redis-cluster:
container_name: redis-cluster-6
image: grokzen/redis-cluster:7.0.15
environment:
- IP=0.0.0.0
- BIND_ADDRESS=0.0.0.0
- INITIAL_PORT=7001
- MASTERS=3
- SLAVES_PER_MASTER=1
ports:
- "7001-7006:7001-7006"
3 master nodes
로컬 개발 환경이라면 굳이 slave node 까지 구성하지 않을 수도 있다.
위 예제에서 단순하게 slave를 없앤 예제이다.
docker command
docker 명령어는 아래와 같다.
docker run \
-e "IP=0.0.0.0" \
-e "BIND_ADDRESS=0.0.0.0" \
-e "INITIAL_PORT=7001" \
-e "MASTERS=3" \
-e "SLAVES_PER_MASTER=0" \
-p 7001-7003:7001-7003 \
--name redis-cluster-3 \
grokzen/redis-cluster:7.0.15
docker-compose script
위 docker 명령어를 docker-compose script로 바꾸면 아래와 같다.
services:
# 3 masters without slaves
redis-cluster:
container_name: redis-cluster-3
image: grokzen/redis-cluster:7.0.15
environment:
- IP=0.0.0.0
- BIND_ADDRESS=0.0.0.0
- INITIAL_PORT=7001
- MASTERS=3
- SLAVES_PER_MASTER=0
ports:
- "7001-7003:7001-7003"
Redis 설정 확인
Redis cluster를 구성한 뒤에 설정을 확인하고 싶다면 redis-cli를 통해 확인할 수 있다.
# container 접속 후 redis-cli 실행
$ docker exec -it redis-cluster-6 redis-cli -p 7001
# cluster 정보 확인
127.0.0.1:7001> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:96
cluster_stats_messages_pong_sent:104
cluster_stats_messages_sent:200
cluster_stats_messages_ping_received:99
cluster_stats_messages_pong_received:96
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:200
total_cluster_links_buffer_limit_exceeded:0
# replication 설정 확인
127.0.0.1:7001> INFO REPLICATION
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7006,state=online,offset=2968,lag=1
master_failover_state:no-failover
master_replid:e9a1e2df55b621043583036acebadd7542f4de9d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2968
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2968
'DB > Redis' 카테고리의 다른 글
[Redis] 많은 키를 삭제할 때는 UNLINK (0) | 2023.02.12 |
---|---|
Redis를 활용한 다양한 시스템 설계 (5) | 2022.10.02 |
Sorted Set vs Top-K for Real-time Ranking System (0) | 2022.05.23 |
댓글