天天看點

《Redis設計與實作》第十六章 Sentinel

Sentinel是Redis高可用的解決方案,哨兵。HA

Sentinel 組成的sentinel系統可以監視任意多個主伺服器以及主伺服器屬下的所有從伺服器,并在被監視的主伺服器進入下賤狀态時,自動将下線主伺服器屬下的某個從伺服器更新為新的主伺服器,繼續處理請求。

《Redis設計與實作》第十六章 Sentinel

也就是說當S1斷線了,然後會選舉S2 3 4 其中一個成為新的主伺服器。

《Redis設計與實作》第十六章 Sentinel

16.1 啟動并初始化Sentinel

redis-sentinel /path/to/your/sentinel.conf

啟動一個Sentinel時,需要執行以下步驟:

1、初始化伺服器

2、将普通Redis伺服器使用的狀态代碼換成Sentinel專用代碼

3、初始化Sentinel狀态

4、根據給定的配置檔案,初始化Sentinel的監視主伺服器清單

5、建立連接配接主伺服器的網絡連接配接。

那麼問題來了?如果Sentinel伺服器挂了怎麼辦?單點故障?是以還是Sentinel也要主從。

16.1.1 初始化伺服器

Sentinel是特殊的redis伺服器,是以要先啟動redis伺服器。

《Redis設計與實作》第十六章 Sentinel

有點像Znode節點的一些特性。

16.1.2 使用Sentinel專用代碼

啟動Sentinel的第二個步驟就是将一部分普通的Redis伺服器使用的代碼替換成Sentinel專用代碼。

《Redis設計與實作》第十六章 Sentinel

16.1.3 初始化Sentinel狀态

《Redis設計與實作》第十六章 Sentinel

16.1.4 初始化Sentinel狀态和masters屬性

1、字典的鍵時主伺服器的名字

2、值就是主伺服器的對應

sentinelRedisInstance執行個體結構

《Redis設計與實作》第十六章 Sentinel
《Redis設計與實作》第十六章 Sentinel
《Redis設計與實作》第十六章 Sentinel

16.1.5 建立連向主伺服器的網絡連接配接

《Redis設計與實作》第十六章 Sentinel
《Redis設計與實作》第十六章 Sentinel

16.2 擷取主伺服器資訊

Sentinel預設會以每十秒一次的頻率,通過指令連接配接向被監視的主伺服器發送INFO指令,并通過INFO指令的回複來擷取目前資訊。

《Redis設計與實作》第十六章 Sentinel

回複slave、runid等各種資訊。

《Redis設計與實作》第十六章 Sentinel

16.3 擷取從伺服器資訊

《Redis設計與實作》第十六章 Sentinel

會恢複run_id\role\host\port\slave_priority\偏移量。

16.4 向主伺服器和從伺服器發送資訊

在預設情況下sentinel會兩秒一次發送hello指令檢測心跳。

《Redis設計與實作》第十六章 Sentinel

告訴别人自己的ip、端口

id、目前配置紀元、主伺服器名字、ip端口。

16.5 接受來自主從的頻道消息

《Redis設計與實作》第十六章 Sentinel
《Redis設計與實作》第十六章 Sentinel

16.5.1 更新sentinels字典

16.5.2 建立連向其他Sentinel的指令連接配接

《Redis設計與實作》第十六章 Sentinel

16.6 檢測主觀下線狀态

《Redis設計與實作》第十六章 Sentinel
《Redis設計與實作》第十六章 Sentinel

16.7 檢測客觀下線狀态

《Redis設計與實作》第十六章 Sentinel

16.7.1 發送SENTINEL is-master-down-by-addr

客觀下線後會進行故障轉移。

16.8 選舉領頭Sentinel

《Redis設計與實作》第十六章 Sentinel

16.9 故障轉移

《Redis設計與實作》第十六章 Sentinel

16.9.1 選出新的主伺服器

《Redis設計與實作》第十六章 Sentinel

16.9.2 修改從伺服器的複制目标

《Redis設計與實作》第十六章 Sentinel

16.9.3 将舊的主伺服器變為從伺服器

《Redis設計與實作》第十六章 Sentinel

16.10 重點回顧

  • sentinel隻是特殊的redis伺服器,與普通redis有細微的指令表差别。
  • sentinel會讀入使用者配置的檔案建立指令連接配接和訂閱連接配接。
  • sentinel發送info指令來獲得資訊。
  • sentinel發送info資訊來擷取從伺服器資訊。故障轉移時是1秒一次。
  • 同一個主的多個sentinel會以2秒一次發送

    __sentinel__:hello

    頻道消息。
  • 每個sentitnel也會接受其他sentinel的頻道消息。
  • 選舉算法是raft算法
  • sentinel主觀下線時會看是否客觀下線,足夠多的客觀下線就會重新選舉 故障轉移。
《Redis設計與實作》第十六章 Sentinel