前面咱們講了redis的主從複製,爲了實現高可用,會選擇一臺服務器做爲master,多臺服務器做爲slave。如今有這樣一種狀況,master宕機了,這時系統會選擇一臺slave做爲master,而後把宕機的master下線,再通知全部slave新的master是誰。這裏就產生了一個問題,master是否宕機、選擇哪臺slave做爲master都是誰來決定的?linux
在主從複製中由哨兵(sentinel)來完成這些操做,哨兵是一個分佈式系統,用於對主從結構中的每臺服務器進行監控,當出現故障時經過投票機制選擇新的master。redis
哨兵也是一臺redis服務器,一般配置哨兵數量爲單數(競選時避免打平)。服務器
1.監控:不斷檢查master和slave是否正常運行;master存活檢測;master與slave運行狀況檢測app
2.通知:當被檢測服務器出現問題時,向其餘哨兵和客戶端發送通知分佈式
3.自動故障轉移:斷開master和slave鏈接,選取一個新的slave爲master,將其餘slave鏈接到新的master上ide
監控是哨兵的做用之一,監控是爲了同步各個節點的狀態信息spa
1.獲取其餘各個哨兵的狀態(是否在線),經過ping命令orm
2.獲取master的狀態,主要包括master的runid,各個slave的詳細信息等等,經過info指令對象
3.獲取全部的slave的狀態(根據master中的slave信息),主要包括slave的runid,role,host,offset等等。blog
當兩個sentinel分別獲取到master或slave的監控信息後,爲了數據的同步會相互交流數據,一樣當第三個sentinel得到監控信息後,也會和另外兩個sentinel互相同步數據。
通知階段主要是各個sentinel的相互交流,假設一個系統有三個sentinel,當sentinel1詢問主從服務器狀態而且獲得回覆以後,他會他消息告訴sentinel2和sentinel3。一樣的當sentinel2獲得消息後也會告訴1和3。使得數據始終同步。
當一臺master宕機了,這就進入了故障轉移階段。
1.首先一個sentinel發現給master不迴應消息,因而把這個master的狀態設置爲sdown,並通知給其餘的sentinel。其餘的sentinel就會發送hello給該master,當一半以上(能夠設置)的sentinel以爲這個master確實宕機了,因而master的狀態就被設置爲odown,這就進入了第二步。
2.既然master宕機了,那就須要選舉新的master,哪一個sentinel去選擇master,須要通過sentinel內部的投票機制來實現。當選出去執行找出新master的sentinel後,進入第三步。
3.sentinel從slave中選擇一個當成新的master有如下原則 淘汰未在線的 淘汰響應慢的 淘汰與原master斷開時間久的 最終在剩下的slave中根據優先級,offset等選擇一臺成爲新master
4.sentinel向新的master發送指令:
slaveof no one
向其餘slave發送指令
slaveof 新masterIP 端口
關於哨兵的操做建議在linux服務器下操做
開啓哨兵:
redis-sentinel sentinel.conf (配置的文件名自定義)
配置文件
port 26379dir /tmpsentinel monitor mymaster 127.0.0.1 6379 2 #設置哨兵監控的主機爲127.0.0.1:6379,當2臺哨兵認爲宕機後則認爲該主機宕機sentinel down-after-milliseconds 30000 #鏈接多長時間未響應就認爲被監控服務器宕機parallel-syncs mymaster 1 #指定了在執行故障轉移時, 最多能夠有多少個從服務器同時對新的主服務器進行同步failover-timeout mymaster 180000 #指定了故障轉移的同步超時時間
sentinel monitor mymaster 127.0.0.1 6379 2:127.0.0.1 6379表示該哨兵監控的對象,其中mymaster是本身定義的一個名字,最後一位2表示當有2個哨兵認爲這個被監控服務器宕了,就確認該服務器宕機。這一位的取值每每是哨兵數量/2+1,即一半以上。當主機宕機後,哨兵會自動從從機中選出一臺當成主機