Docker를 사용한 Redis 클러스터 구축 및 고가용성 설정

Redis 클러스터 구성 자동화 스크립트 작성

6개의 Redis 노드를 위한 디렉터리와 설정 파일을 일괄 생성하는 Bash 스크립트를 작성합니다. 각 노드는 별도의 포트와 IP 주소를 사용하며, 클러스터 모드로 동작하도록 구성됩니다.

#!/bin/bash
# Redis 클러스터 환경 세팅 스크립트
for port in $(seq 1 6); do
  mkdir -p /redis-data/node-${port}/conf
  cat > /redis-data/node-${port}/conf/redis.conf << EOF
port 6379
bind 0.0.0.0
protected-mode no
daemonize no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.20.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
dir /data
EOF
done

스크립트 실행 및 권한 설정

chmod +x setup-redis.sh
./setup-redis.sh

스크립트 실행 후 /redis-data 디렉터리에 node-1 ~ node-6 폴더가 생성되고, 각각의 redis.conf 파일이 올바르게 생성되었는지 확인합니다.

커스텀 네트워크 생성

Redis 노드들이 서로 통신할 수 있도록 브릿지 네트워크를 생성합니다.

docker network create --subnet=172.20.0.0/24 redis-net

6개의 Redis 컨테이너 실행

각 노드를 Docker 컨테이너로 실행하고, 사전 정의된 네트워크와 설정 파일을 마운트합니다.

for i in $(seq 1 6); do
  docker run -d \
    --name redis-node-${i} \
    --net redis-net \
    --ip 172.20.0.1${i} \
    -p 638${i}:6379 \
    -p 1638${i}:16379 \
    -v /redis-data/node-${i}/data:/data \
    -v /redis-data/node-${i}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
    redis:7-alpine \
    redis-server /usr/local/etc/redis/redis.conf
done

클러스터 초기화

생성된 6개 노드를 기반으로 Redis 클러스터를 구성합니다. 마스터 3개, 각 마스터당 슬레이브 1개씩 총 3개의 슬레이브를 배치합니다.

docker exec -it redis-node-1 sh -c '
redis-cli --cluster create \
172.20.0.11:6379 \
172.20.0.12:6379 \
172.20.0.13:6379 \
172.20.0.14:6379 \
172.20.0.15:6379 \
172.20.0.16:6379 \
--cluster-replicas 1 << CONFIRM
yes
CONFIRM
'

클러스터 상태 확인

클러스터가 성공적으로 구성되었는지 확인합니다.

docker exec -it redis-node-1 redis-cli cluster info

정상적인 응답 예시:

cluster_state:ok
cluster_slots_assigned:16384
cluster_known_nodes:6
cluster_size:3

노드 목록 조회

마스터와 슬레이브 노드의 배치 상태를 확인합니다.

docker exec -it redis-node-1 redis-cli cluster nodes

출력 결과에서 3개의 마스터(M)와 3개의 슬레이브(S)가 각각 매칭되어 있는지 확인할 수 있습니다.

고가용성 테스트

실시간 데이터 접근과 장애 대응을 검증합니다.

키 저장 테스트

docker exec -it redis-node-1 redis-cli -c set hello world

-c 옵션은 클러스터 리디렉션을 지원합니다. 해당 키는 해시 슬롯에 따라 적절한 노드로 자동 라우팅됩니다.

마스터 노드 장애 시뮬레이션

현재 'hello' 키를 관리 중인 마스터 노드를 강제로 종료하여 장애 상황을 재현합니다.

# 현재 키 위치 확인
docker exec -it redis-node-1 redis-cli -c get hello

# 예: Redirected to slot [17245] located at 172.20.0.13:6379 → redis-node-3이 마스터

# 마스터 노드 중지
docker stop redis-node-3

자동 장애 복구 확인

기존 마스터의 슬레이브 노드(예: redis-node-6)가 자동으로 승격되어 새로운 마스터가 됩니다.

docker exec -it redis-node-1 redis-cli cluster nodes | grep master

결과에서 기존 마스터가 실패 상태이며, 해당 슬레이브가 마스터로 전환된 것을 확인할 수 있습니다.

데이터 지속성 검증

docker exec -it redis-node-1 redis-cli -c get hello

여전히 "world" 값을 정상적으로 반환해야 하며, 이는 Redis 클러스터의 고가용성과 데이터 무결성이 유지되고 있음을 의미합니다.

태그: Redis docker clustering high-availability Networking

6월 21일 01:47에 게시됨