クバネティス(Kubernetes) 環境で Redis Sentinel Sidecarパターン 構築 実践ガイド ③


Failover(フェイルオーバー)テスト

🖧 1. Redis-Sentinel ポッド(Pod) ダイアグラム(初期状態)

┌─────────────────┐ │ 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 が Master になる理由: redis.conf replica-priority 値: Redis-0 100, Redis-1 110, Redis-2 120 -> 値が小さい Redis-1 が Master に切り替わります。
  • この場合ポッド(Pod)-0 に Redis と Sentinel があるので一緒にダウンします。
    💥 ポッド(Pod) ダウン後に再起動すると Redis と Sentinel の IP が変わります。

Pod-0(Redis-0/Sentinel-0) 💥ダウン(delete)

💻 Terminal

💻 Redis-0 LOG: Master -> Replica

① 27秒 kill シグナルを受け Redis ダウン(+0秒)
② 30秒 Redis が自動再起動(+3秒)
③ 43秒 Sentinel からの命令を受け Master -> Replica(Slave) へ切替(+16秒)

📄 redis.log

Redis-0 全ログ ▼
📄 redis.log

💻 Redis-1 LOG: Replica -> Master

① 27秒 Redis-0 ダウン検知(接続切断)(+0秒)
② 31秒 Sentinel からの命令(replicaof noone) を受け Replica -> Master へ切替(+4秒)

📄 redis.log

Redis-1 全ログ ▼
📄 redis.log

💻 Redis-2 LOG: Replica

① 27秒 Redis-0 ダウン検知(接続切断)(+0秒)
② 32秒 新しい Master(Redis-1) に接続(+5秒)

📄 redis.log

Redis-2 全ログ ▼
📄 redis.log

💻 Sentinel-0 LOG

① 27秒 kill シグナルを受け Sentinel ダウン(+0秒)
② 30秒 Sentinel が自動再起動(+3秒)
③ 34秒 Redis-1 の監視を開始(+7秒)

📄 redis.log

Sentinel-0 全ログ ▼
📄 redis.log

💻 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秒) -> 他の Sentinel と通信し過半数が同意すれば確定
④ 43秒 Redis-0 に Redis-1 が Master に変わったと通知(+16秒)

📄 redis.log

Sentinel-1 全ログ ▼
📄 redis.log

💻 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秒) -> 他の Sentinel と通信し過半数が同意すれば確定
③ 30秒 Sentinel 同士で投票し 'Sentinel-2' を Leader に選出(+elected-leader) (+3秒)
④ 31秒 Redis-1 を Master に変更(+failover-state-send-slaveof-noone) (+4秒)

📄 redis.log

Sentinel-2 全ログ ▼
📄 redis.log

🧮 Failover(フェイルオーバー)後の状況

Redis-0 の IP が '10.42.0.106' から '10.42.0.111' に変わりました。

💻 Terminal

💾 redis.conf 確認

replicaof 確認

📄 redis.conf

💾 sentinel.conf 確認

Redis-1 が Master で Redis-0,2 がレプリカです。

📄 sentinel.conf

🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(Failover 後)

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

2. Failback(フェイルバック)テスト

現在の Master である Redis-1 をダウンさせ、Redis-0 が Replica から Master へ切替(昇格)するか確認します
📚 'Failback(フェイルバック)テスト' は Redis-0 ポッド(Pod) が再び Master になるようにする、という意味で使いました。
    (Failover テストと区別するために使いました)

💻 Redis-1 💥ダウン(delete)

💻 Terminal

💻 Redis-0 LOG: Replica -> Master

① 15秒 Redis-1 接続切断(+1秒)
② 18秒 Sentinel からの命令を受け Replica(Slave) -> Master へ切替(昇格)(+4秒)

📄 redis.log

Redis-0 全ログ ▼
📄 redis.log

💻 Redis-1 LOG: Master -> Replica

① 14秒 kill シグナルを受けダウン(+0秒)
② 17秒 ポッド(Pod) 再起動(+3秒)
③ 29秒 Sentinel からの命令を受け Master -> Replica(Slave) へ切替(+15秒)

📄 redis.log

Redis-1 全ログ ▼
📄 redis.log

💻 Redis-2 LOG

① 15秒 Redis-1 との接続切断(+1秒)
② 19秒 Sentinel から Redis-0 が新しい Master になった信号を受けて接続(+5秒)

📄 redis.log

Redis-2 全ログ ▼
📄 redis.log

💻 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 と通信し過半数が同意すれば確定

📄 redis.log

Sentinel-0 全ログ ▼
📄 redis.log

💻 Sentinel-1 LOG

① 14秒 kill シグナルを受けダウン(+0秒)
② 17秒 ポッド(Pod) 再起動(+3秒)

📄 redis.log

Sentinel-1 全ログ ▼
📄 redis.log

💻 Sentinel-2 LOG: Leader に選出

① 14秒 Redis-1 との接続切断(+0秒)
② 17秒 Redis-1 のダウンを検知(+3秒)
③ 18.7秒 Redis-1 のダウンを確定(+4秒)
④ 18.8秒 Sentinel 同士で投票し 'Sentinel-2' を Leader に選出(+elected-leader) (+4秒)
④ 18.8秒 redis-0 を Master に変更(+failover-state-send-slaveof-noone) (+4秒)

📄 redis.log

Sentinel-2 全ログ ▼
📄 redis.log

🧮 Failback(フェイルバック)後の状況

Redis-0 の IP が '10.42.0.108' から '10.42.0.112' に変わりました。

💻 Terminal

💾 redis.conf 確認

📄 redis.conf

💾 sentinel.conf 確認

Redis-0 が Master で Redis-1,2 がレプリカです。

📄 sentinel.conf

🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(フェイルバック後)

┌─────────────────┐ │ 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 返事がかかってなれば、メールでお知らせします。