小白學Redis系列:哨兵機制(上)

     Redis一般以一主多從的形式部署,以實現讀寫分離,減輕單個Redis實例的負載壓力。今天我們來討論下,在主數據庫宕機停止服務的情況下,如何恢復主數據庫,保持整個Redis系統的高可用性。


方式一:手工通過從數據庫恢復主數據庫

    手工通過從數據庫恢復主數據是一個相對繁瑣且危險的過程,操作不當可能導致整個Redis系統數據丟失。因此,手工操作時需要嚴格按照以下兩步進行:

  1. 從備選從數據庫中選擇一個作爲新的主數據庫,即使用 "SLAVEOF NO ONE命令",將其升格爲主數據。若存在多個從數據庫,則將其他從數據庫作爲新的主數據庫的從數據庫,即使用"SLAVEOF  新主數據IP  新主數據PORT "命令。
  2. 啓動舊的主數據,使用"SLAVEOF 新主數據庫IP  新主數據PORT"命令將其作爲新主數據庫的從數據庫。

     前文提到,手工恢復的過程伴隨着一定的風險性,這裏的風險指什麼?

  在一主多從的Redis系統中,爲了提高性能,一般會關閉主數據庫的持久化功能,而開啓從數據庫的持久化功能。若使用Supervisor以及類似的進程管理工具使得主數據庫崩潰後直接自動重啓或直接手動重啓,由於主數據庫沒有開啓持久化功能(無RDB和AOF文件),重啓後主數據中沒有數據,而複製功能使得主數據庫的數據向從數據庫同步,從而可能導致從數據庫的數據也被清空,這是個十分危險的行爲。另外,人爲介入也給系統恢復帶來一定的風險。

    無論如何,手工恢復都是相對繁瑣且不推薦的。好在Redis提供了一種自動化方案--哨兵來實現這一過程,避免了手工維護的麻煩和容易出錯的問題。


方式二:自動化監控方案--哨兵

    什麼是哨兵?哨兵就是一個獨立的進程,其作用就是監控Redis系統的運行狀況,它包含以下兩個功能:

  1. 監控主從數據庫是否運行正常
  2. 當主數據異常時,自動將從數據庫升格爲主數據庫

我們通過一個簡單的案例來探究哨兵機制的原理:

1、開啓三個Redis服務器,端口號分別爲6379、6380、6381,其中6379作爲主數據庫,其餘兩個作爲從數據庫。
2、分別執行INFO REPLICATION命令查看三種主從關係是否正確。
3、編寫哨兵配置文件,例如my_sentinel.conf,內容如下:
注意:配置哨兵監控系統時,只需要配置監控主數據庫即可, 哨兵會自動依據主數據庫找到其他關聯的從數據庫。

4、執行命令redis-sentinel /path/to/my_sentinel.conf,開啓一個哨兵進程
5、分析哨兵進程啓動後的輸出信息:


+monitor : 表示發現了主數據庫
+slave : 表示哨兵新發現了從數據庫
6、這時,我們手動殺死主數據進程,繼續查看輸出信息
+sdown : 表示哨兵主觀認爲主數據庫停止服務了
+odown : 表示哨兵客觀認爲主數據停止服務了
+try-failover : 表示開始進行故障修復;
+failover-end:表示完成故障修復。二者期間完成領頭哨兵選舉、備選從數據庫選擇等
+switch-master : 表示主數據從6379端口切換到了6380端口,即6380從數據庫被升格爲主數據庫。後面兩個+slave列出了新的主數據庫的從數據庫。可以發現先前的主數據庫6379雖然還沒修復,但是哨兵將它作爲新的主數據庫的從數據庫,以便當6379數據庫重啓後能夠按照新的主從關係繼續提供服務。

7、手動重啓原主數據庫,繼續查看輸出信息


-sdown : 表示6379數據庫已經恢復服務(與+sdown相反)
+convert-to-slave : 表示將6379實例設置爲6380端口實例的從數據庫


至此,我們模擬了哨兵的一次完整工作流程,在下一章節中我們將繼續討論哨兵機制的原理。

Ending ...大笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章