Redis哨兵

GrowthRoad發表於2024-09-13

Redis哨兵

一、概念

哨兵是巡查監控後臺master主機是否故障,如果故障了根據投票數自動將某一個從庫轉換為新主庫,繼續對外服務

哨兵能夠監控redis執行狀態,包括master和slave

當master當機,能自動將slave切換成新的 master

  • 主從監控:監控主從redis庫是否正常執行

  • 訊息通知:哨兵可以將故障轉移的結果傳送給客戶端

  • 故障轉移:如果master異常,則會進行主從切換,將其中一個slave作為新master

  • 配置中心:客戶端透過連線哨兵來獲得當前redis服務的主節點地址

二、哨兵配置

哨兵有單獨的配置檔案 sentinel.conf ,其中有和redis相同的配置如 bind、daemonize、protected-mode、port、logfile、dir等

除此之外哨兵單獨的配置:

  • sentinel monitor < master name > < ip > < redis-port > < quorum >

    • 設定要監控的master伺服器

    • quorum 表示最少幾個哨兵認可客觀下線,同意故障遷移的法定票數

      • 由於網路原因,有時候一個sentinel會因為網路堵塞而誤認為一個master redis已經死掉了,在sentinel叢集環境下,需要多個sentinel互相溝通來確認某個master是否真的死了,quorum這個引數是進行客觀下線的依據,意思是至少有quorum個sentinel認為這個master有故障,才會對這個master進行下線以及故障轉移,因為有時候某個sentinel節點可能因為自身網路原因導致無法連線master,而此時master並沒有出現故障,所以這就需要多個sentinel都一致認為該master有問題,才進行下一步操作,這就保證了公平性和高可用性

  • sentinel auth-pass < master-name> < password>

    • master設定了密碼,連線master服務的密碼

其他配置:

  • sentinel down-after-milliseconds < master-name > < milliseconds>

    • 指定多少毫秒之後,主節點沒有應答哨兵,此時哨兵主觀上認為主節點下線

  • sentinel parallel-syncs < master-name> < nums>

    • 表示允許並行同步的slave個數,當master掛了後,哨兵會選出新的master,剩餘的slave會向新的master發起同步資料

  • sentinel failover-timeout < master-name> < milliseconds>

    • 故障轉移的超過時間,進行故障轉移時,如果超過設定的毫秒,表示故障轉移失敗

  • sentinel notification-script < master-name> < script-path>

    • 配置當某一事件發生時所需要執行的指令碼

  • sentinel client-reconfig-script < master-name> < script-path>

    • 客戶端重新配置主節點引數指令碼

三、啟動哨兵

注意:一開始的主機也要配置好 masterauth,因為當該主機當機後,之後有可能會作為從機,所以要配置該密碼,以訪問之後的主機

啟動哨兵命令:redis-sentinel sentinel26379.conf --sentinel

當主機down機後,如果立即去從機獲取資料會報沒有連線的問題,因為當主機down機後,哨兵會在剩下的從機中選出一個作為主機,重新傳送請求建立連線,立即獲取資料就可能會報沒有連線,再次獲取就正常拿到了

從哨兵的log來看,可以看出主機down機後選擇新主機的過程

image-20240913100724271

當之前的主機再次啟動後,它就變成了其他主機的從機,不會發生衝突

在執行期間redis配置檔案的內容會被sentinel動態更改

主從機切換後,在之前的master配置檔案中會多一行slaveof的配置

在之前的slave的配置檔案中,slaveof的replicaof配置消失了

四、哨兵的執行流程和選舉原理

  • 主觀下線:SDOWN 是單個sentinel自己主觀上檢測到關於master的狀態,從sentinel的角度來看,如果傳送了PING心跳後,在一定事件內沒有收到合法的回覆,就達到了SDOWN 的條件

    • sentinel配置檔案中的sentinel down-after-milliseconds設定了判斷主觀下線的時間長度,預設是30秒

    • 這只是一個哨兵的判斷,達到主觀下線後,就要進行投票,就進入了客觀下線

  • 客觀下線:ODOWN是需要一定數量的sentinel達成一致意見才能認為一個master down機

    • quorum就是指定哨兵票數達到多少數量後

  • 當一個master被認為down機後,會在所有的哨兵中選出一個 leader哨兵,由該leader進行故障遷移

    • 選舉leader的演算法是Raft演算法,基本思路是先到先得,在一輪選舉中,哨兵A向B傳送成為領導者的申請,如果B沒有同意過其他哨兵,則會同意A成為領導者

選舉出來的leader,如何去選新的master?

  • 在redis.conf檔案中,優先順序slave-priority或者 replica-priority最高的從機會先被選舉(數字越小,優先順序越高)

  • 如果優先順序一樣,那麼看複製偏移位置最大的從機(複製偏移位置就是看哪個從機複製主機的資料最多,因為在複製過程中可能會出現網路抖動,所以每個從機不一定都完整的複製了主機內容)

  • 如果複製偏移位置也一樣,那麼看最小的Run ID 的從機,根據ASCII碼

當選出新的master後:

  • 新master會執行 slaveof no one 命令讓選出來的從機成為master,並透過slaveof命令讓其他節點成為其從機

  • 將之前已經down機的老master設定成新master的從機。

五、使用建議

  • 哨兵節點的數量應該為多個,保證高可用

  • 哨兵節點的數量應該是奇數

  • 各個哨兵節點的配置應該一致

  • 如果哨兵節點部署在Docker等容器裡面,尤其要注意埠的正確對映

  • 哨兵叢集+主從複製,並不能保證資料零丟失

相關文章