1. 程式人生 > 實用技巧 >Redis - 9 哨兵模式

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埠

總結:故障轉移階段

  1. 發現問題,主觀下線與客觀下線
  2. 競選負責人
  3. 優選新master
  4. 新master上任,其他slave切換master,原master作為slave故障恢復後連線