Redis - 9 哨兵模式
Redis - 哨兵模式
3.1 哨兵簡介
3.1.1 哨兵概念
首先我們來看一個業務場景:如果redis的master宕機了,此時應該怎麼辦?
那此時我們可能需要從一堆的slave中重新選舉出一個新的master,那這個操作過程是什麼樣的呢?這裡面會有什麼問題出現呢?
要實現這些功能,我們就需要redis的哨兵,那哨兵是什麼呢?
哨兵
哨兵(sentinel) 是一個分散式系統,用於對主從結構中的每臺伺服器進行監控,當出現故障時通過投票機制選擇新的master並將所有slave連線到新的master。
3.1.2 哨兵作用
哨兵的作用:
-
監控:監控master和slave
不斷的檢查master和slave是否正常執行
master存活檢測、master與slave執行情況檢測
-
通知(提醒):當被監控的伺服器出現問題時,向其他(哨兵間,客戶端)傳送通知
-
自動故障轉移:斷開master與slave連線,選取一個slave作為master,將其他slave連線新的master,並告知客戶端新的伺服器地址
注意:哨兵也是一臺redis伺服器,只是不提供資料相關服務,通常哨兵的數量配置為單數
3.2 啟用哨兵
配置哨兵
-
配置一拖二的主從結構(利用之前的方式啟動即可)
-
配置三個哨兵(配置相同,埠不同),參看sentinel.conf
1:設定哨兵監聽的主伺服器資訊, sentinel_number表示參與投票的哨兵數量
sentinel monitor master_name master_host master_port sentinel_number
2:設定判定伺服器宕機時長,該設定控制是否進行主從切換
sentinel down-after-milliseconds master_name million_seconds
3:設定故障切換的最大超時時
sentinel failover-timeout master_name million_seconds
4:設定主從切換後,同時進行資料同步的slave數量,數值越大,要求網路資源越高,數值越小,同步時間越長
sentinel parallel-syncs master_name sync_slave_number
- 啟動哨兵
redis-sentinel filename
3.3 哨兵工作原理
哨兵在進行主從切換過程中經歷三個階段
- 監控
- 通知
- 故障轉移
3.3.1 監控
用於同步各個節點的狀態資訊
-
獲取各個sentinel的狀態(是否線上)
-
獲取master的狀態
master屬性
prunid
prole:master
各個slave的詳細資訊
- 獲取所有slave的狀態(根據master中的slave資訊)
slave屬性
prunid
prole:slave
pmaster_host、master_port
poffset
其內部的工作原理具體如下:
3.3.2 通知
sentinel在通知階段要不斷的去獲取master/slave的資訊,然後在各個sentinel之間進行共享,具體的流程如下:
3.3.3 故障轉移
當master宕機後sentinel是如何知曉並判斷出master是真的宕機了呢?我們來看具體的操作流程
當sentinel認定master下線之後,此時需要決定更換master,那這件事由哪個sentinel來做呢?這時候sentinel之間要進行選舉,如下圖所示:
在選舉的時候每一個人手裡都有一票,而每一個人的又都想當這個處理事故的人,那怎麼辦?大家就開始搶,於是每個人都會發出一個指令,在內網裡邊告訴大家我要當選舉人,比如說現在的sentinel1和sentinel4發出這個選舉指令了,那麼sentinel2既能接到sentinel1的也能接到sentinel4的,接到了他們的申請以後呢,sentinel2他就會把他的一票投給其中一方,投給誰呢?誰先過來我投給誰,假設sentinel1先過來,所以這個票就給到了sentinel1。那麼給過去以後呢,現在sentinel1就拿到了一票,按照這樣的一種形式,最終會有一個選舉結果。對應的選舉最終得票多的,那自然就成為了處理事故的人。需要注意在這個過程中有可能會存在失敗的現象,就是一輪選舉完沒有選取,那就會接著進行第二輪第三輪直到完成選舉。
接下來就是由選舉勝出的sentinel去從slave中選一個新的master出來的工作,這個流程是什麼樣的呢?
首先它有一個在伺服器列表中挑選備選master的原則
-
不線上的OUT
-
響應慢的OUT
-
與原master斷開時間久的OUT
-
優先原則
優先順序
offset
runid
選出新的master之後,傳送指令( sentinel )給其他的slave:
-
向新的master傳送slaveof no one
-
向其他slave傳送slaveof 新masterIP埠
總結:故障轉移階段
- 發現問題,主觀下線與客觀下線
- 競選負責人
- 優選新master
- 新master上任,其他slave切換master,原master作為slave故障恢復後連線