Docker Compose 로 Redis Cluster 구축하기
1. Redis 클러스터 환경 둘러보기
Redis Cluster 의 기본적인 구조는 아래와 같다. 상단에 클라이언트가 있고 최소 3개의 Node 가 존재하고 각 노드는 Master - Slave 구조를 가질 수 있으며, Master 가 죽을때 복제본을 가지고 있는 n개의 Slave 중 하나 가 Master 를 대체 하는 형태이다.
2. Redis 클러스터 환경에서의 샤딩
Redis 의 모든 키는 16,384개의 슬롯으로 나누어 저장이 되고 Master 노드가 A B C 세대로 나뉜다면, A는 0 ~ 5500, B는 5501 ~ 11000, C는 11001 ~ 16383 으로 나뉘어 진다.
이때 키가 슬롯에 매핑되는 기준은 CRC16(key name) mod 16384 알고리즘을 통해 결정 되는데 키 이름에 따라 아래와 같은 기준으로 매핑되므로 키 이름에 따라 같은 노드에 저장 될 수도 있고 분산되어 저장 될 수 있음을 확인해야 한다.
3. Docker 환경에서 Redis 클러스터 구축하기
bitnami 이미지가 silicon chipset(arm64) 을 지원하는 듯해서 이를 사용하기로 했고 아래와 같이 설정하였다.
1) docker-compose 설정
모든 노드를 localhost:637x 포트로 접근 가능하도록 설정했다.
version: '2'
services:
redis-node-0:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6371:6379
volumes:
- redis-cluster_data-0:/bitnami/redis/data
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
redis-node-1:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6372:6379
volumes:
- redis-cluster_data-1:/bitnami/redis/data
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
redis-node-2:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6373:6379
volumes:
- redis-cluster_data-2:/bitnami/redis/data
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
redis-node-3:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6374:6379
volumes:
- redis-cluster_data-3:/bitnami/redis/data
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
redis-node-4:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6375:6379
volumes:
- redis-cluster_data-4:/bitnami/redis/data
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
redis-node-5:
image: docker.io/bitnami/redis-cluster:7.2
ports:
- 6379:6379
volumes:
- redis-cluster_data-5:/bitnami/redis/data
depends_on:
- redis-node-0
- redis-node-1
- redis-node-2
- redis-node-3
- redis-node-4
environment:
- 'REDIS_PASSWORD=bitnami'
- 'REDISCLI_AUTH=bitnami'
- 'REDIS_CLUSTER_REPLICAS=1'
- 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5'
- 'REDIS_CLUSTER_CREATOR=yes'
volumes:
redis-cluster_data-0:
driver: local
redis-cluster_data-1:
driver: local
redis-cluster_data-2:
driver: local
redis-cluster_data-3:
driver: local
redis-cluster_data-4:
driver: local
redis-cluster_data-5:
driver: local
networks:
default:
name: local_network
2) SpringBoot, Reactive Redis 의 클러스터 설정
spring.data.redis.cluster.nodes=localhost:6371,localhost:6372,localhost:6373,localhost:6374,localhost:6375,localhost:6379
spring.data.redis.cluster.max-redirects=3
spring.data.redis.password=bitnami
spring.session.redis.flush-mode=on_save
spring.data.redis.timeout=500ms
3) 접속 확인
docker-compose up -d 로 컨테이너를 올리고 compose.yml 설정에 따라 creator 에 접속하든 다른 노드에 접속하든 localhost 에 설정한 포트로 6379 이나 6371 등으로 접속하면 된다. 패스워드는 설정한 것과 같이 bitnami 로 접속해야 하도록 한다.