クバネティス(Kubernetes) 環境で Redis-Sentinel 構築実戦ガイド ③


Failover(障害対応) テスト

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

┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │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 がマスターへ切り替わります。
💥 ポッド(Pod) ダウン後に再起動すると IP が変わります。

Redis-0 💥 ダウン(delete)

💻 Terminal

💻 Redis-0 LOG: Master -> Replica

① 03秒 kill シグナルを受けて Redis ダウン (+0秒)
② 05秒 Redis 自動再起動 (+2秒)
③ 17秒 Sentinel から命令を受けて Master -> Replica(Slave) へ切替 (+14秒)

📄 redis.log

Redis-0 全ログ ▼
📄 redis.log

💻 Redis-1 LOG: Replica -> Master

① 03秒 Redis-0 ダウン検知 (+0秒)
② 06秒 Sentinel-1 から命令(replicaof noone)を受けてレプリカ -> マスターへ切替 (+3秒)

📄 redis.log

Redis-1 全ログ ▼
📄 redis.log

💻 Redis-2 LOG

① 03秒 Redis-0 ダウン検知 (+0秒)
② 07秒 新しいマスター(Redis-1) に接続 (+4秒)

📄 redis.log

Redis-2 全ログ ▼
📄 redis.log

💻 Sentinel-0 LOG

① 06.1秒 redis-0 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 06.2秒 redis-0 ダウン確定(+odown) (+3秒) -> 他の Sentinel と通信し過半数が同意すれば確定

📄 sentinel.log

Sentinel-0 全ログ ▼
📄 sentinel.log

💻 Sentinel-1 LOG

① 06.1秒 redis-0 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 06.2秒 redis-0 ダウン確定(+odown) (+3秒) -> 他の Sentinel と通信し過半数が同意すれば確定
③ 06.3秒 Sentinel 同士で投票し 'Sentinel-1' を Leader に選出(+elected-leader)
④ 06.4秒 redis-1 をマスターへ変更(+failover-state-send-slaveof-noone)

📄 sentinel.log

Sentinel-1 全ログ ▼
📄 sentinel.log

💻 Sentinel-2 LOG

① 06.1秒 redis-0 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 07.2秒 redis-0 ダウン確定(+odown) (+4秒) -> 他の Sentinel と通信し過半数が同意すれば確定

📄 sentinel.log

Sentinel-2 全ログ ▼
📄 sentinel.log

🧮 Failover(障害対応) 後の状況

redis-0 の IP が '10.42.0.92' から '10.42.0.103' に変わりました。

💻 Terminal

🧮 redis.conf 確認

Redis LOG: 'CONFIG REWRITE' で変更しました。

📄 redis.conf

🧮 sentinel.conf 確認

Sentinel LOG: 'Sentinel new configuration saved on disk' で変更しました。
redis-0,2 がレプリカと記録され、sentinel-0,1,2 の内容は同一です。

📄 sentinel.conf

🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(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 ポッド(Pod) が再びマスターになる、という意味で使いました。
    (Failover テストと区別するために使いました)

💻 Redis-1 💥ダウン(delete)

💻 Terminal

💻 Redis-0 LOG: Replica -> Master

① 29分 55秒 Redis-1 接続切断 (+0秒)
② 29分 58秒 Sentinel から命令を受けて Replica(Slave) -> Master へ切替(昇格) (+3秒)

📄 redis.log

Redis-0 全ログ ▼
📄 redis.log

💻 Redis-1 LOG: Master -> Replica

① 29分 55秒 kill シグナルを受けてダウン (+0秒)
② 29分 57秒 ポッド(Pod) 再起動 (+2秒)
③ 30分 11秒 Sentinel から命令を受けて Master -> Replica(Slave) へ切替 (+16秒)

📄 redis.log

Redis-1 全ログ ▼
📄 redis.log

💻 Redis-2 LOG

① 29分 55秒 Redis-1 との接続切断 (+0秒)
② 29分 59秒 Sentinel から Redis-0 が新しいマスターになった信号を受けて接続 (+4秒)

📄 redis.log

Redis-2 全ログ ▼
📄 redis.log

💻 Sentinel-0 LOG

① 58.4秒 redis-1 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 58.5秒 redis-1 ダウン確定(+odown) (+3秒) -> 他の Sentinel と通信し過半数が同意すれば確定
③ 58.5秒 Sentinel 同士で投票し 'Sentinel-0' を Leader に選出(+elected-leader)
④ 58.6秒 redis-0 をマスターへ変更(+failover-state-send-slaveof-noone)

📄 sentinel.log

Sentinel-0 全ログ ▼
📄 sentinel.log

💻 Sentinel-1 LOG

① 58.5秒 redis-1 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 58.6秒 redis-1 ダウン確定(+odown) (+3秒) -> 他の Sentinel と通信し過半数が同意すれば確定

📄 sentinel.log

Sentinel-1 全ログ ▼
📄 sentinel.log

💻 Sentinel-2 LOG

① 58.3秒 redis-1 ダウン検知(+sdown) (+3秒) -> sentinel.conf down-after-milliseconds mymaster 3000 ms
② 59.4秒 redis-1 ダウン確定(+odown) (+3秒) -> 他の Sentinel と通信し過半数が同意すれば確定

📄 sentinel.log

Sentinel-2 全ログ ▼
📄 sentinel.log

🧮 Failback(原状復帰) 後の状況

💻 Terminal

🧮 redis.conf 確認

📄 redis.conf

🧮 sentinel.conf 確認

Redis-0 マスター、Redis-1,2 レプリカ

📄 sentinel.conf

🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(原状復帰)

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