八、Reids Sentinel(高可用實現的一個機制)
1、主從複製高可用:
1.1:主從複製高可用問題(手動故障轉移【master發生故障之後,下線master選擇一個slave爲master,然後讓其它的slave的主節點跟隨新的master】、寫能力和存儲能力受限)
2、Reids Sentinel架構(client從sentinel獲取redis主從以及IP信息)
2.1:master發生故障時,sentinel處理處理步驟
1.多個sentinel發現並確認master有問題
2.選舉出一個sentinel作爲領導
3.選出一個slave作爲master
4.通知其餘slave成爲新的master的slave
5.通知客戶端主從變化
6.等老的master重新啓動之後,設置爲新master的slave
3、三個定時任務
3.1:每10秒滅個sentinel對master和slave執行info(發現slave節點、確認主從關係)
3.2:每2秒每個sentinel通過msater節點的channel交換信息[pub/sub](通過_sentinel_:hello頻道交互、交換對節點的看法和自身信息)
3.3:每1秒每個sentinel對其它的sentinel和redis執行ping操作(心跳檢測,失敗判斷依據)
4、sentinel領導選舉
原因:只有一個sentinel節點完成故障轉移
選擇:通過sentinel is-master-down-by-addr 命令都希望成爲領導者(此命令有兩個作用:判定matser是否宕機、是否希望我成爲領導者)
4.1:每個主觀下線的sentinel節點向其他節點sentinel節點發送命令,要求將它設置爲領導者
4.2:收到命令的sentinel節點如果沒有同意通過其它sentinel節點發送的命令,那麼將同意該請求,否則拒絕
4.3:如果該sentinel節點發現自己的票數已經超過sentinel集合半數且超過quorum,那麼它將成爲領導者
4.4:如果此過程有多個sentinel節點成爲了領導者,那麼將等待一段時間重新進行選舉
5、故障轉移(sentinel領導者節點完成)
5.1:從slave節點中選出一個合適的節點作爲新的master節點
5.1.1 選擇slave-priority(salve節點優先級)最高的slave界定啊,如果存在則返回,不存在則繼續
5.1.2 選擇複製偏移量最大的slave節點(複製的最完整),如果存在則返回,不存在則繼續
5.1.3 選擇runId最小的slave節點
5.2:對上面的slave節點執行salve of one 命令讓其成爲master節點
5.3:向生於的slave節點發送命令。讓他們成爲master節點的slave節點,複製規則和parallel-syncs參數有關
5.4:更新對原來master節點配置爲salve,並保持着對其關注,當其恢復後命令它去複製新的master節點
6、節點運維(master、slave、sentinel)
6.1:機器下線,例如過保等情況
6.2:機器性能不足,例如cpu、內存、硬盤、網絡等
6.3:節點自身故障:例如服務不穩定等
主節點運維:sentinel failover <masterName>
節點運維:從節點臨時下線還是永久下線,例如是否做一些清理工作,但是要考慮讀寫分離的情況;
節點上線:主節點(sentinel failover進行替換)、從節點(從salveof即可),sentinel節點可以感知、sentinel節點(參考其它sentinel節點啓動即可)
7、高可用讀寫分離
從節點的作用:副本(高可用發基礎);擴展(讀能力);
三個消息:+switch-master(切換主節點,從節點晉升主節點);+convert-to-slave(切換從節點,原主節點將爲從節點);+sdown(主觀下線)
8、總結
8.1 redis sentinel是redis的高可用實現方案(故障發現、故障自動轉移、配置中心、客戶端通知)
8.2 redis sentinel從redis2.8版本開始正式生產可用,之前版本不可用
8.3 儘可能在不同的物理機器上部署sentinel所有節點
8.4 redis sentinel中的sentinel節點個數應該爲大於等於3且最好爲奇數
8.5 redis sentinel中的數據節點與普通數據節點沒有區別
8.6 客戶端初始化時連接的是sentinel節點集合,不再是具體的redis節點,但sentinel只是配置中心不是代理
8.7 redis sentinel通過三個定時任務實現了sentinel節點對於主節點、從節點其餘sentinel節點監控
8.8 redis sentinel在對節點做失敗判斷時分爲主觀下線和客觀下線
8.9 看懂redis sentinel故障轉移日誌對於redis sentinel以及問題排查非常有幫助
8.10 redis sentinel實現讀寫分離高可用可以依賴sentinel節點的消息通知,獲取redis數據節點的狀態變化