來源:華爲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
其中checkForSentinelMode函數會監測如下兩種條件:函數
- 程序使用redis-sentinel可執行文件執行。
程序參數列表中有--sentinel 標誌。源碼分析
以上任何一種條件成立則Redis會使用Sentinel的方式運行。ui
在Redis 判斷是否以Sentinel的方式運行之後,咱們會看到以下代碼段:設計
在initSentinelConfig函數中,會使用Sentinel特定的端口(默認爲26379)來替代Redis的默認端口(6379)。另外,在Sentinel模式下,須要禁用服務器運行保護模式。
與此同時,initSentinel函數會作以下操做:
使用Sentinel自帶的命令表去替代Redis服務器原生的命令. Sentinel 支持的命令表以下:
初始化Sentinel主狀態結構,Sentinel主狀態的定義及註釋以下。
其中masters字典指針中的每一個值都對應着一個Sentinel檢測的主實例。
在讀取配置信息後,Redis服務器主函數會調用sentinelIsRunning函數, 作如下幾個工做:
-
檢查配置文件是否被設置,而且檢查程序對配置文件是否有寫權限,由於若是Sentinel狀態改變的話,會不斷將本身當前狀態記錄在配置文件中。
-
若是在配置文件中指定運行ID,Sentinel 會使用這個ID做爲運行ID,相反地,若是沒有指定運行ID,Sentinel會生成一個ID用來做爲Sentinel的運行ID。
- 對全部的Sentinel監測實例產生初始監測事件。
參考資料:
https://github.com/antirez/redis
https://redis.io/topics/sentinel
Redis設計與實現第二版黃健宏著