首頁 >資料庫 >Redis >淺析Redis中的哨兵模式原理

淺析Redis中的哨兵模式原理

青灯夜游
青灯夜游轉載
2022-01-25 10:36:522796瀏覽

這篇文章帶大家深入理解下Redis哨兵模式原理,聊聊sentinel能幹什麼,啟動sentinel方法和Sentinel工作流程,希望對大家有所幫助!

淺析Redis中的哨兵模式原理

上文介紹了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機制實現動態感知。

淺析Redis中的哨兵模式原理

2、sentinel是如何感知master掛掉的呢?

這裡有兩種情況,一種是master主觀下線,一種是master客觀下線。

主觀下線:每個sentinel每1s向master發送ping命令,如果在down-after-milliseconds時間內master沒有響應,則該sentinel節點認為master主觀下線了。

淺析Redis中的哨兵模式原理

客觀下線:

當主觀下線的節點是主節點時,哨兵節點會透過指令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中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除