這篇文章帶大家深入理解下Redis哨兵模式原理,聊聊sentinel能幹什麼,啟動sentinel方法和Sentinel工作流程,希望對大家有所幫助!
上文介紹了Redis主從複製的原理,它解決了Redis資料備份的問題,master節點發生故障後不能自動選舉出新的主節點,需要人工將slave節點設定成主節點,效率低下,無法實現自動故障轉移,Redis官方提供了一個高可用解決方案Sentinel。
Redis Sentinel是Redis的官方高可用性解決方案。 Redis Sentinel為Redis提供高可用性。實際上,這意味著使用Sentinel可以創建一個Redis集群,在沒有人為幹預的情況下抵抗某些類型的失敗,自動實現故障轉移。 【相關推薦:Redis影片教學】
1、監控redis叢集節點(master replica)和sentinel節點健康狀態
2、自動故障轉移:如果master故障,sentinel可以實現故障轉移,並且通知客戶端連接新的master。
3、通知:透過api,可以發送通知到管理員,開發人員,監控的redis實例出現了故障
4、配置中心:客戶端連接到sentinel,sentinel可以訪問master將節點資訊回傳給客戶端
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之間必須開放端口訪問,方便相互訪問。
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中的哨兵模式原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!