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 클러스터의 고가용성과 데이터 무결성이 유지되고 있음을 의미합니다.