Redis之哨兵機制(sentinel)——配置詳解及原理介紹


說到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....

 


免責聲明!

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



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