一起來分析Redis哨兵模式

2022-03-16 19:00:37
本篇文章給大家帶來了關於的相關知識,其中主要介紹了哨兵模式的相關問題,包括了哨兵概念、哨兵作用、啟用哨兵、哨兵原理等等,希望對大家有幫助。

推薦學習:

哨兵模式

1. 哨兵概念

  • 在一主多從結構中,如果master宕機了,就需要從多個slave中選出一個作為新的master,要想完成這樣的功能,就需要使用Redis的哨兵機制

  • 哨兵 (sentinel) 是一個分散式系統,用於對主從結構中的每臺伺服器進行監控,當出現故障時通過投票機制選擇新的master並將所有slave連線到新的master,如下圖所示:

    image-20210604223042319

2. 哨兵作用

  • 監控:監控master和slave
    • 不斷的檢查master和slave是否正常執行
    • master存活檢測、master與slave執行情況檢測
  • 通知(提醒):當被監控的伺服器出現問題時,向其他哨兵、Redis伺服器傳送通知

  • 故障轉移:斷開宕機的master與slave的連線,選取一個slave作為master,將其他slave連線新的master,並告知使用者端新的伺服器地址

注意:哨兵也是一臺redis伺服器,僅提供監控服務,不提供資料管理服務;通常哨兵的數量設定為單數(方便投票)

3. 啟用哨兵

  • 修改哨兵的組態檔 sentinel.conf ,組態檔位於Redis目錄下,如下圖所示:

    image-20210603233049082image-20210603234011074
  • 部分設定的含義如下圖所示:

    image-20210604224254878
  • 啟動哨兵

    redis-sentinel filename 
    #filename指的是組態檔名
    #每個哨兵都要設定自己的組態檔
  • 設定並啟動哨兵之後,主伺服器宕機之後,會自動的執行投票、主從切換等過程

4. 哨兵原理

哨兵在進行主從切換過程中經歷三個階段:

  • 監控
  • 通知
  • 故障轉移

4.1 監控

用於同步各個節點的狀態資訊,這些節點包括master、slave、哨兵,也就是整個系統所有伺服器的資訊。

主要完成的功能:

image-20210604225232566

  • 獲取各個sentinel的狀態(是否線上):新新增的哨兵要與系統中已經存在的哨兵進行資訊的互動

  • 獲取master的狀態(通過info指令)

    • 獲取的內容如下

      1. master屬性
      	 runid
      	 role:master
      2. 各個slave在master中儲存的基本資訊
  • 獲取所有slave的狀態(根據master中slave的資訊向所有的slave傳送info指令)

    • 獲取的內容如下

      slave屬性
      	runid
      	role:slave
      	master_host、master_port
      	offset

具體的內部工作原理如下所述:

image-20210604230120115

  • 哨兵1向master傳送info指令之後,會建立一個cmd連線,建立的連線是用來傳送命令的
  • 建立好cmd連線之後,會在哨兵1這一端儲存目前他所獲得的所有資訊,另一端master也會儲存自己持有的資訊
  • 然後哨兵1根據從master獲取的關於salve的資訊,向slave傳送info指令,得到salve的資訊,豐富這一端所儲存的資訊
  • 當新增一個新的哨兵2時,哨兵2向master傳送info指令,建立cmd連線,根據master中的資訊可以得到之前已經存在的哨兵1,在自己這一端儲存已經獲得的資訊。然後判斷哨兵1是否線上,與哨兵1建立連線,二者互相交換各自的資訊,並且雙方會持續的ping,保證他們之間是暢通的
  • 哨兵2根據從master獲得的slave資訊,再從slave獲取資訊,豐富自己所儲存的資訊
  • 再新增一個哨兵3時,與之前的過程類似,最終三個哨兵建立起了關係網
  • 關係網中三者會互相交換、傳送資訊,關係網中的這種工作模式稱為釋出訂閱模式

4.2 通知

哨兵在通知階段要不斷的去獲取master與slave的資訊,然後將獲得的資訊在各個哨兵之間進行共用。

具體的流程如下:

哨兵通過建立的cmd連線,向master、slave傳送 hello 指令,得到他們的資訊,然後在關係網中共用:

image-20210604230719042

4.3 故障轉移

斷開宕機的master與slave的連線,選取一個slave作為master,將其他slave連線新的master,並告知使用者端新的伺服器地址。

具體的流程如下所述:

  • 哨兵1始終得不到master的迴應,主觀判斷master宕機,標記 sdown(僅有一個哨兵認為master宕機)

  • 哨兵1在關係網中傳遞訊息,向其他哨兵傳送圖中左上角的訊息

  • 其他哨兵得到訊息之後,全部向master傳送訊息,確定master是否宕機,他們也會將自己得到的結果傳送給關係網中的其他哨兵,確定master宕機後,將標記改為 odown(所有哨兵探測之後,超過一半的哨兵認為master宕機)

    image-20210604232535478
  • 當認定master宕機之後,此時需要選舉新的master,由哪個哨兵完成這件事要通過哨兵之間的選舉決定,具體過程如下所述:

    • 在選舉的時候每個哨兵手裡都有一票,每個哨兵都會發出一個指令,在內網裡邊告訴其他哨兵自己當選舉人,比如說sentinel1和sentinel2發出這個選舉指令,那麼sentinel3接收到他們的申請之後,sentinel3就會把自己的一票投給其中一方,根據到達的先後順序投票,獲得票的那一方就會多一張選舉票,按照這樣的一種形式,最終會有一個選舉結果,獲得票數最多的哨兵會被獲選
    • 在這個過程中有可能會存在失敗的現象,比如第一輪沒有選舉成功,那就會接著進行第二輪第三輪直到完成選舉
  • 當完成哨兵之間的選舉之後,接下來就要由選舉勝出的哨兵去slave中挑選一個,將其變成新的master,具體的流程如下所述:

    • 哨兵在伺服器列表中挑選備選master的原則:先排除,後選擇
      • 不線上的OUT
      • 響應慢的OUT
      • 與原master斷開時間久的OUT
      • 排除結束,開始進行選擇
      • 優先順序高的獲選
      • offset較大的獲選(比較大說明同步原來master的資料最多)
      • 若還沒有選出,則最後根據runid選出
  • 選出新的master之後,哨兵傳送指令給伺服器:

    • 向新的master傳送 slaveof no one 指令

    • 向其他slave傳送 slaveof 新masterIP埠 指令

  • 同時還要告訴其他的哨兵新master是誰

5. 總結

監控階段:同步資訊

通知階段:保持聯通

故障轉移階段:

  1. 哨兵發現問題,依次標記主觀下線與客觀下線
  2. 競選負責哨兵
  3. 優選新master
  4. 新master上任,其他slave連線新的master,原master恢復之後作為slave連線到新master

推薦學習:

以上就是一起來分析Redis哨兵模式的詳細內容,更多請關注TW511.COM其它相關文章!