레디스 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