2017-04-08

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

1atleast3

原本 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    
    

    2sentineldown

  • failover 失敗

    5failovefail

    [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 之間的溝通法無法正確進行

  • 解決方式有二個(擇一即可):
  1. 關閉 protected-mode

    protected-mode no

  2. 加上 bind

    bind 127.0.0.1 192.168.31.102

    • 不要只 bind 127.0.0.1 這樣其他 sentinel 還是連不到
  • 加上設定並重新啟動後就原本 sentinel sdown 的訊息就不見了

3sentinelOK

-調整後設定

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 成功

4failoversucc

參考資料

  1. Redis Sentinel Documentation
  2. Redis開發運維實踐指南

沒有留言:

張貼留言