Redis中主、從庫宕機如何恢復(fù)?

1、什么是哨兵
哨兵是對Redis的系統(tǒng)的運行情況的監(jiān)控,它是一個獨立進程,功能有二個:
監(jiān)控主數(shù)據(jù)庫和從數(shù)據(jù)庫是否運行正常;
主數(shù)據(jù)出現(xiàn)故障后自動將從數(shù)據(jù)庫轉(zhuǎn)化為主數(shù)據(jù)庫;
2、原理
單個哨兵的架構(gòu):

多個哨兵的架構(gòu):

多個哨兵,不僅同時監(jiān)控主從數(shù)據(jù)庫,而且哨兵之間互為監(jiān)控。
多個哨兵,防止哨兵單點故障。
3、環(huán)境
當(dāng)前處于一主多從的環(huán)境中:

4、設(shè)置哨兵
啟動哨兵進程首先需要創(chuàng)建哨兵配置文件:
vim sentinel.conf
輸入內(nèi)容:
sentinel monitor taotaoMaster 127.0.0.1 6379 1
說明:
taotaoMaster:監(jiān)控主數(shù)據(jù)的名稱,自定義即可,可以使用大小寫字母和“.-_”符號
127.0.0.1:監(jiān)控的主數(shù)據(jù)庫的IP
6379:監(jiān)控的主數(shù)據(jù)庫的端口
1:最低通過票數(shù)
啟動哨兵進程:
redis-sentinel ./sentinel.conf

由上圖可以看到:
哨兵已經(jīng)啟動,它的id為9059917216012421e8e89a4aa02f15b75346d2b7
為master數(shù)據(jù)庫添加了一個監(jiān)控
發(fā)現(xiàn)了2個slave(由此可以看出,哨兵無需配置slave,只需要指定master,哨兵會自動發(fā)現(xiàn)slave)
5、從宕機及恢復(fù)

kill掉2826進程后,30秒后哨兵的控制臺輸出:
2989:X 05 Jun 20:09:33.509 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
說明已經(jīng)監(jiān)控到slave宕機了,那么,如果我們將3380端口的redis實例啟動后,會自動加入到主從復(fù)制嗎?
2989:X 05 Jun 20:13:22.716 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 63792989:X 05 Jun 20:13:22.788 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6379
可以看出,slave從新加入到了主從復(fù)制中。-sdown:說明是恢復(fù)服務(wù)。

6、主宕機及恢復(fù)
哨兵控制臺打印出如下信息:
2989:X 05 Jun 20:16:50.300 # +sdown master taotaoMaster 127.0.0.1 6379 說明master服務(wù)已經(jīng)宕機2989:X 05 Jun 20:16:50.300 # +odown master taotaoMaster 127.0.0.1 6379 #quorum 1/12989:X 05 Jun 20:16:50.300 # +new-epoch 12989:X 05 Jun 20:16:50.300 # +try-failover master taotaoMaster 127.0.0.1 6379 開始恢復(fù)故障2989:X 05 Jun 20:16:50.304 # +vote-for-leader 9059917216012421e8e89a4aa02f15b75346d2b7 1 投票選舉哨兵leader,現(xiàn)在就一個哨兵所以leader就自己2989:X 05 Jun 20:16:50.304 # +elected-leader master taotaoMaster 127.0.0.1 6379 選中l(wèi)eader2989:X 05 Jun 20:16:50.304 # +failover-state-select-slave master taotaoMaster 127.0.0.1 6379 選中其中的一個slave當(dāng)做master2989:X 05 Jun 20:16:50.357 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 選中63812989:X 05 Jun 20:16:50.357 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 發(fā)送slaveof no one命令2989:X 05 Jun 20:16:50.420 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 等待升級master2989:X 05 Jun 20:16:50.515 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ taotaoMaster 127.0.0.1 6379 升級6381為master2989:X 05 Jun 20:16:50.515 # +failover-state-reconf-slaves master taotaoMaster 127.0.0.1 63792989:X 05 Jun 20:16:50.566 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 63792989:X 05 Jun 20:16:51.333 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 63792989:X 05 Jun 20:16:52.382 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 63792989:X 05 Jun 20:16:52.438 # +failover-end master taotaoMaster 127.0.0.1 6379 故障恢復(fù)完成2989:X 05 Jun 20:16:52.438 # +switch-master taotaoMaster 127.0.0.1 6379 127.0.0.1 6381 主數(shù)據(jù)庫從6379轉(zhuǎn)變?yōu)?3812989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ taotaoMaster 127.0.0.1 6381 添加6380為6381的從庫2989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 添加6379為6381的從庫2989:X 05 Jun 20:17:22.463 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 發(fā)現(xiàn)6379已經(jīng)宕機,等待6379的恢復(fù)

可以看出,目前,6381位master,擁有一個slave為6380.
接下來,我們恢復(fù)6379查看狀態(tài):
2989:X 05 Jun 20:35:32.172 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 6379已經(jīng)恢復(fù)服務(wù)2989:X 05 Jun 20:35:42.137 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ taotaoMaster 127.0.0.1 6381 將6379設(shè)置為6381的slave
7、配置多個哨兵
vim sentinel.conf
輸入內(nèi)容:
sentinel monitor taotaoMaster1 127.0.0.1 6381 1sentinel monitor taotaoMaster2 127.0.0.1 6381 2

文章轉(zhuǎn)載: 程序員老鬼
(版權(quán)歸原作者所有,侵刪)
往期推薦
關(guān)注「開源Linux」加星標(biāo),提升IT技能


