Redis와 Redis Sentinel

야아니·2025년 12월 10일

프로젝트 완료 후 유지보수 측면에서
SPOF(single point of failure)로 꼽혔던 redis에 대한 문제를
Redis Sentinel을 적용하여 보완하기로 했다.
*SPOF: 특정 구성 요소가 장애가 나면 전체 시스템이 중단되는 문제

1. 현재 redis 세팅(단일객체)


정보를 담아 둘 Redis 객체가 하나뿐인 현재는 Redis 서버가 다운되면 refreshToken을 통한 인증(연장) 마비, 예약된 테이블을 조회할 수 있게 해주는 실시간 서비스 마비 등 프로그램에 치명적인 영향을 끼치는 상태이다.

2. 대처방안

  • Redis Sentinel을 사용하여 고가용성 구조로 전환

    고가용성(High Availability, HA) 구조는 시스템이 장애 상황에서도 서비스를 지속적으로 제공할 수 있도록 설계된 아키텍처를 의미한다.

※ windows에서는 redis sentinel 구성설정을 지원하지 않으므로 Docker-redis를 이용한 sentinel 빌드를 하기로 함

3. 진행순서

1️⃣ Root(프로젝트 외부)에 Redis Sentinel을 설정파일을 담을 디렉토리, docker-compose.yml생성

  • docker-compose.yml
version: '3'

services:

  redis-master:
    image: redis:7
    container_name: redis-master
    hostname: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./master/redis.conf:/usr/local/etc/redis/redis.conf
      - master-data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  redis-replica:
    image: redis:7
    container_name: redis-replica
    hostname: redis-replica
    ports:
      - "6380:6379"
    depends_on:
      redis-master:
        condition: service_healthy
    volumes:
      - ./replica/redis.conf:/usr/local/etc/redis/redis.conf
      - replica-data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-network

  sentinel1:
    image: redis:7
    container_name: redis-sentinel1
    hostname: redis-sentinel1
    ports:
      - "6381:26379"
    depends_on:
      redis-master:
        condition: service_healthy
    volumes:
      - ./sentinel1:/usr/local/etc/redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    networks:
      - redis-network
    restart: on-failure

  sentinel2:
    image: redis:7
    container_name: redis-sentinel2
    hostname: redis-sentinel2
    ports:
      - "6382:26379"
    depends_on:
      redis-master:
        condition: service_healthy
    volumes:
      - ./sentinel2:/usr/local/etc/redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    networks:
      - redis-network
    restart: on-failure

  sentinel3:
    image: redis:7
    container_name: redis-sentinel3
    hostname: redis-sentinel3
    ports:
      - "6383:26379"
    depends_on:
      redis-master:
        condition: service_healthy
    volumes:
      - ./sentinel3:/usr/local/etc/redis
    command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
    networks:
      - redis-network
    restart: on-failure

volumes:
  master-data:
  replica-data:

networks:
  redis-network:
    driver: bridge

2️⃣ 각각의 디렉토리에 설정을 담은 .conf파일 생성

  • /master/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
replica-announce-ip 127.0.0.1
replica-announce-port 6379
appendonly yes
appendfilename "appendonly.aof"
  • /replica/redis.conf
port 6379
bind 0.0.0.0
protected-mode no
# Replica announce 설정 추가
replica-announce-ip 127.0.0.1
replica-announce-port 6380
appendonly yes
appendfilename "appendonly.aof"
# Master는 Docker 내부 IP 유지
replicaof 172.19.0.2 6379
slave-priority 100
replica-read-only yes
  • /sentinel1/sentinel.conf
port 26379
bind 0.0.0.0
protected-mode no
sentinel resolve-hostnames no
sentinel announce-hostnames no
# IP 주소로 모니터링 (Master IP를 확인 후 입력)
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel announce-ip "127.0.0.1"
sentinel announce-port 6381
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel deny-scripts-reconfig yes

sentinel2,3은 포트번호 이외에 모두 동일(6381,6382,6383순)

redis의 root로 이동후 실행

docker desktop을 먼저 실행 후 root디렉토리에서

# docker-compose.yml에 정의된 컨테이너들을 백그라운드(-d)에서 실행
1. docker-compose up -d

# 현재 실행 중인 도커 컨테이너 목록과 상태를 출력
2. docker ps

# 'sentinel1' 서비스의 로그를 실시간(-f)으로 확인
3. docker-compose logs -f sentinel1

# 'redis-replica' 컨테이너에 접속(-it)하여 
# redis-cli를 실행하고, 복제(replication) 상태 정보를 출력
4. docker exec -it redis-replica redis-cli info replication
4-1. docker stop redis-master
4-2. docker exec -it redis-replica redis-cli info replication

1. 실행된 docker 컨테이너들

2. 실행 중인 컨테이너 목록과 상태

3. 실시간 확인이 가능한 로그

4. master를 종료하자 역할이 뒤바뀐 replica와 master

이후 docker stop redis-replica명령어로 replica를 종료해 본 결과 master가 다시 master 역할로 돌아오는 것을 확인 하였다.

회고

현재 상태에서는 Docker가 실행 중일 때만 Redis HA가 작동하므로
추후 cloud등의 서비스에 Redis Sentinel환경을 구축하여 항시 작동하는 로직이 추가되어야 할 것 같다.

또한 하지만 두 개의 컨테이너가 모두 종료되는 경우 또 다시 서비스에 차질이 생기므로 분산환경에의 redis객체 구축이 필요할 것으로 보인다

profile
세계평화를 원하는 사람입니다.

0개의 댓글