Redis Sentinel 源碼分析 - Sentinel的初始化

作者:Wen Hui
轉載:中間件小哥

Redis Sentinel 是Redis提供的高可用模型解決方案。Sentinel可以自動監測一個或多個Redis主備實例,並在主實例宕機的情況下自動實行主備倒換。本系列通過作者對Redis Sentinel源碼的理解,詳細說明Sentinel的代碼實現方式。

Sentinel使用Redis內核相同的事件驅動代碼框架, 但Sentinel有自己獨特的初始化步驟。在這篇文章裏,作者會介紹Sentinel與Redis服務器不同的初始化部分。

我們可以通過redis-sentinel <path-to-configfile> 或者 redis-server <path-to-configfile> --sentinel這兩種方式啓動並運行Sentinel實例,這兩種方式是等價的。在Redis server.c 的main函數中,我們會看到Redis如何判斷用戶指定以Sentinel方式運行的邏輯:

Redis Sentinel 源碼分析 - Sentinel的初始化

其中checkForSentinelMode函數會監測以下兩種條件:

  1. 程序使用redis-sentinel可執行文件執行。

程序參數列表中有--sentinel 標誌。

以上任何一種條件成立則Redis會使用Sentinel的方式運行。

Redis Sentinel 源碼分析 - Sentinel的初始化

在Redis 判斷是否以Sentinel的方式運行以後,我們會看到如下代碼段:

Redis Sentinel 源碼分析 - Sentinel的初始化

在initSentinelConfig函數中,會使用Sentinel特定的端口(默認爲26379)來替代Redis的默認端口(6379)。另外,在Sentinel模式下,需要禁用服務器運行保護模式。

Redis Sentinel 源碼分析 - Sentinel的初始化

與此同時,initSentinel函數會做如下操作:

Redis Sentinel 源碼分析 - Sentinel的初始化

使用Sentinel自帶的命令表去替代Redis服務器原生的命令. Sentinel 支持的命令表如下:

Redis Sentinel 源碼分析 - Sentinel的初始化

初始化Sentinel主狀態結構,Sentinel主狀態的定義及註釋如下。

Redis Sentinel 源碼分析 - Sentinel的初始化

其中masters字典指針中的每個值都對應着一個Sentinel檢測的主實例。

在讀取配置信息後,Redis服務器主函數會調用sentinelIsRunning函數, 做以下幾個工作:

  1. 檢查配置文件是否被設置,並且檢查程序對配置文件是否有寫權限,因爲如果Sentinel狀態改變的話,會不斷將自己當前狀態記錄在配置文件中。

  2. 如果在配置文件中指定運行ID,Sentinel 會使用這個ID作爲運行ID,相反地,如果沒有指定運行ID,Sentinel會生成一個ID用來作爲Sentinel的運行ID。

  3. 對所有的Sentinel監測實例產生初始監測事件。

Redis Sentinel 源碼分析 - Sentinel的初始化

參考資料:

https://github.com/antirez/redis

https://redis.io/topics/sentinel

Redis設計與實現第二版黃健宏著

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章