Redis 主從復制架構中出現宕機怎么辦?以及哨兵功能


如果主從復制架構中出現宕機的情況,需要分情況看:

1. 從Redis宕機

  相對而言比較簡單,Redis從庫重新啟動后會自動加入到主從架構中,自動完成同步數據;

  存在的問題是,如果從庫在斷開期間,主庫變化不大,從庫再啟動后,主庫依然會將所有的數據做RDB操作嗎?還是增量更新?(從庫在有做持久化的前提下)

    不會的,因為在Redis2.8版本后酒實現了,主從斷線后恢復的情況下實現增量復制。

2. 主Redis宕機

  相對而言復雜一些,需要以下兩個步驟才能完成

    第一步:在從數據庫中執行SLAVE ON ONE 命令,斷開主從關系並且提升為主庫繼續服務

    第二步:將主庫重新啟動后,執行SLAVEOF 命令,將其設置為其他庫的從庫,這是數據就能更新回來。

 

從上看出,主Redis宕機恢復較麻煩,並且容易出錯,有沒有更好的解決辦法呢?當然有,Redis的哨兵(sentinel)功能

 

哨兵(Sentinel)

什么是哨兵

顧名思義,哨兵的作用就是對Redis的系統的運行情況進行監控,他是一個獨立的進程。他的功能有兩個:

1. 監控主庫和從庫是否運行正常

2. 主庫出現故障后自動將從庫轉化為主庫

 

原理:

單個哨兵的架構:

 

 多個哨兵的架構

 

 多個哨兵,不僅同時監控主從數據庫,而且哨兵之間互為監控。

 

環境處於一主多從的環境中

 

 配置哨兵

啟動哨兵進程首選需要創建哨兵配置文件; 

vi sentinel.conf

寫入配置:

sentinel monitor  RedisMaster 127.0.0.1 6379 1

說明:

MyMonitorMaster:監控主數據庫的名稱 ,自定義即可,可以使用大小姐字母和“.-_”符號
127.0.0.1:監控的主數據庫的IP
6379:監控主數據庫的端口
1:最低通過票數

啟動哨兵:
redis-sentinel ../sentinel.conf

 

 上圖信息:

1. 哨兵已經啟動,id為6460dde23def7ac277edba60b0cec14e44b2aca7

2.為master添加一個監控

3.發現了一個slave,哨兵無需配置slave,只需要指定master,哨兵會自動發現slave

 

從庫宕機模擬:

kill -9 掉從庫的redis進程30秒后,哨兵控制台輸出:

48013:X 29 Nov 2019 17:41:23.390 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379

說明已經監控到slave宕機了,那么,我們將6380實例重新啟動后,會自動加入主從復制么?

./redis-server ../redis.conf

48013:X 29 Nov 2019 17:44:30.178 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
48013:X 29 Nov 2019 17:44:30.257 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379

可以看出,slave從新加入主從復制中,-sdown:說明服務恢復。

主庫宕機模擬:

 停止主Redis的進程:哨兵輸出如下:

48013:X 29 Nov 2019 17:46:55.897 # +sdown master mymaster 127.0.0.1 6379   說明6379 master服務已經宕機 
48013:X 29 Nov 2019 17:46:55.897 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1  
48013:X 29 Nov 2019 17:46:55.897 # +new-epoch 1
48013:X 29 Nov 2019 17:46:55.897 # +try-failover master mymaster 127.0.0.1 6379   開始恢復故障
48013:X 29 Nov 2019 17:46:55.900 # +vote-for-leader 6460dde23def7ac277edba60b0cec14e44b2aca7 1  投票選舉哨兵leader,現在就一個哨兵所以leader就是自己
48013:X 29 Nov 2019 17:46:55.900 # +elected-leader master mymaster 127.0.0.1 6379  選中leader
48013:X 29 Nov 2019 17:46:55.900 # +failover-state-select-slave master mymaster 127.0.0.1 6379  選中其中的一個slave當作master
48013:X 29 Nov 2019 17:46:55.973 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 選中6380
48013:X 29 Nov 2019 17:46:55.973 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379   發送slaveof no one命令
48013:X 29 Nov 2019 17:46:56.056 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 等待升級master
48013:X 29 Nov 2019 17:46:56.509 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379  升級6380為master
48013:X 29 Nov 2019 17:46:56.509 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
48013:X 29 Nov 2019 17:46:56.611 # +failover-end master mymaster 127.0.0.1 6379 故障恢復完成
48013:X 29 Nov 2019 17:46:56.611 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380 主數據庫從6379轉變為6380
48013:X 29 Nov 2019 17:46:56.611 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380 添加6379為6380的從庫
48013:X 29 Nov 2019 17:47:13.013 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380  

 

 

 可以看出,目前,6380為master,擁有一個slave為6379

 

配置多個哨兵

vi sentinel.conf

輸入內容:

sentinel monitor taotaoMaster 127.0.0.1 6381 2
sentinel monitor taotaoMaster2 127.0.0.1 6381 1

 

 

 

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM