Redis Sentinel 哨兵 集群解決方案

2021-09-02 16:07:58 字數 2266 閱讀 5853

[size=x-large][color=black][b]redis 哨兵的服務框架[/b][/color][/size]

哨兵也是 redis 伺服器,只是它與我們平時提到的 redis 伺服器職能不同,哨兵負責監視普通的 redis 伺服器,提高乙個伺服器集群的健壯和可靠性。哨兵和普通的 redis 伺服器所用的是同一套伺服器框架,這包括:網路框架,底層資料結構,訂閱發布機制等。

從主函式開始,來看看哨兵伺服器是怎麼誕生,它在什麼時候和普通的 redis 伺服器分道揚鑣:

int main(int argc, char **argv) 

......

// 普通redis 伺服器模式

if (!server.sentinel_mode) else

......

// 進入事件迴圈

aemain(server.el);

// 去除事件迴圈系統

aedeleteeventloop(server.el);

return 0;

}

在上面,通過判斷命令列引數來判斷 redis 伺服器是否啟用哨兵模式,會設定伺服器引數結構體中的redisserver.sentinel_mode 的值。在上面的主函式呼叫了乙個很關鍵的函式:initsentinel(),它完成了哨兵伺服器特有的初始化程式,包括填充哨兵伺服器特有的命令表,struct sentinel 結構體。

// 哨兵伺服器特有的初始化程式

/* perform the sentinel mode initialization. */

void initsentinel(void)

/* initialize various data structures. */

// sentinel.current_epoch 用以指定版本

sentinel.current_epoch = 0;

// 哨兵監視的 redis 伺服器雜湊表

sentinel.masters = dictcreate(&instancesdicttype,null);

// sentinel.tilt 用以處理系統時間出錯的情況

sentinel.tilt = 0;

// tilt 模式開始的時間

sentinel.tilt_start_time = 0;

// sentinel.previous_time 是哨兵伺服器上一次執行定時程式的時間

sentinel.previous_time = mstime();

// 哨兵伺服器當前正在執行的指令碼數量

sentinel.running_scripts = 0;

// 指令碼佇列

sentinel.scripts_queue = listcreate();

}

我們檢視 struct rediscommand sentinelcmds 這個全域性變數就會發現,它裡面只有七個命令,難道哨兵僅僅提供了這種服務?為了能讓哨兵自動管理普通的 redis 伺服器,哨兵還新增了乙個定時程式,我們從 servercron() 定時程式中就會發現,哨兵的定時程式被呼叫執行了,這裡包含了哨兵的主要工作:

int servercron(struct aeeventloop *eventloop, long long id, void *clientdata) 

}

[size=x-large][color=black][b]定時程式[/b][/color][/size]

定時程式是哨兵伺服器的重要角色,所做的工作主要包括:監視普通的 redis 伺服器(包括主機和從機),執行故障修復,執行指令碼命令。

// 哨兵定時程式

void sentineltimer(void)

[size=x-large][color=black][b]哨兵與 redis 伺服器的互聯[/b][/color][/size]

每個哨兵都有乙個 struct sentinel 結構體,裡面維護了多個主機的連線,與每個主機連線的相關資訊都儲存在 struct sentinelredisinstance。透過這兩個結構體,很快就可以描繪出,乙個哨兵伺服器所維護的機器的資訊:

typedef struct sentinelredisinstance  sentinelredisinstance;

哨兵伺服器所能描述的 redis 資訊:

[img]

參考:

Redis Sentinel 哨兵模式

目錄經過上期 redis 主從複製 的學習,我們知道主從複製是為了避免單點故障,將資料儲存在多台伺服器上的一種機制。但是主節點只有乙個,如果主節點掛掉了,怎麼辦?於是哨兵模式誕生了。哨兵模式可以不時地監控redis是否按照預期良好的執行 至少是保證主節點是存在的 若一台主機出現問題,哨兵會自動將該主...

Redis Sentinel部署規則和API使用

redis sentinel可以同時監控多個主節點,具體拓撲圖類似於圖。配置方法也比較簡單,只需要指定多個mastername來區分不同的主節點即可,例如下面的配置監控monitor master business 1 10.10.xx.1 6379 和monitor master business...

末端哨兵(end sentinel)

public class linkedstack node u item,nodenext boolean end 建立乙個成員變數來充當棧頂元素,此時top物件裡面的成員屬性都為空。private nodetop new node public void push t item public t ...