Redis:高可用——哨兵模式
Redis Sentinel
Redis Sentinel(哨兵模式)是Redis的高可用實現方案,在實際的生成環境中,對提高整個系統的高可用性是非常有幫助的。
主從複製的問題
Redis的主從複製模式可以將主節點的數據改變同步到從節點。
這樣從節點就可以起到兩個作用:
- 作爲主節點的一個備份,一旦主節點出現故障,從節點可以作爲後備“頂”上來,並且保證數據儘量不丟失。(主從複製是最終一致性)
- 從節點可以擴展主節點的讀能力,當主節點面臨大規模的讀操作時,從節點可以分擔壓力。
但是主從複製也帶來一些問題,比如當主節點出現故障,我們需要手動選擇一個從節點代替它,此時不僅要修改應用方的主節點地址,還要命令其他從節點複製新的主節點,整個過程都需要人工干預。其次,主節點的讀寫能力、存儲能力都受制於單機。
聊一聊高可用
聊到高可用,我們先來了解一下這個概念是什麼意思:
“高可用性”(High Availability)通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性。
通俗理解就是說很少發生故障,即使發生故障也能在最短時間內恢復的系統稱之爲高可用性。
那顯然主從複製模式是無法滿足高可用性的,因爲一旦主節點宕機,需要人工干預進行故障轉移,並且應用方很難第一時間發現問題,肯定會造成數據的讀寫錯誤,甚至造成應用法宕機。
既然我們提到哨兵模式,必然是優於主從複製模式的。那他到底是個什麼樣的架構呢?我們來揭開他的神祕面紗!
哨兵模式
其實啊,哨兵模式只是比主從模式多了若干個Sentinel節點。從下圖的邏輯架構上看,Sentinel節點集合會定期對所有節點進行監控,特別是對主節點的故障實現自動轉移。
我們來模擬一下故障轉移的四個步驟:
1)主節點出現故障,此時兩個從節點與主節點失去連接,主從複製失敗!
2)每個Sentinel節點通過定期監控發現主節點出現了故障。
3)多個Sentinel節點對主節點的故障達成一致,選舉出Sentinel-2節點作爲領導者負責故障轉移。
4)Sentinel領導者節點執行了故障轉移,整個過程自動完成,不需要人工干預!
5)故障轉移後,整個拓撲結構如下。
梳理一下哨兵的功能
哨兵名字起得很通俗,放哨的,在Redis Sentinel架構中,它盡職盡責!
- 監控:Sentinel定期檢測Redis數據節點、其餘的Sentinel是否可達。
- 通知:Sentinel節點會將故障轉移的結果通知給應用方。
- 主節點故障轉移:實現從節點晉升爲主節點並維護後續正確的主從關係。
- 配置提供者:在Redis Sentinel結構中,客戶端在初始化的時候連接的是Sentinel節點結合,從中獲取主節點信息。
同時哨兵有多個,這樣有好處,一個睡着了,其他的接着放哨!
參考資料
- 《Redis開發與運維》