如果主從復制架構中出現宕機的情況,需要分情況看:
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