天天看點

Redis叢集:Sentinel哨兵模式(詳細圖解)

作者:湘見程式員

在 Redis 主從複制模式中,因為系統不具備自動恢複的功能,是以當主伺服器(master)當機後,需要手動把一台從伺服器(slave)切換為主伺服器。在這個過程中,不僅需要人為幹預,而且還會造成一段時間内伺服器處于不可用狀态,同時資料安全性也得不到保障,是以主從模式的可用性較低,不适用于線上生産環境。

Redis叢集:Sentinel哨兵模式(詳細圖解)

Redis 官方推薦一種高可用方案,也就是 Redis Sentinel 哨兵模式,它彌補了主從模式的不足。Sentinel 通過監控的方式擷取主機的工作狀态是否正常,當主機發生故障時, Sentinel 會自動進行 Failover(即故障轉移),并将其監控的從機提升主伺服器(master),進而保證了系統的高可用性。

哨兵模式原理

哨兵模式是一種特殊的模式,Redis 為其提供了專屬的哨兵指令,它是一個獨立的程序,能夠獨立運作。下面使用 Sentinel 搭建 Redis 叢集,基本結構圖如下所示:

Redis叢集:Sentinel哨兵模式(詳細圖解)

哨兵基本模式

哨兵主要有兩個重要作用:

  • 第一:哨兵節點會以每秒一次的頻率對每個 Redis 節點發送PING指令,并通過 Redis 節點的回複來判斷其運作狀态。
  • 第二:當哨兵監測到主伺服器發生故障時,會自動在從節點中選擇一台将機器,并其提升為主伺服器,然後使用 PubSub 釋出訂閱模式,通知其他的從節點,修改配置檔案,跟随新的主伺服器。

在實際生産情況中,Redis Sentinel 是叢集的高可用的保障,為避免 Sentinel 發生意外,它一般是由 3~5 個節點組成,這樣就算挂了個别節點,該叢集仍然可以正常運轉。其結構圖如下所示:

Redis叢集:Sentinel哨兵模式(詳細圖解)

多哨兵模式

上圖所示,多個哨兵之間也存在互相監控,這就形成了多哨兵模式,現在對該模式的工作過程進行講解,介紹如下:

1) 主觀下線

主觀下線,适用于主伺服器和從伺服器。如果在規定的時間内(配置參數:down-after-milliseconds),Sentinel 節點沒有收到目标伺服器的有效回複,則判定該伺服器為“主觀下線”。比如 Sentinel1 向主服務發送了PING指令,在規定時間内沒收到主伺服器PONG回複,則 Sentinel1 判定主伺服器為“主觀下線”。

2) 客觀下線

客觀下線,隻适用于主伺服器。 Sentinel1 發現主伺服器出現了故障,它會通過相應的指令,詢問其它 Sentinel 節點對主伺服器的狀态判斷。如果超過半數以上的 Sentinel 節點認為主伺服器 down 掉,則 Sentinel1 節點判定主服務為“客觀下線”。

3) 投票選舉

投票選舉,所有 Sentinel 節點會通過投票機制,按照誰發現誰去處理的原則,選舉 Sentinel1 為領頭節點去做 Failover(故障轉移)操作。Sentinel1 節點則按照一定的規則在所有從節點中選擇一個最優的作為主伺服器,然後通過釋出訂功能通知其餘的從節點(slave)更改配置檔案,跟随新上任的主伺服器(master)。至此就完成了主從切換的操作。

Redis叢集:Sentinel哨兵模式(詳細圖解)

Sentinel 負責監控主從節點的“健康”狀态。當主節點挂掉時,自動選擇一個最優的從節點切換為主節點。用戶端來連接配接 Redis 叢集時,會首先連接配接 Sentinel,通過 Sentinel 來查詢主節點的位址,然後再去連接配接主節點進行資料互動。當主節點發生故障時,用戶端會重新向 Sentinel 要位址,Sentinel 會将最新的主節點位址告訴用戶端。是以應用程式無需重新開機即可自動完成主從節點切換。

哨兵模式應用

Redis Sentinel 哨兵模式适合于在 Linux 系統中使用,是以下面的應用都基于 Ubuntu 實作。

1) 安裝sentinel

Sentinel 需要作為插件單獨安裝,安裝方式如下:

sudo apt install redis-sentinel           

2) 搭建主從模式

接下來,在本地環境使用主從模式搭建一個擁有三台伺服器的 Redis 叢集,指令如下所示:

啟動6379的redis伺服器作為master主機:
sudo /etc/init.d/redis-server start

啟動6380的redis伺服器,設定為6379的slave:
redis-server --port 6380
$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK

啟動6381的redis伺服器,設定為6379的salve
redis-server --port 6381
$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379           

3) 配置sentinel哨兵

首先建立 sentinel.conf 檔案,并對其進行配置,如下所示:

port 26379
Sentinel monitor baidu 127.0.0.1 6379 1           

配置檔案說明如下:

port 26379 #sentinel監聽端口,預設是26379,可以更改
sentinel monitor <master-name> <ip> <redis-port> <quorum>           

第二個配置項表示:讓 sentinel 去監控一個位址為 ip:port 的主伺服器,這裡的 master-name 可以自定義;<quorum> 是一個數字,表示當有多少個 sentinel 認為主伺服器當機時,它才算真正的當機掉,通常數量為半數或半數以上才會認為主機已經當機,<quorum> 需要根據 sentinel 的數量設定。

4) 啟動sentienl哨兵

方式一: 
redis-sentinel sentinel.conf
方式二: 
redis-server sentinel.conf --sentinel           

5) 停止主伺服器服務

下面模拟主服務意外當機的情況,首先直接将主伺服器的 Redis 服務終止,然後檢視從伺服器是否被提升為了主伺服器。執行以下指令:

#終止master的redis服務
sudo /etc/init.d/redis-server stop
           

執行完上述指令,您會發現 6381 稱為了新的 master,而其餘節點變成了它的從機,執行指令驗證:

127.0.0.1:6381> set webname www.baidu.net
OK           

哨兵的配置檔案 sentinel.conf 也發生了變化:

#port 26379
#sentinel myid 4c626b6ff25dca5e757afdae2bd26a881a61a2b2
# Generated by CONFIG REWRITE
dir "/home/biancheng"
maxclients 4064
sentinel myid 4c626b6ff25dca5e757afdae2bd26a881a61a2b2
sentinel monitor baidu 127.0.0.1 6379 1
sentinel config-epoch baidu 2
sentinel leader-epoch baidu 2
sentinel known-slave baidu 127.0.0.1 6379
sentinel known-slave baidu 127.0.0.1 6380
sentinel known-slave baidu 127.0.0.1 6381
port 26379
sentinel current-epoch 2           

如果您想開啟多個哨兵,隻需配置要多個 sentinel.conf 檔案即可,一個配置檔案開啟一個。

sentinel.conf配置項

下面對 Sentinel 配置檔案的其他配置項做簡單說明:

配置項 參數類型 說明
dir 檔案目錄 哨兵程序服務的檔案存放目錄,預設為 /tmp。
port 端口号 啟動哨兵的程序端口号,預設為 26379。
sentinel down-after-milliseconds <服務名稱><毫秒數(整數)> 在指定的毫秒數内,若主節點沒有應答哨兵的 PING 指令,此時哨兵認為伺服器主觀下線,預設時間為 30 秒。
sentinel parallel-syncs <服務名稱><伺服器數(整數)> 指定可以有多少個 Redis 服務同步新的主機,一般而言,這個數字越小同步時間越長,而越大,則對網絡資源要求就越高。
sentinel failover-timeout <服務名稱><毫秒數(整數)> 指定故障轉移允許的毫秒數,若超過這個時間,就認為故障轉移執行失敗,預設為 3 分鐘。
sentinel notification-script <服務名稱><腳本路徑> 腳本通知,配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理者,例如當系統運作不正常時發郵件通知相關人員。
sentinel auth-pass <master-name> <password> <伺服器名稱><密碼> 若主伺服器設定了密碼,則哨兵必須也配置密碼,否則哨兵無法對主從伺服器進行監控。該密碼與主伺服器密碼相同。

繼續閱讀