說到Redis不得不提哨兵模式,那么究竟哨兵是什么意思?為什么要使用哨兵呢?
接下來一一為您講解:
1.為什么要用到哨兵
哨兵(Sentinel)主要是為了解決在主從(master-slave)復制架構中出現宕機的情況,主要分為兩種:
1.1 從Redis宕機(slave)
在Redis中從庫重新啟動后會自動加入到主從架構中,自動完成同步數據。
在Redis2.8版本后,主從斷線后恢復的情況下實現增量復制。
1.2 主Redis宕機(master)
需要以下2步才能完成:
i.第一步,在從數據庫中執行 SLAVEOF NO ONE 命令,斷開主從關系並且提升為主庫繼續服務;
ii.第二步,將主庫重新啟動后,執行 SLAVEOF 命令,將其設置為其他庫的從庫,這時數據就能更新回來。
由於這個手動完成恢復的過程其實是比較麻煩的並且容易出錯,所以Redis提供的哨兵(sentinel)的功能來解決.
2.什么是哨兵
Redis-Sentinel是用於管理Redis集群,該系統執行以下三個任務:
2.1 監控(Monitoring):
Sentinel會不斷地檢查你的主服務器和從服務器是否運作正常;
2.2 提醒(Notification):
當被監控的某個Redis服務器出現問題時,Sentinel可以通過API向管理員或者其他應用程序發送通知;
2.3 自動故障遷移(Automatic failover):
當一個主服務器不能正常工作時,Sentinel 會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從服務器升級為新的主服務器,並讓失效主服務器的其他從服務器改為復制新的主服務器;當客戶端試圖連接失效的主服務器時,集群也會向客戶端返回新主服務器的地址,使得集群可以使用新主服務器代替失效服務器。
3.Sentinel集群搭建
3.1 Sentinel集群拓撲圖
而哨兵也分為單哨兵和多哨兵兩種模式:
- 單哨兵模式
- 多哨兵模式
通過兩個圖示很容易發現:多個哨兵,不僅同時監控主從數據庫,而且哨兵之間互為監控。
3.2 在保證Redis主從架構集群可用的前提下,復制三份配置文件
# 進入redis所在目錄
cd /usr/local/src/redis-3.2.1
# 創建6379、6380、6381目錄,分別將安裝目錄下的sentinel.conf拷貝到這三個目錄下
mkdir -p /usr/local/redis/6379 && cp sentinel.conf /usr/local/redis/6379/26379.conf
mkdir -p /usr/local/redis/6380 && cp sentinel.conf /usr/local/redis/6380/26380.conf
mkdir -p /usr/local/redis/6381 && cp sentinel.conf /usr/local/redis/6381/26381.conf
3.3 分別配置三個哨兵
# 修改sentinel配置文件
vim /usr/local/redis/6379/26379.conf
修改內容:
# 添加守護進程模式
daemonize yes
# 添加指明日志文件名
logfile "/usr/local/redis/6379/sentinel26379.log"
# 修改工作目錄
dir "/usr/local/redis/6379"
# 修改啟動端口
port 26379
# 添加關閉保護模式
protected-mode no
# 修改sentinel monitor
sentinel monitor macrog-master 192.168.24.131 6379 2
# 將配置文件中mymaster全部替換macrog-master
# 在末行模式下 輸入 :%s/mymaster/macrog-master/g
依次修改26380,26381配置
說明:
macrog-master:監控主數據的名稱,自定義即可,可以使用大小寫字母和“.-_”符號
192.168.24.131:監控的主數據庫的IP
6379:監控的主數據庫的端口
2:最低通過票數
3.4 啟動哨兵進程
redis-sentinel /usr/local/redis/6379/26379.conf //或者 redis-server /usr/local/redis/6379/26379.conf --sentinel
redis-sentinel /usr/local/redis/6380/26380.conf //或者 redis-server /usr/local/redis/6380/26380.conf --sentinel
redis-sentinel /usr/local/redis/6381/26381.conf //或者 redis-server /usr/local/redis/6381/26381.conf --sentinel
3.5. 測試
測試前分別打開三個哨兵的日志(上面配置有logfile的名字):
1、 從庫宕機(6380)
手動使從庫6380宕機,即殺掉該進程:
kill -9 17233
30s后,26379/26380/26381日志均打印:
27552:X 10 Sep 18:12:12.757 # +sdown slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379
這表示:檢測到從庫宕機(+sdown: Subjective down主觀宕機,第4節介紹),並告知master庫6379。
現在我們重新啟動6380實例。
redis-server 6380/6380.conf
26379/26380/26381日志均打印:
27570:X 10 Sep 18:15:40.384 * +reboot slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379
27570:X 10 Sep 18:15:40.451 # -sdown slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379
可以看出:slave重新加入到了主從復制中。-sdown:說明是恢復服務。
2、 主庫宕機(6379)
同樣的我們手動將master庫宕機:
kill -9 17221
30s后, 26381日志打印:
最上面兩條log表示master宕機(+sdown,+odown分別表示主觀宕機和客觀宕機,第4節介紹)
第二個紅方框表示:哨兵將哨兵中某一個選舉成為leader,選擇6381為新的master;
最后三行表示:設置6379和6380為6381的slave;
也可以通過info replication查看主從關系 發現master已經切換為6381。
接下來,我們恢復6379(原master),查看狀態:
redis-server 6379/6379.conf
日志均打印:
27675:X 10 Sep 18:28:10.392 # -sdown slave 192.168.24.131:6379 192.168.24.131 6379 @ macrog-master 192.168.24.131 6381
表示:已經將6379設置為6381的slave。
4.Sentinel原理介紹
在上面遇到的兩個名詞,主觀down和客觀down:
SDOWN:subjectively down,直接翻譯的為”主觀”失效,即:當前sentinel實例認為某個redis服務為”不可用”狀態;
ODOWN:objectively down,直接翻譯為”客觀”失效,即:多個sentinel實例都認為master處於”SDOWN”狀態,那么此時master將處於ODOWN,ODOWN可以簡單理解為master已經被集群確定為”不可用”,將會開啟failover。
SDOWN與ODOWN轉換過程:
1、每個sentinel實例在啟動后,都會和已知的slaves/master以及其他sentinels建立TCP連接,並周期性發送PING(默認為1秒),在交互中,如果redis-server無法在”down-after-milliseconds”時間內響應或者響應錯誤信息,都會被認為此redis-server處於SDOWN狀態。
2、SDOWN的server為master,那么此時sentinel實例將會向其他sentinel間歇性(一秒)發送”is-master-down-by-addr ”指令並獲取響應信息,如果足夠多的sentinel實例檢測到master處於SDOWN,那么此時當前sentinel實例標記master為ODOWN…其他sentinel實例做同樣的交互操作。配置項”sentinel monitor ”,如果檢測到master處於SDOWN狀態的slave個數達到,那么此時此sentinel實例將會認為master處於ODOWN。
3、每個sentinel實例將會間歇性(10秒)向master和slaves發送”INFO”指令,如果master失效且沒有新master選出時,每1秒發送一次”INFO”;”INFO”的主要目的就是獲取並確認當前集群環境中slaves和master的存活情況。
4、經過上述過程后,所有的sentinel對master失效達成一致后,開始failover。
Sentinel與slaves“自動發現”機制:
在sentinel的配置文件中,都指定了port,此port就是sentinel實例偵聽其他sentinel實例建立鏈接的端口。
在集群穩定后,最終會每個sentinel實例之間都會建立一個tcp鏈接,此鏈接中發送”PING”以及類似於”is-master-down-by-addr”指令集,可用來檢測其他sentinel實例的有效性以及”ODOWN”和”failover”過程中信息的交互。
在sentinel之間建立連接之前,sentinel將會盡力和配置文件中指定的master建立連接。sentinel與master的連接中的通信主要是基於pub/sub來發布和接收信息,發布的信息內容包括當前sentinel實例的偵聽端口。
Over....