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

來源:華爲git

做者:Wen Huigithub

轉載:中間件小哥redis

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方式運行的邏輯:ide

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

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

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

程序參數列表中有--sentinel 標誌。源碼分析

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

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設計與實現第二版黃健宏著

相關文章
相關標籤/搜索