1. 程式人生 > >分散式快取技術redis學習系列(六)——sentinel哨兵機制

分散式快取技術redis學習系列(六)——sentinel哨兵機制

一、簡介:

1、Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance),該系統執行以下三個任務:

1)監控(Monitoring):Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。

2)提醒(Notification):當被監控的某個 Redis 伺服器出現問題時,Sentinel 可以通過 API 向管理員或者其他應用程式傳送通知。

3)自動故障遷移(Automatic failover):當一個主伺服器不能正常工作時,Sentinel 會開始一次自動故障遷移操作,它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;當客戶端試圖連線失效的主伺服器時,叢集也會向客戶端返回新主伺服器的地址,使得叢集可以使用新主伺服器代替失效伺服器。

2、Redis Sentinel 是一個分散式系統,你可以在一個架構中執行多個 Sentinel 程序(progress),這些程序使用流言協議(gossip protocols)來接收關於主伺服器是否下線的資訊,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選擇哪個從伺服器作為新的主伺服器。

雖然 Redis Sentinel 釋出為一個單獨的可執行檔案 redis-sentinel ,但實際上它只是一個執行在特殊模式下的 Redis 伺服器,你可以在啟動一個普通 Redis 伺服器時通過給定 –sentinel 選項來啟動 Redis Sentinel 。

Redis Sentinel 相容 Redis 2.4.16 或以上版本,推薦使用 Redis 2.8.0 或以上的版本。

二、啟動 Sentinel

方式一:使用sentinel可執行檔案 redis-sentinel 程式來啟動 Sentinel 系統,命令如下:

redis-sentinel /path/to/sentinel.conf

方式二:sentinel只是執行在特殊模式下的redis伺服器,你可以用啟動redis服務的命令來啟動一個執行在 Sentinel 模式下的 Redis 伺服器:

redis-server /path/to/sentinel.conf --sentinel

啟動 Sentinel 例項必須指定相應的配置檔案,系統會使用配置檔案來儲存 Sentinel 的當前狀態,並在 Sentinel 重啟時通過載入配置檔案來進行狀態還原。 Redis 原始碼中包含了一個名為 sentinel.conf 的檔案,這個檔案是一個帶有詳細註釋的 Sentinel 配置檔案示例,與 redis.conf 配置檔案同目錄。

三、配置 Sentinel

執行一個 Sentinel 所需的示例配置如下所示:

1、port 26379
2、dir /usr/local/redis/sentinel

3、daemonize yes
4、logfile "/usr/local/redis/sentinel/log/sentinel.log"

5、sentinel monitor mymaster 127.0.0.1 6379 2
6、sentinel down-after-milliseconds mymaster 5000
7、sentinel failover-timeout mymaster 180000
8、sentinel parallel-syncs mymaster 1
9、sentinel notification-script mymaster /var/redis/notify.sh

1、port :當前 Sentinel服務執行的埠

2、dir : Sentinel服務執行時使用的臨時資料夾,預設為 /tmp

3、設定sentinel後臺執行,即以守護程序的方式執行

4、設定sentinel的日誌輸出檔案

5、sentinel monitor mymaster 127.0.0.1 6379 2 : Sentinel去監視一個名為 mymaster 的主redis例項,它的IP地址為127.0.0.1 ,埠號為 6379 ,而將這個主例項判斷為失效至少需要 2 個 Sentinel程序的同意,只要同意Sentinel的數量不達標,自動failover(故障轉移)就不會執行。

6、sentinel down-after-milliseconds mymaster 5000 : 指定了Sentinel認為Redis例項已經失效所需的毫秒數。 當例項超過該時間沒有返回PING,或者直接返回錯誤,那麼Sentinel將這個例項標記為主觀下線。只有一個 Sentinel程序將例項標記為主觀下線並不一定會引起例項的自動故障遷移:只有在足夠數量的Sentinel都將一個例項標記為主觀下線之後,例項才會被標記為客觀下線,這時自動故障遷移才會執行。

7、sentinel failover-timeout mymaster 180000 :如果在該時間(ms)內未能完成failover操作,則認為該failover失敗。

8、sentinel parallel-syncs mymaster 1 :指定了在執行故障轉移時,最多可以有多少個從Redis例項在同步新的主例項,在從Redis例項較多的情況下這個數字越小,同步的時間越長,完成故障轉移所需的時間就越長

9、sentinel notification-script : 指定sentinel檢測到該監控的redis例項指向的例項異常時,呼叫的報警指令碼。該配置項可選,但是很常用

執行一個 Sentinel 所需的最少配置如下所示:

sentinel monitor mymaster 127.0.0.1 6379 1

注意:sentinel啟動之後,會把預設配置以及非官方配置(比如設定守護程序與日誌輸出的配置)註釋,並會重寫sentinel.conf配置,啟動之後可以看看配置檔案的變化,重啟的時候一定要關注此時配置,很可能與之前預想的配置不一樣了

四、主觀下線與客觀下線概念

主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 例項對伺服器做出的下線判斷。 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 例項在對同一個伺服器做出 SDOWN 判斷,並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後,得出的伺服器下線判斷。(一個 Sentinel 可以通過向另一個 Sentinel 傳送 SENTINEL is-master-down-by-addr 命令來詢問對方是否認為給定的伺服器已下線。)

五、自動發現 Sentinel 和從伺服器

1、發現其它的sentinel:

一個 Sentinel 可以與其他多個 Sentinel 進行連線,各個 Sentinel 之間可以互相檢查對方的可用性,並進行資訊交換。

你無須為執行的每個 Sentinel 分別設定其他 Sentinel 的地址,因為 Sentinel 可以通過釋出與訂閱功能來自動發現正在監視相同主伺服器的其他 Sentinel ,這一功能是通過向頻道 sentinel:hello 傳送資訊來實現的。

2、發現從伺服器:

與此類似,你也不必手動列出主伺服器屬下的所有從伺服器,因為 Sentinel 可以通過詢問主伺服器來獲得所有從伺服器的資訊。

六、sentinel執行機制

每個 Sentinel 以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 例項傳送一個 PING 命令。

如果一個例項(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值,那麼這個例項會被 Sentinel 標記為主觀下線。

一個有效回覆可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

如果一個主伺服器被標記為主觀下線,那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。

如果一個主伺服器被標記為主觀下線,並且有足夠數量的 Sentinel (至少要達到配置檔案指定的數量)在指定的時間範圍內同意這一判斷,那麼這個主伺服器被標記為客觀下線。

在一般情況下,每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主伺服器和從伺服器傳送 INFO 命令。

當一個主伺服器被 Sentinel 標記為客觀下線時,Sentinel 向下線主伺服器的所有從伺服器傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

當沒有足夠數量的 Sentinel 同意主伺服器已經下線,主伺服器的客觀下線狀態就會被移除。當主伺服器重新向 Sentinel 的 PING 命令返回有效回覆時,主伺服器的主管下線狀態就會被移除。

出現故障的伺服器重新啟動,sentinel將其作為slave分配給前面重新選定的master。

配置檔案的變化:所有slave的redis.conf中的slaveof被重寫,sentinel.conf配置監控的主服務也會被替換