Sentinel(센티널)

레디스는 인메모리 데이터베이스이기 때문에, 따로 백업 설정을 하지 않고 인스턴스가 재시작된다면 모든 데이터가 사라지게 되고 서비스 전체 장애로 이어질 수 있다. 레디스 센티넬(Redis Sentinel)은 이러한 현상을 방지하기 위해 레디스의 고가용성(High Availability, HA)를 제공하기 위한 모니터링 및 장애 조치 시스템이다.

  • 모니터링: 마스터 / 복제본 인스턴스 상태 실시간 확인

  • 자동 페일오버: 마스터의 비정상 상태를 감지해 복제본 중 하나를 새로운 마스터로 승격

  • 인스턴스 구성 정보 안내: 센티넬은 클라이언트에게 현재 구성의 마스터 인스턴스 정보를 제공하여, 클라이언트가 자동으로 마스터 인스턴스를 찾을 수 있도록 지원

분산 시스템에서의 센티널

센티널 네트워크를 통해 모니터링 결과와 장애 감지 정보를 공유하며, 특정 노드에 장애가 발생했다고 판단될 때 다수의 센티널이 이에 동의해야만 페일오버 절차를 시작한다. 합의 과정을 통해 센티널들은 분산 환경에서 신뢰성 있는 장애 감지와 자동 전환 결정을 내릴 수 있으며, 이 집단적 의사결정 메커니즘이 바로 쿼럼(quorum)의 기반이 된다.

쿼럼(Quorum)

쿼럼은 마스터 노드가 장애 상태임을 객관적으로 판단하기 위해 최소 몇 개의 센티널이 해당 마스터를 도달 불가능하다고 동의해야 하는지를 의미한다.

  • 일반적으로 쿼럼 수는 센티널 인스턴스의 과반수 이상으로 설정하는 것이 권장

  • 예를 들어, 3대의 센티널이 운영 중이라면 쿼럼은 2 이상으로 설정해, 최소 2개의 센티널이 장애를 감지하면 실제 장애로 판단

  • 실제 페일오버를 수행은 리더 센티널이 담당 수행

    • 쿼럼은 장애 감지에만 사용되며, 실제 페일오버를 수행하기 위해서는 센티넬 프로세스의 과반수가 동의한 센티널 리더가 페일오버를 수행

Redis 센티널의 고가용성을 확보하기 위해서는 센티널 인스턴스를 다음과 같이 분산 배포하는 것이 중요하다.

  • 서버 및 가용 영역 분산: 각 인스턴스는 서로 다른 물리적 서버 또는 가용 영역에 배포

  • 최소 3대 이상의 센티널 인스턴스 운영: 쿼럼을 이용한 과반수 선출 개념을 사용하기 때문에 3대 이상의 홀수로 구성을 권장

센티널 인스턴스 배치 방법

아래는 1개의 마스터와 2개의 레플리카(슬레이브), 그리고 각 서버마다 센티널 인스턴스를 함께 배포하여 고가용성을 확보하는 구성 예시이다.

  • 각 서버에는 하나의 Redis 인스턴스(마스터 또는 레플리카)와 하나의 센티널 인스턴스를 함께 배치

  • 센티널 인스턴스가 서로 다른 서버에 위치하게 되어, 서버 장애 시에도 센티널 다수결(쿼럼)을 통한 장애 감지 및 자동 페일오버 가능

  • 구성

    • Server A: Redis Master + Sentinel

    • Server B: Redis Replica (Slave) + Sentinel

    • Server C: Redis Replica (Slave) + Sentinel

자동 페일오버 과정

센티널의 자동 페일오버는 다음과 같은 단계로 진행된다.

  1. 마스터 장애 상황 감지

    • 각 센티널은 주기적으로 PING 명령어를 사용하여 마스터 노드의 상태를 확인

    • down-after-milliseconds 기간 동안 응답이 없거나 비정상 응답이면 해당 센티널은 로컬 판단으로 장애로 판단

  2. sdown / odown 실패 상태로 전환

    • 마스터 인스턴스에 대한 응답이 없거나 비정상적인 응답이 지속되면 센티널은 해당 마스터를 sdown 상태(subjectly down)로 표시

    • 이후 다른 센티널 노드들에게 장애 사실을 전파

    • 전파를 받은 센티널들은 해당 마스터에 대한 상태를 확인하고, 과반수 이상의 센티널이 동의하면 odown 상태(objectively down)로 전환

  3. 에포크(epoch) 증가 장애가 확정되면 각 센티널은 페일오버를 위한 새로운 에포크(epoch) 값을 증가시켜 고유한 페일오버 시도를 구분한다.

    • odown이 확정되면 각 센티널은 새로운 페일오버 라운드를 구분하기 위해 current-epoch를 증가(처음엔 1)

    • 각 센티널은 해당 에포크에서 한 후보에게만 투표할 수 있으며, 에포크 값은 서로 다른 페일오버 시도를 식별하는 버전 역할 수행

  4. 센티널 리더 선출

    • 센티널들은 동일 에포크에서 리더가 될 의사를 표명하고 상호 투표 수행

    • 과반수의 표를 얻은 센티널이 리더가 됨

  5. 복제본 선정 및 마스터 승격

    • 리더 센티널은 후보 복제본들 중 승격 대상을 선정

      • redis.conf 파일에 명시된 replica-priority 낮은 복제본

      • 마스터로부터 많은 데이터를 수신한 복제본

    • 선정한 복제본에 SLAVEOF NO ONE 명령어를 수행해, 기존 마스터로부터 복제를 중단

  6. 복제 연결 변경

    • 나머지 복제본들에 REPLICAOF <new-master-ip> <port>를 전송해 새 마스터를 따라가도록 재구성

스플릿 브레인(Split Brain)

스플릿 브레인은 네트워크 파티션 이슈로 인해 분산 환경의 데이터 저장소가 끊어지고, 각 파티션이 정상적인 서비스로 인식하는 상황을 의미한다.

  • 센티널 환경에서 스플릿 브레인이 발생하면, 네트워크가 분리된 각 파티션 내의 센티널들이 서로 통신하지 못하게 됨

  • 각 파티션이 독립적으로 장애를 감지하고 페일오버를 수행할 수 있음

  • 결과적으로 두 개 이상의 마스터가 동시에 존재하는 상황 발생

네트워크 파티션으로 인해 Partition A(마스터 + Sentinel A)와*Partition B(레플리카 2대 + Sentinel B, Sentinel C)로 나뉘는 상황의 예시는 다음과 같다.

+---------------------------+             +---------------------------+
|        Partition A        |             |        Partition B        |
|                           |             |                           |
|  +---------------------+  |             |  +---------------------+  |
|  | Sentinel A          |  |             |  | Sentinel B          |  |
|  +---------------------+  |             |  +---------------------+  |
|  +---------------------+  |             |  +---------------------+  |
|  | Redis Master        |  |             |  | Redis Replica       |  |
|  +---------------------+  |             |  +---------------------+  |
|                           |             |  +---------------------+  |
|                           |             |  | Sentinel C          |  |
|                           |             |  +---------------------+  |
|                           |             |  +---------------------+  |
|                           |             |  | Redis Replica       |  |
|                           |             |  +---------------------+  |
+---------------------------+             +---------------------------+
  • 네트워크 단절 상황

    • 마스터 노드와 Sentinel A가 포함된 네트워크 영역 A, 복제본 노드 2대와 Sentinel B, Sentinel C가 포함된 네트워와 영역 B) 간 네트워크 단절 발생

    • 두 네트워크 영역은 서로를 인식하지 못함

  • 센티널 동작 과정

    • Sentinel B와 Sentinel C는 마스터 노드에 접근하지 못해 마스터를 비정상으로 판단하고 Failover를 시작

    • 과반수(3대 중 2대)인 Sentinel B와 C가 같은 파티션에 있어 복제본 중 하나를 새로운 마스터로 승격

  • 스플릿 브레인 발생

    • 네트워크 단절이 지속되는 동안 기존 마스터(Partition A)와 새로 승격된 마스터(Partition B)가 동시에 마스터 역할 수행

    • 두 개의 독립 마스터가 존재하면서 데이터 불일치 발생

+------------------------------------------------------------+
|                          클라이언트 연결                       |
+------------------------------------------------------------+
|                                                            |
|       기존 클라이언트                   새로운 클라이언트          |
|                                                            |
|  +-------------------+          +-------------------+      |
|  |                   |          |                   |      |
|  | 기존 마스터 (A)      |          | 새로운 마스터 (B)    |      |
|  |                   |          |                   |      |
|  +---------+---------+          +---------+---------+      |
|            |                              |                |
|            |                              |                |
|  +---------v---------+          +---------v---------+      |
|  | Sentinel A        |          | Sentinel B, C     |      |
|  +-------------------+          +-------------------+      |
|                                                            |
+------------------------------------------------------------+
  • 기존 연결된 클라이언트의 동작

    • 기존 마스터에 연결된 클라이언트는 네트워크 단절의 영향을 받지 않으면 계속 기존 마스터에 쓰기를 수행

    • 기존 마스터의 데이터는 승격된 새로운 마스터와 동기화되지 않음

  • 새로운 클라이언트의 동작

    • 새로운 클라이언트는 Sentinel에 현재 마스터 주소를 요청

    • 단절 상황에서 Sentinel B/C는 승격된 새 마스터의 주소를 반환하므로, 새로운 클라이언트는 새 마스터에 쓰기를 수행

  • 네트워크 복구 후

    • 네트워크가 복구되면 기존 마스터는 Sentinel B/C의 결정에 따라 새 마스터의 복제본으로 재구성

    • 이 과정에서 기존 마스터(이제 복제본)의 데이터가 초기화되며, 단절 기간 동안 기존 마스터에 기록된 데이터는 유실될 수 있음

참고자료

Last updated

Was this helpful?