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


Failover(장애조치) 테스트

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

┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │Sentinel-0(98) │ │Sentinel-1(100)│ │Sentinel-2(102)│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────────────────┼───────────────────┘ ▼ ┌───────────────┐ │ Redis-0(92) │ │ 🟢Master │ └──────┬────────┘ ┌──────────┴───────────┐ ▼ ▼ ┌───────────────┐ ┌───────────────┐ │ Redis-1(94) │ │ Redis-2(96) │ │ 🟡Replica-1 │ │ 🟡Replica-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이 마스터로 전환된다.
💥 파드 다운 후 재시작하면 IP가 변경된다.

Redis-0 💥 다운(delete)

💻 Redis-0 LOG: Master -> Replica

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

Redis-0 전체 로그

💻 Redis-1 LOG: Replica -> Master

① 03초 Redis-0 다운 감지 (+0초)
② 06초 Sentinel-1로 부터 명령(replicaof noone)을 받아 복제 -> 마스터로 전환 (+3초)

Redis-1 전체 로그

💻 Redis-2 LOG

① 03초 Redis-0 다운 감지 (+0초)
② 07초 새 마스터(Redis-1)에 연결 (+4초)

Redis-2 전체 로그

💻 Sentinel-0 LOG

① 06.1초 redis-0 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 06.2초 redis-0 다운 확정(+odown) (+3초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정

Sentinel-0 전체 로그

💻 Sentinel-1 LOG

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

Sentinel-1 전체 로그

💻 Sentinel-2 LOG

① 06.1초 redis-0 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 07.2초 redis-0 다운 확정(+odown) (+4초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정

Sentinel-2 전체 로그

🧮 Failover(장애조치) 후 상황

redis-0 IP가 '10.42.0.92'에서 '10.42.0.103'로 변경됐다.

🧮 redis.conf 확인

Redis LOG: 'CONFIG REWRITE'에서 변경했다.

🧮 sentinel.conf 확인

Sentinel LOG: 'Sentinel new configuration saved on disk'에서 변경했다.
redis-0,2가 복제라고 기록, sentinel-0,1,2 내용 동일.

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

┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │Sentinel-0(98) │ │Sentinel-1(100)│ │Sentinel-2(102)│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └─────┬─────────────┴───────────────────┘ │ │ ┌───────────────┐ │ │ Redis-0(103) │ │ │ 🟡Replica-1 │ │ └───────────────┘ │ ▲ │ ┌──────────┴───────────┐ ▼ │ ▼ ┌──────┴────────┐ ┌───────────────┐ │ Redis-1(94) │ │ Redis-2(96) │ │ 🟢Master │ │ 🟡Replica-2 │ └───────────────┘ └───────────────┘

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

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

💻 Redis-1 💥다운(delete)

💻 Redis-0 LOG: Replica -> Master

① 29분 55초 Redis-1 연결 단절 (+0초)
② 29분 58초 센티널로부터 명령를 받아 Replica(Slave) -> Master로 전환(승격) (+3초)

Redis-0 전체 로그

💻 Redis-1 LOG: Master -> Replica

① 29분 55초 kill 시그널을 받고 다운 (+0초)
② 29분 57초 파드 재시작 (+2초)
③ 30분 11초 센티널로부터 명령를 받아 Master -> Replica(Slave)로 전환 (+16초)

Redis-1 전체 로그

💻 Redis-2 LOG

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

Redis-2 전체 로그

💻 Sentinel-0 LOG

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

Sentinel-0 전체 로그

💻 Sentinel-1 LOG

① 58.5초 redis-1 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 58.6초 redis-1 다운 확정(+odown) (+3초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정

Sentinel-1 전체 로그

💻 Sentinel-2 LOG

① 58.3초 redis-1 다운 감지(+sdown) (+3초) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 59.4초 redis-1 다운 확정(+odown) (+3초) -> 다른 센티널들과 통신해서 과반수가 동의하면 확정

Sentinel-2 전체 로그

🧮 Failback(원상복구) 후 상황

🧮 redis.conf 확인

🧮 sentinel.conf 확인

Redis-0 마스터, Redis-1,2 복제

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

┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │Sentinel-0(98) │ │Sentinel-1(100)│ │Sentinel-2(102)│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────────────────┼───────────────────┘ ▼ ┌───────────────┐ │ Redis-0(103) │ │ 🟢Master │ └──────┬────────┘ ┌──────────┴───────────┐ ▼ ▼ ┌───────────────┐ ┌───────────────┐ │ Redis-1(104) │ │ Redis-2(96) │ │ 🟡Replica-1 │ │ 🟡Replica-2 │ └───────────────┘ └───────────────┘

🧑‍💻 결론

Redis-Sentinel Failover(장애 조치), Failback(원상 복구) 테스트 성공
파드(pod)를 다운, 재시작하면 IP가 변경되지만 아무 문제없이 처리된다.
장애 조치(복구) 시간은 4초 정도 걸린다.


➡ 여기까지는 Redis-Sentinel 단독으로 테스트했습니다.
Java(Spring) App와 연결해서 작동하는 것까지 보려면 여기를 클릭하세요.



<< K8s Redis-Sentinel 구축 ② K8s Redis-Sentinel App ① >>

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