文章目錄
Redis 多個 sentinel 無法執行 failover?!
這是在為公司架設 Redis sentinel 時遇到的問題:依官方設定至少設定三個 sentinel instance 並設定 quorum 為 2
,設定上非常順利,但進行 HA 演練時發現 sentinel 沒有正常作用,並沒有如預期地進行 configuration rewrite,看 log 發現各個 sentinel 皆有正確在 master shutdown 後將 master 標示為 “主觀下線”(sdown) 但一直未被標示為 “客觀下線”(odown) 所以 sentinel 無法執行 failover
問題主因
照慣例 debug 先說結果:protected-mode
造成的
sentinel 數量建議
官方有明確建議至少三個 instance
原本 sentinel 設定
port 26379
sentinel monitor master 192.168.31.102 6379 2
sentinel down-after-milliseconds master 3000
sentinel failover-timeout master 18000
sentinel parallel-syncs master 1
sentinel auth-pass master yowkopassword
仔細檢視 log,可以發現,sentinel 一開始啟動時,其他 sentinel 就被標視為 sdown 了
訊息內容
[19280] 08 Apr 18:37:24.997 # +sdown sentinel a095bbb8638b6062ffae2c0d817fa03bb1260ad3 192.168.31.247 26379 @ master 192.168.31.102 6379
訊息截圖
failover 失敗
訊息內容
[17376] 08 Apr 18:35:17.740 # +try-failover master master 192.168.31.102 6379 [17376] 08 Apr 18:35:17.745 # +vote-for-leader 2ae78df0c2add24032cb8f4bb8168ede17848ed3 3 [17376] 08 Apr 18:35:28.248 # -failover-abort-not-elected master master 192.168.31.102 6379 [17376] 08 Apr 18:35:28.303 # Next failover delay: I will not start a failover before Sat Apr 08 18:35:54 2017
訊息截圖
如何修正
原本推斷是 sentinel 推選 leader 失敗造成無法決定出 sentinel leader 來進行 failover,而這個問題的解決方法只要在 sentinel conf 加上 can-failover
表示該 sentinel 可以成為 leader 就行了,但測試後發現 can-failover
這個設定已被移除, redis 已經不再使用這個設定
經過反覆測試後才診斷發現是 protected-mode
造成與其他 sentinel 之間的溝通法無法正確進行
解決方式有二個(擇一即可):
關閉
protected-mode
protected-mode no
加上 bind
bind 127.0.0.1 192.168.31.102
- 不要只 bind 127.0.0.1 這樣其他 sentinel 還是連不到
加上設定並重新啟動後就原本 sentinel sdown 的訊息就不見了
調整後設定
port 26379
bind 127.0.0.1 192.168.31.102
sentinel monitor master 192.168.31.102 6379 2
sentinel down-after-milliseconds master 3000
sentinel failover-timeout master 18000
sentinel parallel-syncs master 1
sentinel auth-pass master yowkopassword
failover 成功
參考資料
文章作者 Yowko Tsai
上次更新 2021-10-28
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。