一、概念
哨兵是巡查監控後臺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機後選擇新主機的過程
當之前的主機再次啟動後,它就變成了其他主機的從機,不會發生衝突
在執行期間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等容器裡面,尤其要注意埠的正確對映
-