쿠버네티스 환경에서 Redis Sentinel Sidecar 패턴 구축 실전 가이드 ③


Failover(장애조치) 테스트

🖧 1. Redis-Sentinel 파드 다이어그램 (초기 상태)

┌─────────────────┐ │ Redis-0(106) │ │ 🟢Master │ │ Sentinel-0 │ └───────┬─────────┘ ┌───────────┴──────────┐ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Redis-1(108) │ │ Redis-2(110) │ │ 🟡Replica-1 │ │ 🟡Replica-2 │ │ Sentinel-1 │ │ Sentinel-2 │ └─────────────────┘ └─────────────────┘

1. Failover(장애조치) 테스트

Redis-0를 다운시켜서 Redis-1이 Replica에서 Master로 전환(승격)되는지 확인

  • 복제 Redis-1,2 중 Redis-1이 마스터가 되는 이유: redis.conf replica-priority 값: Redis-0 100, Redis-1 110, Redis-2 120 -> 값이 작은 Redis-1이 마스터로 전환된다.
  • 이 경우 파드-0에 Redis와 Sentinel이 같이 있으므로 같이 다운된다.
    💥 파드 다운 후 재시작하면 Redis와 Sentinel의 IP가 변경된다.

Pod-0(Redis-0/Sentinel-0) 💥다운(delete)

💻 Redis-0 LOG: Master -> Replica

① 27초 kill 시그널을 받고 레디스 다운 (+0초)
② 30초 레디스 자동 재시작 (+3초)
③ 43초 센티널로부터 명령를 받아 Master -> Replica(Slave)로 전환 (+16초)

Redis-0 전체 로그

💻 Redis-1 LOG: Replica -> Master

① 27초 Redis-0 다운 감지(연결 단절) (+0초)
② 31초 센티널로 부터 명령(replicaof noone)을 받아 Replica -> Master로 전환 (+4초)

Redis-1 전체 로그

💻 Redis-2 LOG: Replica

① 27초 Redis-0 다운 감지(연결 끊김) (+0초)
② 32초 새 마스터(Redis-1)에 연결 (+5초)

Redis-2 전체 로그

💻 Sentinel-0 LOG

① 27초 kill 시그널을 받고 센티널 다운 (+0초)
② 30초 센티널 자동 재시작 (+3초)
③ 34초 Redis-1 모니터 시작 (+7초)

Sentinel-0 전체 로그

💻 Sentinel-1 LOG

① 27초 Redis-0 연결 끊김 (+0초)
② 30초 Redis-0 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
③ 31초 Redis-0 다운 확정(+odown) (+4초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정
④ 43초 Redis-0에게 Redis-1이 마스터로 변경되었다고 알림 (+16초)

Sentinel-1 전체 로그

💻 Sentinel-2 LOG

① 27초 Redis-0 연결 끊김 (+0초)
② 30초 Redis-0 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
③ 30초 Redis-0 다운 확정(+odown) (+3초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정
③ 30초 센티널끼리 투표해서 'Sentinel-2'을 Leader로 선출(+elected-leader) (+3초)
④ 31초 Redis-1을 마스터로 변경(+failover-state-send-slaveof-noone) (+4초)

Sentinel-2 전체 로그

🧮 Failover(장애조치) 후 상황

Redis-0 IP가 '10.42.0.106'에서 '10.42.0.111'로 변경됐다.

💾 redis.conf 확인

replicaof 확인

💾 sentinel.conf 확인

Redis-1가 마스터이고 Redis-0,2가 복제이다.

🖧 Redis-Sentinel 파드 다이어그램 (Failover 후)

┌─────────────────┐ │ Redis-0(111) │ │ 🟡Replica-1 │ │ Sentinel-0 │ └───────┬─────────┘ ▲ ┌───────────┴──────────┐ │ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Redis-1(108) │ │ Redis-2(110) │ │ 🟢Master │ │ 🟡Replica-2 │ │ Sentinel-1 │ │ Sentinel-2 │ └─────────────────┘ └─────────────────┘

2. Failback(원상복구) 테스트

현재 마스터인 Redis-1를 다운시켜서 Redis-0가 Replica에서 Master로 전환(승격)되는지 확인
📚 'Failback(원상복구) 테스트'는 Redis-0 파드가 다시 마스터가 되도록 한다는 의미에서 사용했다.
    (Failover 테스트와 구분하기 위해서 사용했다)

💻 Redis-1 💥다운(delete)

💻 Redis-0 LOG: Replica -> Master

① 15초 Redis-1 연결 단절 (+1초)
② 18초 센티널로부터 명령를 받아 Replica(Slave) -> Master로 전환(승격) (+4초)

Redis-0 전체 로그

💻 Redis-1 LOG: Master -> Replica

① 14초 kill 시그널을 받고 다운 (+0초)
② 17초 파드 재시작 (+3초)
③ 29초 센티널로부터 명령를 받아 Master -> Replica(Slave)로 전환 (+15초)

Redis-1 전체 로그

💻 Redis-2 LOG

① 15초 Redis-1과 연결 끊김 (+1초)
② 19초 센티널로부터 Redis-0가 새 마스터가 되었다는 신호를 받고 연결 (+5초)

Redis-2 전체 로그

💻 Sentinel-0 LOG

① 14초 Redis-1 연결 끊김 (+0초)
② 17초 Redis-1 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 19초 Redis-1 다운 확정(+odown) (+5초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정

Sentinel-0 전체 로그

💻 Sentinel-1 LOG

① 14초 kill 시그널을 받고 다운 (+0초)
② 17초 파드 재시작 (+3초)

Sentinel-1 전체 로그

💻 Sentinel-2 LOG: Leader로 선출

① 14초 Redis-1과 연결 끊김 (+0초)
② 17초 Redis-1과 다운 감지 (+3초)
③ 18.7초 Redis-1과 다운 확정 (+4초)
④ 18.8초 센티널끼리 투표해서 'Sentinel-2'을 Leader로 선출(+elected-leader) (+4초)
④ 18.8초 redis-0을 마스터로 변경(+failover-state-send-slaveof-noone) (+4초)

Sentinel-2 전체 로그

🧮 Failback(원상복구) 후 상황

Redis-0 IP가 '10.42.0.108'에서 '10.42.0.112'로 변경됐다.

💾 redis.conf 확인

💾 sentinel.conf 확인

Redis-0가 마스터이고 Redis-1,2가 복제이다.

🖧 Redis-Sentinel 파드 다이어그램 (원상복구)

┌─────────────────┐ │ Redis-0(111) │ │ 🟢Master │ │ Sentinel-0 │ └───────┬─────────┘ ┌───────────┴──────────┐ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Redis-1(112) │ │ Redis-2(110) │ │ 🟡Replica-1 │ │ 🟡Replica-2 │ │ Sentinel-1 │ │ Sentinel-2 │ └─────────────────┘ └─────────────────┘


<< K8s Sidecar 패턴 구축 ② K8s Redis-Standalone ① >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.