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

정보를 담아 둘 Redis 객체가 하나뿐인 현재는 Redis 서버가 다운되면 refreshToken을 통한 인증(연장) 마비, 예약된 테이블을 조회할 수 있게 해주는 실시간 서비스 마비 등 프로그램에 치명적인 영향을 끼치는 상태이다.
고가용성(High Availability, HA) 구조는 시스템이 장애 상황에서도 서비스를 지속적으로 제공할 수 있도록 설계된 아키텍처를 의미한다.
※ windows에서는 redis sentinel 구성설정을 지원하지 않으므로 Docker-redis를 이용한 sentinel 빌드를 하기로 함

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
- /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 yessentinel2,3은 포트번호 이외에 모두 동일(6381,6382,6383순)
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




이후 docker stop redis-replica명령어로 replica를 종료해 본 결과 master가 다시 master 역할로 돌아오는 것을 확인 하였다.
현재 상태에서는 Docker가 실행 중일 때만 Redis HA가 작동하므로
추후 cloud등의 서비스에 Redis Sentinel환경을 구축하여 항시 작동하는 로직이 추가되어야 할 것 같다.
또한 하지만 두 개의 컨테이너가 모두 종료되는 경우 또 다시 서비스에 차질이 생기므로 분산환경에의 redis객체 구축이 필요할 것으로 보인다