docker bitnami/redis-cluster를 사용하여 레디스 클러스터 구성 + announce-ip 지정 옵션 트러블 슈팅

박진형·2025년 4월 10일
0

bitnami/redis-cluster 이미지를 사용해서도 레디스 클러스터를 구성할 수 있다.
https://hub.docker.com/r/bitnami/redis-cluster

전체적인 announce-ip, announce-port, announce-bus-port 설정의 맥락은 이전 글인 Docker-compose로 Redis-cluster 구성하기 + 도커 외부에서 접속 트러블 슈팅과 같다.

bitnami/redis-cluster가 제공해주는 간편한 옵션 설정덕분에 클러스터 구성을 간편하게 할 수 있었다.

먼저 docker-compose.yml을 확인해보면 다음과 같다.

docker-compose.yml

services:
  redis-node-0:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6479:6479
      - 16479:16479
    volumes:
      - ./data2/redis-cluster_data-0:/bitnami/redis/data
    environment:
      - 'REDIS_PORT_NUMBER=6479'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6479'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16479'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'

  redis-node-1:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6480:6480
      - 16480:16480
    volumes:
      - ./data2/redis-cluster_data-1:/bitnami/redis/data
    environment:
      - 'REDIS_PORT_NUMBER=6480'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6480'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16480'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'

  redis-node-2:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6481:6481
      - 16481:16481
    volumes:
      - ./data2/redis-cluster_data-2:/bitnami/redis/data
    environment:
      - 'REDIS_PORT_NUMBER=6481'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6481'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16481'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'

  redis-node-3:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6482:6482
      - 16482:16482
    volumes:
      - ./data2/redis-cluster_data-3:/bitnami/redis/data
    environment:
      - 'REDIS_PORT_NUMBER=6482'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6482'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16482'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'

  redis-node-4:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6483:6483
      - 16483:16483
    volumes:
      - ./data2/redis-cluster_data-4:/bitnami/redis/data
    environment:
      - 'REDIS_PORT_NUMBER=6483'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6483'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16483'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'

  redis-node-5:
    image: docker.io/bitnami/redis-cluster:7.2
    ports:
      - 6484:6484
      - 16484:16484
    volumes:
      - ./data2/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_PORT_NUMBER=6484'
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'
      - 'REDIS_CLUSTER_ANNOUNCE_PORT=6484'
      - 'REDIS_CLUSTER_ANNOUNCE_BUS_PORT=16484'
      - 'REDIS_PASSWORD=bitnami'
      - 'REDISCLI_AUTH=bitnami'
      - 'REDIS_CLUSTER_REPLICAS=1'
      - 'REDIS_NODES=redis-node-0:6479 redis-node-1:6480 redis-node-2:6481 redis-node-3:6482 redis-node-4:6483 redis-node-5:6484'
      - '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

이전에 구성했던 것 처럼 내부 포트와 외부 포트를 일치시키고 cluster-announce-ip, cluster-announce-port, cluster-announce-bus-port를 지정해주었다.

Trouble Shooting

상황

environment 부분의 REDIS_CLUSTER_ANNOUNCE_IP={ip} 옵션으로 cluster-announce-ip를 설정했는데도 불구하고 여전히 컨테이너 머신의 ip값이 들어가고 지정한 ip 값이 들어가지 않는 문제를 겪었다.

분석

몇가지 가정을 하고 이것저것 시도해봤다.

옵션명이 잘못 되었을까?
bitnami가 제공하는 옵션 항목들을 찾아봤는데 이상없다.

호스트머신의 ip를 입력하면 자동으로 컨테이너 머신의 ip로 지정된다?
REDIS_ANNOUNCE_IP 옵션을 지정하던 하지 않던 컨테이너 머신의 ip로 지정된다.

bitnami/redis-cluster의 버그인가?
어떻게 redis.conf에 옵션을 지정해주는지 확인하기 위해 github에 들어가서 스크립트를 확인해봤다.

librediscluster.sh 파일을 확인해보니 다음과 같은 부분을 찾을 수 있었다.

    if ! is_boolean_yes "$REDIS_CLUSTER_DYNAMIC_IPS"; then
        redis_conf_set cluster-announce-ip "$REDIS_CLUSTER_ANNOUNCE_IP"
    fi
    if is_boolean_yes "$REDIS_CLUSTER_DYNAMIC_IPS"; then
        # Always set the announce-ip to avoid issues when using proxies and traffic restrictions.
        redis_conf_set cluster-announce-ip "$(get_machine_ip)"

REDIS_CLUSTER_DYNAMIC_IPS 옵션이 no이면 REDIS_CLUSTER_ANNOUNCE_IP를 사용하고 아니라면 ${get_machine_ip}를 통해 컨테이너 머신의 ip로 지정해주는 듯 하다.

REDIS_CLUSTER_DYNAMIC_IPS 옵션은 기본값이 yes인 것을 redis-cluster-env.sh 파일에서 찾을 수 있었다.

REDIS_CLUSTER_DYNAMIC_IPS

해결

최종적으로 다음 옵션을 통해 announce_ip를 지정할 수 있었다.

  • REDIS_CLUSTER_ANNOUNCE_IP={ip} 설정
  • REDIS_CLUSTER_DYNAMIC_IPS=no 설정
    environment:
      - 'REDIS_CLUSTER_DYNAMIC_IPS=no'
      - 'REDIS_CLUSTER_ANNOUNCE_IP=192.168.45.76'

접속 성공

0개의 댓글