Theory
인프라
Redis
Sentinel(공식문서 번역)

개요

Redis Sentinel은 Redis Cluster를 사용하지 않는 환경에서 Redis의 고가용성을 제공합니다.

Redis Sentinel은 모니터링, 알림, 클라이언트 구성 제공자 등의 부수적인 작업도 수행합니다.

Sentinel의 핵심 기능

Sentinel의 주요 기능은 다음과 같습니다:

1. 모니터링 (Monitoring)

  • 마스터와 복제본 인스턴스가 예상대로 작동하는지 지속적으로 확인

2. 알림 (Notification)

  • API를 통해 시스템 관리자나 다른 컴퓨터 프로그램에게 모니터링되는 Redis 인스턴스에 문제가 발생했을 때 알림

3. 자동 장애 조치 (Automatic failover)

  • 마스터가 예상대로 작동하지 않으면 복제본을 마스터로 승격
  • 다른 추가 복제본들을 새 마스터를 사용하도록 재구성
  • Redis 서버를 사용하는 애플리케이션에게 연결할 새 주소를 알림

4. 구성 제공자 (Configuration provider)

  • 클라이언트 서비스 검색을 위한 권한 소스 역할
  • 클라이언트는 Sentinel에 연결하여 특정 서비스를 담당하는 현재 Redis 마스터의 주소를 요청
  • 장애 조치가 발생하면 Sentinel이 새 주소를 보고

분산 시스템으로서의 Sentinel

Redis Sentinel은 분산 시스템입니다:

여러 Sentinel 프로세스가 협력하여 작동하도록 설계되었습니다. 다중 Sentinel 프로세스 협력의 장점:

  1. 오탐 확률 감소: 여러 Sentinel이 마스터를 사용할 수 없다고 합의해야 장애 감지
  2. 장애 복원력: 모든 Sentinel 프로세스가 작동하지 않아도 시스템이 동작 (단일 실패 지점 방지)

Sentinel 빠른 시작

Sentinel 버전

현재 버전은 Sentinel 2입니다:

  • 초기 Sentinel 구현을 더 강력하고 예측 가능한 알고리즘으로 재작성
  • Redis 2.8부터 안정적인 릴리스 제공
  • Redis 2.6의 Sentinel 1은 더 이상 사용하지 않음

Sentinel 실행

두 가지 방법으로 Sentinel을 실행할 수 있습니다:

# 방법 1: redis-sentinel 실행 파일 사용
redis-sentinel /path/to/sentinel.conf
 
# 방법 2: redis-server를 Sentinel 모드로 실행
redis-server /path/to/sentinel.conf --sentinel

중요한 요구사항:

  • 구성 파일 사용이 필수 (현재 상태 저장을 위해)
  • 구성 파일이 없거나 쓰기 권한이 없으면 Sentinel이 시작되지 않음
  • 기본적으로 TCP 포트 26379에서 수신 대기
  • 다른 Sentinel 인스턴스와 통신하려면 해당 포트가 열려있어야 함

배포 전 필수 지식

  1. 최소 3개의 Sentinel 인스턴스 필요 (강력한 배포를 위해)
  2. 독립적으로 실패할 수 있는 컴퓨터/VM에 배치 (다른 물리 서버 또는 가용성 영역)
  3. 비동기 복제로 인한 데이터 손실 가능성 존재
  4. 클라이언트에서 Sentinel 지원 필요
  5. 정기적인 테스트 필수 (개발/운영 환경에서)
  6. Docker/NAT 환경에서 주의: 포트 매핑으로 인한 자동 검색 문제

Sentinel 구성

기본적인 sentinel.conf 설정 예시:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

구성 매개변수 설명

기본 모니터링 설정:

sentinel monitor <master-name> <ip> <port> <quorum>
  • quorum: 마스터 장애를 인정하는 데 필요한 Sentinel 수
  • down-after-milliseconds: 인스턴스를 다운으로 간주하기 전 대기 시간(밀리초)
  • failover-timeout: 장애 조치 시간 제한
  • parallel-syncs: 장애 조치 후 동시에 재구성할 수 있는 복제본 수

예시 배포 시나리오

시나리오 1: 기본 3박스 설정 (권장)

       +----+
       | M1 |
       | S1 |
       +----+
          |
+----+    |    +----+
| R2 |----+----| R3 |
| S2 |         | S3 |
+----+         +----+

Configuration: quorum = 2

장점:

  • 간단하고 조정하기 쉬움
  • 각 박스가 Redis와 Sentinel을 모두 실행

주의사항:

  • 네트워크 파티션 시 이전 마스터에 연결된 클라이언트의 데이터 손실 위험

시나리오 2: 클라이언트 박스의 Sentinel

            +----+         +----+
            | M1 |----+----| R1 |
            |    |    |    |    |
            +----+    |    +----+
                      |
         +------------+------------+
         |            |            |
      +----+        +----+      +----+
      | C1 |        | C2 |      | C3 |
      | S1 |        | S2 |      | S3 |
      +----+        +----+      +----+

Configuration: quorum = 2

특징:

  • Redis 박스가 2개뿐일 때 사용
  • 클라이언트와 동일한 관점에서 마스터 가용성 판단

장애 상태: SDOWN vs ODOWN

SDOWN (Subjectively Down)

  • 개별 Sentinel의 주관적 다운 상태
  • 구성된 시간 동안 PING에 대한 유효한 응답을 받지 못할 때

ODOWN (Objectively Down)

  • 객관적 다운 상태
  • 충분한 수의 Sentinel(quorum 이상)이 SDOWN에 동의할 때
  • 실제 장애 조치를 트리거하는 상태

Sentinel API

주요 명령어

# 마스터 상태 확인
SENTINEL master mymaster
 
# 현재 마스터 주소 조회
SENTINEL get-master-addr-by-name mymaster
 
# 복제본 목록 조회
SENTINEL replicas mymaster
 
# Sentinel 목록 조회
SENTINEL sentinels mymaster
 
# 런타임 구성 변경
SENTINEL set mymaster down-after-milliseconds 1000

장애 조치 테스트

# 마스터를 30초 동안 사용 불가능하게 만들어 테스트
redis-cli -p 6379 DEBUG sleep 30

인증 설정

ACL 인증 (Redis 6+)

sentinel auth-user <master-name> <username>
sentinel auth-pass <master-name> <password>

패스워드 인증

sentinel auth-pass <master-name> <password>

고급 개념

Quorum과 다수결

  • Quorum: ODOWN 상태로 플래그하는 데 필요한 Sentinel 수
  • 다수결: 실제 장애 조치 수행을 위해서는 과반수의 승인 필요

예시: 5개 Sentinel, quorum = 2

  • 2개 Sentinel이 동의하면 장애 조치 트리거
  • 하지만 실제 수행을 위해서는 3개 이상의 승인 필요

구성 에포크 (Configuration Epochs)

  • 각 장애 조치마다 고유한 버전 번호 할당
  • 구성 충돌 방지 및 일관성 보장
  • 더 높은 버전이 항상 우선

복제본 선택 우선순위

복제본 선택 기준 (순서대로):

  1. replica-priority 값 (낮을수록 우선)
  2. 복제 오프셋 (더 많은 데이터를 받은 것 우선)
  3. 실행 ID (사전식 순서로 더 작은 것)

Docker/NAT 환경 설정

문제점

  • Docker의 포트 매핑으로 인한 자동 검색 실패
  • NAT 환경에서 실제 IP와 논리적 IP의 차이

해결책

# 복제본이 마스터에게 알릴 IP와 포트 설정
replica-announce-ip 5.5.5.5
replica-announce-port 1234

# Sentinel이 다른 Sentinel에게 알릴 IP와 포트 설정
sentinel announce-ip <ip>
sentinel announce-port <port>

TILT 모드

TILT 모드는 Sentinel이 비정상적인 상황을 감지했을 때 들어가는 특별한 "보호" 모드입니다.

진입 조건

  • 타이머 인터럽트 간 시간 차이가 음수이거나 예상보다 클 때 (2초 이상)
  • 컴퓨터 시간이 예상치 못하게 변경되거나 시스템이 매우 바쁠 때

TILT 모드에서의 동작

  • 모든 작업 중단
  • SENTINEL is-master-down-by-addr 요청에 부정적으로 응답
  • 30초 동안 정상 상태가 지속되면 종료

TILT 모드 확인

redis-cli -p 26379 info
# sentinel_tilt_since_seconds 필드 확인 (-1이면 정상)

데이터 일관성과 파티션

최종 일관성 시스템

Redis + Sentinel은 최종 일관성 시스템입니다:

  • 병합 함수: "마지막 장애 조치가 승리"
  • 이전 마스터의 데이터는 현재 마스터 데이터로 대체
  • 승인된 쓰기 손실 가능성 항상 존재

데이터 손실 최소화

# 최소 1개 복제본에 쓸 수 없으면 쓰기 중단
min-replicas-to-write 1
min-replicas-max-lag 10

이 설정으로 파티션된 이전 마스터는 10초 후 쓰기를 중단합니다.

모니터링과 알림

Pub/Sub 메시지

채널 __sentinel__:hello를 통한 이벤트 알림:

# 모든 이벤트 구독
PSUBSCRIBE *
 
# 주요 이벤트들:
# +sdown: 주관적 다운 상태
# +odown: 객관적 다운 상태  
# +failover-state-select-slave: 장애 조치 시작
# +switch-master: 마스터 변경 완료

성능 최적화

디스크리스 복제

# 전체 재동기화 시 디스크 없이 직접 네트워크로 전송
repl-diskless-sync yes
repl-diskless-sync-delay 5

백로그 크기 조정

# 부분 재동기화를 위한 백로그 크기
repl-backlog-size 1mb
repl-backlog-ttl 3600

트러블슈팅 가이드

일반적인 문제들

  1. 포트 26379가 막혀있음: 방화벽 설정 확인
  2. Quorum 설정 오류: 홀수 개의 Sentinel 사용 권장
  3. 네트워크 파티션: min-replicas-to-write 설정으로 완화
  4. 클라이언트 지원 부족: Sentinel 지원 라이브러리 사용

디버깅 명령어

# Sentinel 상태 확인
SENTINEL masters
SENTINEL slaves mymaster
SENTINEL sentinels mymaster
 
# 구성 확인
SENTINEL ckquorum mymaster
 
# 구성 강제 저장
SENTINEL flushconfig

실제 운영 권장사항

배포 체크리스트

  • 최소 3개의 Sentinel 인스턴스
  • 독립적인 장애 도메인에 배치
  • 클라이언트 Sentinel 지원 확인
  • 정기적인 장애 조치 테스트
  • 모니터링 및 알림 설정
  • 백업 및 복구 절차 수립

성능 고려사항

  • 쿼럼 크기: 네트워크 안정성과 응답성의 균형
  • 타임아웃 설정: 네트워크 지연시간을 고려한 조정
  • 백로그 크기: 네트워크 불안정성에 따른 조정

요약

Redis Sentinel은 비클러스터 환경에서 Redis의 고가용성을 제공하는 강력한 도구입니다.

주요 장점:

  • 자동 장애 조치
  • 간단한 설정
  • 클라이언트 투명성

주요 제한사항:

  • 최종 일관성만 보장
  • 단일 마스터 구조
  • 복잡한 네트워크 요구사항

올바른 설정과 테스트를 통해 안정적인 고가용성 Redis 시스템을 구축할 수 있습니다.


출처: Redis 공식 문서 - High availability with Redis Sentinel (opens in a new tab)