本篇文章帶大家深入理解下redis哨兵模式原理,聊聊sentinel能干什么,啟動sentinel方法和sentinel工作流程,希望對大家有所幫助!
上文介紹了Redis主從復制的原理,它解決了redis數據備份的問題,master節點發生故障后不能自動選舉出新的主節點,需要人工將slave節點設置成主節點,效率低下,不能實現自動故障轉移,Redis官方提供了一個高可用解決方案Sentinel。
一、Redis sentinel是什么?
Redis Sentinel是Redis的官方高可用性解決方案。Redis Sentinel為Redis提供高可用性。實際上,這意味著使用Sentinel可以創建一個Redis集群,在沒有人為干預的情況下抵抗某些類型的失敗,自動實現故障轉移。【相關推薦:Redis主從復制】
二、sentinel能干什么?
1、監控redis集群節點(master+replica)和sentinel節點健康狀態
2、自動故障轉移:如果master出現故障,sentinel可以實現故障轉移,并且通知客戶端連接新的master。
3、通知:通過api,可以發送通知到管理員,開發人員,監控的redis實例出現了故障
4、配置中心:客戶端連接到sentinel,sentinel可以訪問master將節點信息返回給客戶端?
三、啟動sentinel方法
1、redis-sentinel?/path/to/sentinel.conf
2、redis-server /path/to/sentinel.conf –sentinel?
sentinel.conf配置說明如下
#?配置需要監控的master節點信息?2代表法定人數?作用是表示需要最少需要多少個sentinel節點同意 #master節點不可達才標記為客觀下線 #舉例?5個sentinel實例?quorum設置成2?那么有2個sentinel節點認為master不可達, #則其中一個會啟動故障轉移#如果至少有三個哨兵可到達,故障轉移將被授權并實際啟動。 sentinel?monitor?mymaster?127.0.0.1?6379?2? #只需要配置master?sentinel會自動檢測slave信息 sentinel?down-after-milliseconds?mymaster?60000? #如果master在指定時間內沒有響應ping命令/或報錯,則認為主觀下線了。 sentinel?failover-timeout?mymaster?180000 sentinel?parallel-syncs?mymaster?1? #指定故障轉移的時候,同時支持多少個replica并行的與master同步數據,越小故障轉移越久 #以上配置可以通過SENTINEL?SET?command.來實時修改。 sentinel?monitor?resque?192.168.1.3?6380?4 sentinel?down-after-milliseconds?resque?10000 sentinel?failover-timeout?resque?180000 sentinel?parallel-syncs?resque?5
注意點:
Redis-sentinel必須使用配置文件啟動,重啟需要根據配置文件恢復,默認打開26379端口,sentinel之間必須開放端口訪問,方便相互訪問。?
四、Sentinel工作流程
1、首先sentinel之間是通過redis的pub/subscribe機制實現動態感知。
2、sentinel是如何感知master掛掉的呢?
這里有兩種情況,一種是master主觀下線,一種是master客觀下線。
主觀下線:每個sentinel每1s向master發送ping命令,如果在down-after-milliseconds時間內master沒有響應,則該sentinel節點認為master主觀下線了。
客觀下線:
當主觀下線的節點是主節點時,哨兵節點會通過指令sentinel is-masterdown-by-addr尋求其它哨兵節點對主節點的判斷,當超過quorum(在sentinel配置中配置的法定人數)個數,此時哨兵節點則認為該主節點確實有問題,這樣就客觀下線了,大部分哨兵節點都同意下線操作,也就說是客觀下線。?
注意客觀下線只針對master節點生效,它會觸發故障轉移
3,master下線了,需要進行故障轉移
這里又分為兩步,首先需要選擇sentinel哨兵主節點,通過sentinel主節點來進行redis的故障轉移。
首先是sentinel選舉領導者。使用raft算法(狀態共識算法)。
每一個Sentinel節點都可以成為Leader,當一個Sentinel節點確認redis集群的主節點主觀下線后,會請求其他Sentinel節點要求將自己選舉為Leader。被請求的Sentinel節點如果沒有同意過其他Sentinel節點的選舉請求,則同意該請求(選舉票數+1),否則不同意。
如果一個Sentinel節點獲得的選舉票數達到Leader最低票數(quorum和Sentinel節點數/2+1的最大值),則該Sentinel節點選舉為Leader;否則重新進行選舉。
Raft核心思想:先到先得,少數服從多數。?
sentinel選舉出主節點后,sentinel主節點需要選舉出redis集群主節點,構建新的集群關系。
選舉新redis主節點的依據是:
1、與sentinel斷開連接的時間。過濾發現與主sentinel服務器斷開連接的時間超過配置的主機超時時間down-after-milliseconds的副本slaves
2、副本優先級。?優先選擇replica-priority低的。
3、如果優先級相同,已處理復制偏移量。越大越優先,這個更符合業務場景功能。
4、如果復制offset相同,就看運行ID。優先選擇小的。?
選擇出master節點后,開始維護集群關系。
1、sentinel節點,向新主節點發送,slave no one命令,讓它成為獨立節點
2、sentinel節點,向其他節點發送 slaveof ip port,跟隨到主節點?
五、總結
通過上面的分析,sentinel通過定時監控手段,可以實現自動故障轉移,不過sentinel還是有一些問題,比如單個master節點情況下,數據存在丟失的可能,并且如果單機性能有限,也沒有橫向擴展的能力。
更多編程相關知識,請訪問:Redis主從復制!!