Docker Compose 로 Redis Cluster 구축하기

1. Redis 클러스터 환경 둘러보기

Redis Cluster 의 기본적인 구조는 아래와 같다. 상단에 클라이언트가 있고 최소 3개의 Node 가 존재하고 각 노드는 Master - Slave 구조를 가질 수 있으며, Master 가 죽을때 복제본을 가지고 있는 n개의 Slave 중 하나 가 Master 를 대체 하는 형태이다.

https://ot-container-kit.github.io/redis-operator/guide/setup.html#redis-cluster
TaskVibes: ADHD Simple Manage - Apps on Google Play
ADHD 를 겪는 사람들을 위한 일정관리 앱

2. Redis 클러스터 환경에서의 샤딩

Redis 의 모든 키는 16,384개의 슬롯으로 나누어 저장이 되고 Master 노드가 A B C 세대로 나뉜다면, A는 0 ~ 5500, B는 5501 ~ 11000, C는 11001 ~ 16383 으로 나뉘어 진다.

이때 키가 슬롯에 매핑되는 기준은 CRC16(key name) mod 16384 알고리즘을 통해 결정 되는데 키 이름에 따라 아래와 같은 기준으로 매핑되므로 키 이름에 따라 같은 노드에 저장 될 수도 있고 분산되어 저장 될 수 있음을 확인해야 한다.

https://www.stevenchang.tw/blog/2020/12/08/redis-notes-cluster-mode
TaskVibes: ADHD Simple Manage - Apps on Google Play
ADHD 를 겪는 사람들을 위한 일정관리 앱

3. Docker 환경에서 Redis 클러스터 구축하기

bitnami 이미지가 silicon chipset(arm64) 을 지원하는 듯해서 이를 사용하기로 했고 아래와 같이 설정하였다.

Docker
containers/bitnami/redis-cluster at main · bitnami/containers
Bitnami container images. Contribute to bitnami/containers development by creating an account on GitHub.
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 로 접속해야 하도록 한다.

TaskVibes: ADHD Simple Manage - Apps on Google Play
ADHD 를 겪는 사람들을 위한 일정관리 앱