레디스 Redis
[Redis] Redis Cluster 마스터-슬레이브 6노드 자동 구성 스크립트로 환경 구축
니블
2025. 6. 20. 14:16
1. 들어가며
1-1. Redis 단일 인스턴스의 한계
- 메모리 확장 한계 : 레디스는 메모리기반(in-memory) 저장소이기 때문에, 단일 인스턴스에서 사용하는 메모리는 기본적으로 서버 한대의 RAM 용량에 제한됨. 대용량 데이터를 캐싱하거나 저장할 경우, 단일 인스턴스만으로는 감당이 어려움
- 단일 장애 지점 (Single Point of Failure) : 단일 인스턴스로 구성된 redis는 해당 인스턴스가 꺼지면 전체 시스템이 영향을 받는다. 장애복구(failover)를 수동으로 해야함. 클라이언트가 자동으로 다른 서버로 연결될 수 없음
- ex) 서비스 트래픽 급증으로 redis가 다운되면, 캐시 의존적인 기능이 모두 장애로 이어짐!
- 수평확장이 불가능 : 단인 redis 인스턴스는 슬롯분산(sharding) 기능이 없기 때문에, 노드를 여러 개 두고 데이터를 나눠 저장할 수 없음.
1-2. 그래서 Redis Cluster 또는 Redis Sentinel 기반 구조가 필요하다.
- Redis Cluster: 슬롯 기반 자동 분산 저장 + 자동 장애 복구 (지금 실습할 구조)
- Redis Sentinel : 단일 마스터 구조 유지하면서 자동 장애 조치(Failover) 지원
* Redis 버전 및 설치는 되어있다고 가정하고 실습 진행
2. Redis 클러스터 자동 setup/reset/start/stop 스크립트를 만들어서 효율적인 환경 구축하기
수동으로 하나하나 인스턴스를 띄우고 설정 파일을 수정하는 대신, 스크립트 자동화를 Redis 6노드 클러스터 (3 Master + 3 Replica)를 빠르고 정확하게 구성한다.
현재 Ubuntu 에서 진행하고 있다.
/etc/redis 경로에서 작업중 ..
2-1. 각 스크립트 설명 ***
1) setup-redis-cluster.sh
- 7000~7005 포트별 디렉토리/설정 파일 생성
- redis.conf 자동화 작성 (cluster-enabled yes, cluster-config-file 등)
#!/bin/bash
# setting
BASE_DIR="/etc/redis/redis-cluster"
PORTS=(7000 7001 7002 7003 7004 7005) # 총 5노드
REDIS_SERVER=$(which redis-server)
REDIS_CLI=$(which redis-cli)
# 레디스 설정 파일 내용 작성 redis.conf template
generate_conf() {
local port=$1
cat <<EOF
port $port
bind 127.0.0.1 # 로컬
cluster-enabled yes #클러스터 모드
cluster-config-file nodes-${port}.conf #레디스 설정파일명
cluster-node-timeout 5000
appendonly yes
dbfilename dump.rdb
dir $BASE_DIR/$port
protected-mode no #통신을 위한 protected mode no
daemonize yes
logfile "$BASE_DIR/$port/redis.log" #로그파일명
EOF
}
echo "클러스터 디렉토리 생성 및 설정 .. "
# 1. 각 포트별 디렉토리와 conf 생성
for port in "${PORTS[@]}"; do
mkdir -p $BASE_DIR/$port
generate_conf $port > $BASE_DIR/$port/redis-${port}.conf
done
echo "redis 인스턴스 실행..."
# 2. Redis 인스턴스 실행
for port in "${PORTS[@]}"; do
$REDIS_SERVER $BASE_DIR/$port/redis-${port}.conf
done
sleep 5 #노드가 모두 실행되기전에 클러스터 create 해서 에러되는것을 방지하기 위해 잠시 sleep
echo "클러스터 생성..."
# 3. 클러스터 구성
$REDIS_CLI --cluster create \
127.0.0.1:7000 \
127.0.0.1:7001 \
127.0.0.1:7002 \
127.0.0.1:7003 \
127.0.0.1:7004 \
127.0.0.1:7005 \
--cluster-replicas 1 <<EOF # master 1개당 slave1 개 설정
yes
EOF
echo "클러스터 설정완료!"
# 4. 상태 확인
$REDIS_CLI -p 7000 cluster info
클러스터 설정 완료!
포트 떠 있는거 확인 완료
2) start-redis.sh
- 각 Redis 인스턴스 실행
- redis-server 명령어로 백그라운드 실행
#!/bin/bash
# 설정
BASE_DIR="/etc/redis/redis-cluster"
PORTS=(7000 7001 7002 7003 7004 7005)
REDIS_SERVER=$(which redis-server)
echo "Redis 인스턴스 시작 중..."
for port in "${PORTS[@]}"; do
CONF="$BASE_DIR/$port/redis-${port}.conf"
if [ -f "$CONF" ]; then
echo " ↳ 포트 $port 시작"
$REDIS_SERVER "$CONF"
else
echo "설정 파일 없음: $CONF"
fi
done
echo "Redis 인스턴스 실행 완료!"
3) status.sh
현재 클러스터 상태 확인 (running,stop)
#!/bin/bash
PORTS=(7000 7001 7002 7003 7004 7005)
echo "Redis 실행 상태 확인"
for port in "${PORTS[@]}"; do
if lsof -iTCP:$port -sTCP:LISTEN -t >/dev/null 2>&1; then
echo "포트 $port: 실행 중"
else
echo "포트 $port: 꺼짐"
fi
done
4). stop-redis.sh
- 실행 중인 Redis 인스턴스 강제 종료 (kill, pkill 활용)
#!/bin/bash
# 설정
PORTS=(7000 7001 7002 7003 7004 7005)
echo "Redis 인스턴스 중지 중..."
for port in "${PORTS[@]}"; do
pid=$(lsof -iTCP:$port -sTCP:LISTEN -t 2>/dev/null)
if [ -n "$pid" ]; then
echo " ↳ 포트 $port (PID $pid) 종료"
kill -9 $pid
else
echo " 포트 $port 는 실행 중이지 않음"
fi
done
echo "Redis 인스턴스 종료 완료!"
종료 했으니 grep 잡히지 않음 !
5) reset-redis-cluster.sh
- 클러스터 정보 및 dump.rdb 삭제
- clean 상태로 되돌리기
- 관련 설정 디렉토리 삭제
# === 설정 ===
BASE_DIR="/etc/redis/redis-cluster"
PORTS=(7000 7001 7002 7003 7004 7005)
echo "Redis 클러스터 전체 초기화 시작..."
# 1. Redis 프로세스 종료
echo "🔻 Redis 서버 중지 중..."
for port in "${PORTS[@]}"; do
pid=$(lsof -iTCP:$port -sTCP:LISTEN -t)
if [ -n "$pid" ]; then
echo " ↳ 포트 $port (PID $pid) 종료"
kill -9 $pid
fi
done
# 2. Redis 관련 파일 제거
echo "클러스터 관련 파일 삭제 중..."
for port in "${PORTS[@]}"; do
DIR="$BASE_DIR/$port"
if [ -d "$DIR" ]; then
echo " ↳ $DIR 삭제"
rm -rf "$DIR"
fi
done
echo "초기화 완료! 클러스터를 다시 구성할 수 있습니다."
3. Master - Slave 클러스터 노드 구성도 (Master/Slave 관계도)
이번 글에서는 로컬 환경에서 Redis Cluster를 보다 효율적으로 구성할 수 있도록 setup.sh, start.sh, stop.sh, reset.sh, status.sh 스크립트를 활용한 자동화 방법을 소개했다.
또한 redis-cli 명령어를 통해 각 노드의 마스터-슬레이브 역할을 확인하고, 전체 클러스터 구조를 시각화해보았다.
참고로 레디스에서 제공하는 create-cluster 스크립트를 활용해서 간단하게 구성할 수 있다..
https://hub.docker.com/r/bitnami/redis-cluster
https://hub.docker.com/r/bitnami/redis-cluster
hub.docker.com