redis中的Sentinel詳解

以後還是要好好寫博客,把好東西或者是在工作中遇到的問題記錄下來

菜雞的提升之路

最近在看《redis的設計與實現》,這本書比較底層,應用說的很好,主要還是對redis底層的詳解吧,個人覺得很不錯,還是很好看的一本書,特別是剛開始對redis底層的各種數據結構的介紹,步步升入。。

閒話少說,不如正題

sentinel

sentinel(哨兵)是redis高可用的解決方案。它的本質是一個運行在特殊模式下的redis服務器。
sentinel做的主要的工作是

  1. 主服務器選舉:sentinel系統會挑選server1屬下的一個從服務器,並將這個從服務器提升爲主服務器
  2. 故障轉移:向從服務器發送(slave of no one)命令,將從服務器提升爲主服務器。從服務器發送複製指令,(sync,psync),當所有的從服務器完成複製新的服務器時,故障轉移操作執行完畢
  3. sentinel還會繼續監視已經下線的server1,並在它重新上線時,將他設置爲新的主服務器的從服務器。

sentinel服務初始化

sentinel其實就是一個運行在特殊模式下的redis服務器。一個sentinel啓動時,他需要執行以下步驟

  • 初始化redis服務器
  • 將普通的redis服務器使用的代碼替換成sentinel專用代碼
  • 初始化sentinel的狀態
  • 根據給定的配置文件,初始化sentinel的監視主服務器列表
  • 創建連向主服務器的網絡連接

在這裏插入圖片描述

redis向主redis服務器創建通信的主要步驟如下:

  1. 初始化setinel狀態的master屬性
  2. 創建連向主服務器的網絡連接
  3. 獲取主服務信息
  4. 獲取從服務信息
  5. 向主服務器和從服務器發送消息
  6. 接收來自主服務器和從服務器的頻道消息
  7. 更新sentinels字典
  8. 創建連向其他sentinel的連接
  9. 檢查客觀下線狀態
  10. 選取領頭sentinel
  11. 故障轉移
    a. 選出新的主服務器
    b 修改從服務器的複製目標
    c. 將舊的主服務器變爲從服務器

下面我將簡述這幾個過程的具體如何操作的。

初始化sentinel的master屬性

master

創建連向主服務器的網絡連接

sentinel會創建兩個連向主服務器的異步網絡連接

  1. 一個是命令連接,這個連接專門用於向主服務器發送命令,並接收命令服務
  2. 另一個是訂閱連接,這個連接專門用於訂閱主服務器的_sentinel_:hello頻道

創建連接

獲取主服務器信息

sentinel默認以10秒一次的頻率,通過命令連接向被監控的服務器發送Info命令,並通過分析INFO命令的回覆來獲取主服務器當前的信息

#server

run_id:8979803798379273980987980yhiuh979i7we678

#replication
role:master

slave0:ip=127.0.0.1,port=11111,state=online,offset=43,lag=0
slave1:ip=127.0.0.1,port=22222,state=online,offset=43,lag=0
slave2:ip=127.0.0.1,port=33333,state=online,offset=43,lag=0

sentinel向帶有三個從服務器的主服務器發送Info命令

獲取從服務器信息

當sentinel發生主服務器與新的從服務器出現時,sentinel除了會爲這個新的從服務創建相應的實例結構之外,sentinel還會創建連接到從服務器的命令連接和訂閱連接

sentinel與各個從服務器建立命令連接和訂閱連接

創建連向其他sentinel命令連接

各sentinel之間的網絡連接

故障轉移

選取領頭的sentinel,然後對故障進行轉移

  • 在下線服務器的從服務器中挑選一個作爲新的主服務器
  • 已下線的服務器下的其他從服務器複製新的主服務器
  • 已下線的主服務器再上線的時候會作爲新服務器的從服務器0.

重點知識掌握

  1. sentinel只是一個運行在特殊模式下的redis服務器,它使用了和普通模式不同的命令表,所以sentinel模式能夠使用命令和普通redis服務器能夠使用的命令不同
  2. sentinel會讀入用戶指定的配置文件,爲每個要被監視的服務器創建相應的實例結構,並創建連向主服務器的命令連接和訂閱連接。
  3. 在一般情況下,sentinel以每十秒一個的頻率向被監視的主服務器和從服務器發送INFO命令,當主服務器處於下線狀態,或者sentinel正在對主服務器做故障轉移時,sentinel向從服務器發送Info命令的頻率會改爲每秒一次
  4. 對於監視同一主服務器和從服務器的多個sentinel來說,他們會以每兩秒一次的方式通過向被監視的服務器的_sentinel_:hello頻道發送消息來向其他sentinel宣告自己的存在
  5. 每個sentinel也會從_sentinel_:hello頻道接收其他sentinel發來的消息,並根據這些信息爲其他的sentinel創建實例結構,以及連接命令
  6. sentinel會與主服務器創建命令連接和訂閱連接,sentinel和sentinel之間只能通過命令連接
  7. sentinel以每秒一次的頻率向實例(包括主服務器,從服務器,其他sentinel)發送ping命令,並根據實例對ping的命令回覆來判斷實例是否在線當一個實例在指定時長中連接向sentinel發送無效回覆的時候,sentinel會將這個實例判斷爲主觀下線
  8. 當sentinel將主服務器判斷爲主觀下線的時候,他會想同樣監視這臺主服務器的sentinel詢問,看它是否支持主服務器的下線。
  9. 當sentinel蒐集到足夠多的主觀下線投票時,他會將主服務器下線,併發起一次主服務器的故障轉移
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章