1.手把手教你搭建Redis叢集第二篇(哨兵模式)
在上篇文章中已經教大家搭建了Redis叢集之主從複制模式(安裝Redis的準備工作請大家檢視我寫的這篇點選跳轉)
1.1 哨兵模式(sentinel)
1.1.1 什麼是哨兵?
哨兵的作用就是對Redis的運作情況進行監控,他是一個獨立的程序。主要功能有以下兩點:
1、監控主資料庫和從資料庫運作是否正常
2、主資料庫出現故障後自動将從資料庫轉化成為主資料庫
1.1.2 配置哨兵模式
修改sentinel.conf
vim sentinel.conf
配置哨兵資訊:
sentinel monitor MekingMaster 127.0.0.1 7001 1
說明:
MekingMaster:監控主資料的名稱,自定義即可,可以使用大小寫字母和“.-_”符号
127.0.0.1:監控的主資料庫的IP
7001:監控的主資料庫的端口
1:最低通過票數
啟動哨兵程序:
redis-sentinel ./sentinel.conf
由上圖可以看到:
1、 哨兵已經啟動,它的id 0b69761e344961c1c803c8778460b7222689a709
2、 為master資料庫添加了一個監控
3、 發現了2個slave(由此可以看出,哨兵無需配置slave,隻需要指定master,哨兵會自動發現slave)
1.1.3 測試從資料庫當機
kill -9 17640
在等待30秒之後哨兵已經監控到了slave當機了,接下來我們重新啟動7002這個從資料庫,看看是否會重新加入叢集
重新開機7002端口redis從資料庫
./redis-server /usr/local/src/cluster-7002/redis.conf
可以看出7002已經重新加入到叢集到了
-sdown:說明是恢複服務
1.1.4 故障轉移
一次故障轉移操作由以下步驟組成:
1、發現主伺服器已經進入客觀下線狀态。
2、對我們的目前紀元進行自增(詳情請參考 Raft leader election ), 并嘗試在這個紀元中當選。
3、如果當選失敗, 那麼在設定的故障遷移逾時時間的兩倍之後, 重新嘗試當選。 如果當選成功, 那麼執行以下步驟。
4、選出一個從伺服器,并将它更新為主伺服器。
5、向被選中的從伺服器發送 SLAVEOF NO ONE 指令,讓它轉變為主伺服器。
6、通過釋出與訂閱功能, 将更新後的配置傳播給所有其他 Sentinel , 其他 Sentinel 對它們自己的配置進行更新。
7、向已下線主伺服器的從伺服器發送 SLAVEOF 指令, 讓它們去複制新的主伺服器。
8、當所有從伺服器都已經開始複制新的主伺服器時, 領頭 Sentinel 終止這次故障遷移操作。
1.1.5 主庫當機
接下來我将詳細解釋一下這寫個日志資訊
17086:X 16 Sep 11:01:44.306 # +sdown master MekingMaster 127.0.0.1 7001
說明主伺服器已經當機了
17086:X 16 Sep 11:01:44.306 # +odown master MekingMaster 127.0.0.1 7001 #quorum 1/1
17086:X 16 Sep 11:01:44.306 # +new-epoch 1
17086:X 16 Sep 11:01:44.306 # +try-failover master MekingMaster 127.0.0.1 7001 開始恢複故障
17086:X 16 Sep 11:01:44.322 # +vote-for-leader 1a4f8224fcae8d7bbdaee1af77251e259e2af9021投票選舉哨兵Leader,因為就一個哨兵是以選擇自己當leader
17086:X 16 Sep 11:01:44.322 # +elected-leader master MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:44.322 # +failover-state-select-slave master MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:44.379 # +selected-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ MekingMaster 127.0.0.1 7001 選擇7002當master
17086:X 16 Sep 11:01:44.379 * +failover-state-send-slaveof-noone slave 127.0.0.1:7002 127.0.0.1 7002 @ MekingMaster 127.0.0.1 7001發送slaveof no one指令
17086:X 16 Sep 11:01:44.445 * +failover-state-wait-promotion slave 127.0.0.1:7002 127.0.0.1 7002 @ MekingMaster 127.0.0.1 7001
等待更新master
17086:X 16 Sep 11:01:45.419 # +promoted-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ MekingMaster 127.0.0.1 7001 更新7002為Master
17086:X 16 Sep 11:01:45.419 # +failover-state-reconf-slaves master MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:45.474 * +slave-reconf-sent slave 127.0.0.1:7003 127.0.0.1 7003 @ MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:46.454 * +slave-reconf-inprog slave 127.0.0.1:7003 127.0.0.1 7003 @ MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:46.454 * +slave-reconf-done slave 127.0.0.1:7003 127.0.0.1 7003 @ MekingMaster 127.0.0.1 7001
17086:X 16 Sep 11:01:46.507 # +failover-end master MekingMaster 127.0.0.1 7001故障恢複完成
17086:X 16 Sep 11:01:46.507 # +switch-master MekingMaster 127.0.0.1 7001 127.0.0.1 7002主資料庫從7001變成7002
17086:X 16 Sep 11:01:46.507 * +slave slave 127.0.0.1:7003 127.0.0.1 7003 @ MekingMaster 127.0.0.1 7002 添加7003為7002的從庫
17086:X 16 Sep 11:01:46.507 * +slave slave 127.0.0.1:7001 127.0.0.1 7001 @ MekingMaster 127.0.0.1 7002添加7001為7002的從庫
17086:X 16 Sep 11:02:16.545 # +sdown slave 127.0.0.1:7001 127.0.0.1 7001 @ MekingMaster 127.0.0.1 7002發現7001已經當機,等待7001的恢複
可以從上圖中看出7002已經為Master,并且隻擁有7003一個從資料庫,接下來我們恢複7001資料庫
./redis-server /usr/local/src/cluster-7001/redis.conf
17086:X 16 Sep 11:22:20.469 # -sdown slave 127.0.0.1:7001 127.0.0.1 7001 @ MekingMaster 127.0.0.1 7002 7001已經恢複服務
17086:X 16 Sep 11:22:30.430 * +convert-to-slave slave 127.0.0.1:7001 127.0.0.1 7001 @ MekingMaster 127.0.0.1 70027001成為7002的從資料庫
1.1.6 配置多個哨兵
大家可以想一下其實配置一個哨兵還是不符合高可用的特點的,因為一個哨兵也有存在宕掉的可能性,如過那個宕掉了,那麼哨兵模式便将不複存在了,是以接下來我們要開始配置多個哨兵。
先修改sentinel.conf 配置成預設背景啟動
daemonize yes
然後分别将sentinel.conf 檔案複制到三個檔案夾中
cp sentinel.conf /usr/local/src/cluster-7001/
cp sentinel.conf /usr/local/src/cluster-7002/
cp sentinel.conf /usr/local/src/cluster-7003/
然後修改另外兩個哨兵的端口号(由于我是在一台機器上做的操作是以必須修改端口号這個和我修改Redis端口号是一個意思)
三個哨兵的端口分别為:26379、26380、26381
然後啟動三個哨兵
redis-sentinel /usr/local/src/cluster-7001/sentinel.conf
redis-sentinel /usr/local/src/cluster-7002/sentinel.conf
redis-sentinel /usr/local/src/cluster-7003/sentinel.conf
測試關掉7002主資料庫
後續發現哨兵開始進行故障轉移,将7003設定為主資料庫了。
好了,Redis叢集之哨兵模式在這裡就介紹完畢了,接下來我會向大家介紹Redis叢集之分片叢集模式,也是目前最高效、最穩定的一種模式。