k8s_redis_sentinel_3
クバネティス(Kubernetes) 環境で Redis-Sentinel 構築実戦ガイド ③
Failover(障害対応) テスト
🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(初期状態)
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)
💻 Redis-0 LOG: Master -> Replica
① 03秒 kill シグナルを受けて Redis ダウン (+0秒)
② 05秒 Redis 自動再起動 (+2秒)
③ 17秒 Sentinel から命令を受けて 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 と通信し過半数が同意すれば確定
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秒) -> 他の Sentinel と通信し過半数が同意すれば確定
③ 06.3秒 Sentinel 同士で投票し '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 と通信し過半数が同意すれば確定
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 ポッド(Pod) ダイアグラム(Failover 後)
2. Failback(原状復帰) テスト
現在のマスターである Redis-1 をダウンさせ、Redis-0 が Replica から Master へ切り替わる(昇格する)ことを確認します
📚 'Failback(原状復帰) テスト' は Redis-0 ポッド(Pod) が再びマスターになる、という意味で使いました。
(Failover テストと区別するために使いました)
💻 Redis-1 💥ダウン(delete)
💻 Redis-0 LOG: Replica -> Master
① 29分 55秒 Redis-1 接続切断 (+0秒)
② 29分 58秒 Sentinel から命令を受けて Replica(Slave) -> Master へ切替(昇格) (+3秒)
Redis-0 全ログ
💻 Redis-1 LOG: Master -> Replica
① 29分 55秒 kill シグナルを受けてダウン (+0秒)
② 29分 57秒 ポッド(Pod) 再起動 (+2秒)
③ 30分 11秒 Sentinel から命令を受けて Master -> Replica(Slave) へ切替 (+16秒)
Redis-1 全ログ
💻 Redis-2 LOG
① 29分 55秒 Redis-1 との接続切断 (+0秒)
② 29分 59秒 Sentinel から 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秒) -> 他の Sentinel と通信し過半数が同意すれば確定
③ 58.5秒 Sentinel 同士で投票し '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 と通信し過半数が同意すれば確定
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 と通信し過半数が同意すれば確定
Sentinel-2 全ログ
🧮 Failback(原状復帰) 後の状況
🧮 redis.conf 確認
🧮 sentinel.conf 確認
Redis-0 マスター、Redis-1,2 レプリカ
🖧 Redis-Sentinel ポッド(Pod) ダイアグラム(原状復帰)
🧑💻 結論
Redis-Sentinel Failover(障害対応)、Failback(原状復帰) テスト成功
ポッド(Pod) をダウン、再起動すると IP は変わりますが、問題なく処理されます。
障害対応(復旧) 時間は約 4秒です。
➡ ここまでは Redis-Sentinel 単体でテストしました。
Java(Spring) App と接続して動くところまで見るには、こちらをクリックしてください。
| << K8s Redis-Sentinel 構築 ② | K8s Redis-Sentinel App ① >> |
|---|
