[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 ...