엄지월드

Redis 클러스터링 구성 sh 본문

Server&DevOps

Redis 클러스터링 구성 sh

킨글 2025. 5. 27. 23:06

총 3개의 Master와 3개의 Slave가 구성된다.

Redis의 conf 파일 내용이 같은데 각각의 폴더 마다 직접 들어가서 conf 파일을 만들기 번거로워서 

sh 파일로 만들었다.

1. vi create_redis_cluster.sh 입력해서 아래 내용 입력

#!/bin/bash

# 스크립트가 실행되는 디렉터리를 가져옵니다.
# 이 스크립트가 /home/ec2-user/redis 에 있다고 가정합니다.
SCRIPT_DIR="$(dirname "$0")"

# --- 변수 설정 ---
# 클러스터를 구성할 포트 목록
PORTS="6380 6381 6382 6383 6384 6385"
# 설정 파일 템플릿 경로 (스크립트 디렉터리 내)
TEMPLATE_FILE="$SCRIPT_DIR/redis.conf.template"
#경로는 절대경로로 지정
CONFIG_BASE_DIR="/home/ec2-user/redis"
# Redis 접속 비밀번호 (템플릿에도 {REDIS_PASSWORD}로 동일하게 설정)
REDIS_PASSWORD="1234" # 설정 파일에 설정한 비밀번호와 동일해야 함

# Redis 서버 실행 파일 경로 (환경에 따라 다를 수 있음)
REDIS_SERVER_BIN="redis-server"
# Redis CLI 실행 파일 경로 (환경에 따라 다를 수 있음)
REDIS_CLI_BIN="redis-cli"

# 인스턴스 시작 시 대기 시간 (각 인스턴스 시작 후 짧은 대기)
STARTUP_DELAY=1
# 모든 인스턴스 시작 후 클러스터 생성 전 대기 시간
WAIT_BEFORE_CLUSTER_CREATE=30

# --- Step 0: Cleanup - 기존 인스턴스 종료 및 파일 삭제 ---
echo "--- Starting Cleanup Process ---"
for PORT in $PORTS; do
  echo "Attempting to shut down potential Redis instance on port $PORT..."
  # 해당 포트의 Redis에 연결하여 SHUTDOWN 명령 시도
  # 연결 실패 시 (인스턴스가 실행 중이 아니면) 오류는 무시
  $REDIS_CLI_BIN -p $PORT -a $REDIS_PASSWORD shutdown 2>/dev/null
  # 백그라운드 실행으로 인한 완전 종료까지 잠시 대기
  sleep 1
done

echo "--- Removing old cluster config and data files ---"
for PORT in $PORTS; do
  #INSTANCE_DIR="$CONFIG_BASE_DIR/$PORT"
  INSTANCE_DIR="/home/ec2-user/redis/$PORT"
  echo "Cleaning directory: $INSTANCE_DIR"
  # nodes-*.conf, dump.rdb, appendonly-*.aof 파일 삭제
  # -f 옵션으로 파일이 없어도 에러 없이 진행
  rm -f $INSTANCE_DIR/nodes-$PORT.conf
  rm -f $INSTANCE_DIR/dump.rdb
  rm -f $INSTANCE_DIR/appendonly-$PORT.aof
  # rm -f $INSTANCE_DIR/*.rdb $INSTANCE_DIR/*.aof # 혹시 다른 이름의 RDB/AOF 파일이 있다면 이 줄 주석 해제
done
echo "--- Cleanup Process Finished ---"


# --- Step 1: 설정 파일 생성 및 개별 Redis 인스턴스 시작 ---
echo "--- Generating config files and starting Redis instances ---"
NODE_ADDRESSES="" # 클러스터 생성 명령어에 사용할 노드 주소 목록

for PORT in $PORTS; do
  # 각 포트별 인스턴스 디렉터리 (CONFIG_BASE_DIR 아래에 생성)
  INSTANCE_DIR="$CONFIG_BASE_DIR/$PORT"
  mkdir -p $INSTANCE_DIR # 디렉터리가 없으면 생성

  # 인스턴스별 고유 경로 및 파일명 설정
  PID_FILE="$INSTANCE_DIR/redis_$PORT.pid"
  LOG_FILE="$INSTANCE_DIR/redis_$PORT.log"
  BIND_IP="0.0.0.0" # 스크립트 변수로 사용
  AOF_FILENAME="appendonly-$PORT.aof" # appendfilename은 파일 이름만
  CLUSTER_CONFIG_FILENAME="nodes-$PORT.conf"
  WORKING_DIR="$INSTANCE_DIR" # dir 옵션 경로

  # sed 명령어를 사용하여 템플릿 파일의 변수들을 치환
  # -e 옵션으로 여러 치환 규칙 적용, 구분자를 | 로 사용하여 경로의 / 와 충돌 방지
  sed -e "s|{PORT}|$PORT|g" \
      -e "s|{PID_FILE}|$PID_FILE|g" \
      -e "s|{LOG_FILE}|$LOG_FILE|g" \
      -e "s|{BIND_IP}|$BIND_IP|g" \
      -e "s|{CLUSTER_CONFIG_FILE}|$CLUSTER_CONFIG_FILENAME|g" \
      -e "s|{AOF_FILE}|$AOF_FILENAME|g" \
      -e "s|{WORKING_DIR}|$WORKING_DIR|g" \
      -e "s|{REDIS_PASSWORD}|$REDIS_PASSWORD|g" \
      $TEMPLATE_FILE > $INSTANCE_DIR/redis_$PORT.conf

  echo "Starting Redis instance on port $PORT using config: $INSTANCE_DIR/redis_$PORT.conf"
  # 생성된 설정 파일을 사용하여 Redis 서버 백그라운드 실행
  $REDIS_SERVER_BIN $INSTANCE_DIR/redis_$PORT.conf &
  # 백그라운드 실행을 위해 & 추가. 스크립트가 다음 인스턴스로 넘어갈 수 있게 함.

  # 클러스터 생성 명령어에 사용할 노드 주소 추가
  NODE_ADDRESSES="$NODE_ADDRESSES $BIND_IP:$PORT"

  # 다음 인스턴스 시작 전 잠시 대기
  sleep $STARTUP_DELAY
done

echo "--- All Redis instances started in background. Waiting for them to initialize... ---"
# 모든 인스턴스가 클러스터 버스를 통해 서로를 발견할 시간을 충분히 줌
sleep $WAIT_BEFORE_CLUSTER_CREATE

# --- Step 2: Redis 클러스터 생성 ---
echo "--- Creating the Redis Cluster ---"
# 클러스터 생성 명령어에 -a 옵션을 사용하여 비밀번호 명시
# --cluster-password 옵션 대신 -a 옵션을 --cluster 앞에 사용합니다.
CLUSTER_CREATE_CMD="$REDIS_CLI_BIN -a $REDIS_PASSWORD --cluster create $NODE_ADDRESSES --cluster-replicas 1"

echo "Executing: echo yes | $CLUSTER_CREATE_CMD"
# 클러스터 생성 명령어 실행 및 자동 승인
# echo yes | 를 사용하여 확인 프롬프트에 자동으로 'yes' 입력 (일부 버전 필요)
echo yes | $CLUSTER_CREATE_CMD

# 클러스터 생성 명령어 실행 결과 확인
if [ $? -ne 0 ]; then
    echo "ERROR: Redis cluster creation failed. Check logs for details."
    echo "Please check the logs of individual instances ($CONFIG_BASE_DIR/*/redis_*.log) for details."
    exit 1
fi

echo "--- Redis Cluster creation initiated. ---"

# --- Step 3: 클러스터 상태 확인 ---
echo "--- Verifying Cluster Status (connecting to the first node) ---"
# 클러스터 모드로 접속하여 상태 확인 (-c 옵션 사용)
# -a 옵션으로 비밀번호 제공
FIRST_NODE_PORT=$(echo $PORTS | cut -d' ' -f1)
# 상태 확인 명령어도 비밀번호가 필요하므로 -a 옵션을 사용합니다.
echo "Verifying cluster info..."
$REDIS_CLI_BIN -c -p $FIRST_NODE_PORT -a $REDIS_PASSWORD cluster info
# 결과 확인 (선택 사항, 에러 시 메시지 출력)
if [ $? -ne 0 ]; then
    echo "WARNING: Failed to connect to the cluster node $FIRST_NODE_PORT to get cluster info. Check password or network."
fi

echo "Verifying cluster nodes..."
$REDIS_CLI_BIN -c -p $FIRST_NODE_PORT -a $REDIS_PASSWORD cluster nodes
# 결과 확인 (선택 사항, 에러 시 메시지 출력)
if [ $? -ne 0 ]; then
    echo "WARNING: Failed to connect to the cluster node $FIRST_NODE_PORT to get cluster nodes. Check password or network."
fi


echo "--- Script Finished ---"
echo "You can connect to the cluster using: $REDIS_CLI_BIN -c -p $FIRST_NODE_PORT -a $REDIS_PASSWORD"

2. 권한 부여

chmod +x create_redis_cluster.sh

3. 실행

./create_redis_cluster.sh

4. 결과

'Server&DevOps' 카테고리의 다른 글

ubuntu 절전 모드 처리  (0) 2025.09.14
웹서버 및 WAS 튜닝 예시  (1) 2025.05.30
Kafka 통신 순서  (0) 2025.05.10
Kafka 생성 환경설정  (0) 2025.05.10
NGINX HTTP/2 적용  (0) 2025.03.18
Comments