Master Redis 서버가 죽으면 서비스가 중단됩니다. 수동으로 Replica를 Master로 승격하는 동안 다운타임이 발생합니다. Sentinel은 이 과정을 자동화합니다.
Failover: 주 시스템에 장애가 발생했을 때 백업 시스템으로 자동 전환하는 과정. Redis Sentinel은 이 과정을 자동으로 처리합니다.
Sentinel 1 ─┐
Sentinel 2 ─┤→ Master (감시)
Sentinel 3 ─┘ ↕ 복제
Replica 1
Replica 2
Sentinel도 3대 이상 홀수로 구성합니다. 과반수 합의로 장애 여부를 판단하기 때문입니다.
쿼럼(Quorum): 장애를 판단하는 데 필요한 최소 Sentinel 동의 수. 과반수 이상으로 설정해 네트워크 분리 상황에서 잘못된 Failover를 방지합니다.
# sentinel.conf
sentinel monitor mymaster 192.168.1.100 6379 2
# mymaster: 모니터링 이름
# 2: 장애 판단에 필요한 최소 Sentinel 수 (쿼럼)
sentinel down-after-milliseconds mymaster 5000
# 5초 동안 응답 없으면 장애로 판단
sentinel failover-timeout mymaster 60000
# Failover 최대 대기 시간 60초
sentinel parallel-syncs mymaster 1
# Failover 후 한 번에 동기화할 Replica 수
1. Sentinel 1: Master 응답 없음 (SDOWN — Subjective Down)
2. Sentinel 2, 3: 동의 → 과반수 합의 (ODOWN — Objective Down)
3. Sentinel 중 리더 선출 (Raft 알고리즘)
4. 리더 Sentinel: 새 Master로 승격할 Replica 선택
5. Replica 1 → 새 Master로 승격 (REPLICAOF NO ONE)
6. Replica 2 → 새 Master(Replica 1)를 바라보도록 변경
7. 클라이언트에 새 Master 주소 알림
8. 기존 Master 복구 시 → 새 Master의 Replica로 합류
SDOWN(Subjective Down): 하나의 Sentinel이 Master를 다운으로 판단한 상태. ODOWN(Objective Down): 쿼럼 이상의 Sentinel이 동의한 공식 다운 상태.
Sentinel을 통해 현재 Master 주소를 조회합니다. Master가 바뀌어도 클라이언트는 Sentinel에 물어보면 됩니다.
import Redis from "ioredis";
// Sentinel 연결
const redis = new Redis({
sentinels: [
{ host: "192.168.1.201", port: 26379 },
{ host: "192.168.1.202", port: 26379 },
{ host: "192.168.1.203", port: 26379 },
],
name: "mymaster", // sentinel.conf의 모니터링 이름
role: "master", // 쓰기: "master", 읽기: "slave"
});
// 사용 방법은 일반 Redis와 동일
await redis.set("key", "value");
Failover가 발생하면 ioredis가 자동으로 새 Master에 재연결합니다.
# Sentinel에 접속
redis-cli -p 26379
# 모니터링 중인 Master 목록
SENTINEL masters
# 특정 Master의 현재 주소
SENTINEL get-master-addr-by-name mymaster
# 1) "192.168.1.100"
# 2) "6379"
# Replica 목록
SENTINEL slaves mymaster
# Sentinel 목록
SENTINEL sentinels mymaster
# 수동 Failover 트리거
SENTINEL failover mymaster
Sentinel 2대만 있으면 둘 다 다운 시 쿼럼에 도달하지 못해 Failover가 안 됩니다. 홀수인 3대 이상이 필요합니다.
비동기 복제이므로 Failover 시 아직 Replica에 전파되지 않은 데이터가 손실될 수 있습니다. min-replicas-to-write와 min-replicas-max-lag로 최소화할 수 있습니다.
# redis.conf (Master)
min-replicas-to-write 1
# 최소 1개 Replica에 동기화되지 않으면 쓰기 거부
min-replicas-max-lag 10
# Replica 동기화 지연이 10초를 넘으면 쓰기 거부
Sentinel은 고가용성(HA)을 제공하지만, 데이터가 늘어 단일 서버에 담기지 않는 문제는 해결하지 못합니다. 이 경우 Redis Cluster를 사용합니다.