1. 程式人生 > >Redis學習筆記(四) Redis哨兵(sentinel)

Redis學習筆記(四) Redis哨兵(sentinel)

Redis哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務:

·        監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的MasterSlave是否運作正常。

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

·        自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個

Slave升級為新的Master, 並讓失效Master的其他Slave改為複製新的Master; 當客戶端試圖連線失效的Master,叢集也會向客戶端返回新Master的地址,使得叢集可以使用Master代替失效Master

哨兵(sentinel) 是一個分散式系統,你可以在一個架構中執行多個哨兵(sentinel) 程序,這些程序使用流言協議(gossipprotocols)來接收關於Master是否下線的資訊,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作為新的Master.

每個哨兵(sentinel) 會向其它哨兵

(sentinel)masterslave定時傳送訊息,以確認對方是否,如果發現對方在指定時間(可配置)內未迴應,則暫時認為對方已掛(所謂的主觀認為宕機” Subjective Down,簡稱sdown).

哨兵群中的多數sentinel,都報告某一master沒響應,系統才認為該master"徹底死亡"(:客觀上的真正down,Objective Down,簡稱odown),通過一定的vote演算法,從剩下的slave節點中,選一臺提升為master,然後自動修改相關配置.

雖然哨兵(sentinel) 釋出為一個單獨的可執行檔案 redis-sentinel ,

但實際上它只是一個執行在特殊模式下的 Redis 伺服器,你可以在啟動一個普通 Redis 伺服器時通過給定 --sentinel 選項來啟動哨兵(sentinel).

哨兵(sentinel) 的一些設計思路和zookeeper非常類似

單個哨兵(sentinel)


啟動 6379  6380  6381 

配置主從架構


進入redis安裝目錄


修改哨兵配置檔案

vi sentinel.conf

設定 sentinel monitor 為Master 地址

最後面的數字 1 表示最低通過票數

新建一個xshell連線來啟動哨兵,可以檢視sentinel的控制檯資訊

redis-sentinel ./sentinel.conf

將6380強制殺掉


等待一會  哨兵的控制檯 打印出來 +sdown資訊


說明已經監控到slave宕機了

重新啟動 6380

哨兵控制檯列印


可以看出slave重新加入到了主從複製中

-sdown: 說明是恢復服務


現在將Master 強制殺掉


哨兵控制檯列印


我們進入 6381 檢視狀態


6381 已經是 master了 並且擁有一個 6380的slave

重新啟動6379


6379已經恢復,並且將6379設定為6380的slave

這時我們檢視sentinel.conf 發現  我們剛剛配置的埠已經變成6381


而6381也有2個slave


檢視etc下面的redis.6379.conf 和 redis.6380.conf 發現哨兵(sentinel) 已經對該檔案做了修改


6379之前是沒有配置,所以就新增到了最後一行


sentinel後臺執行和redis的配置檔案一樣修改daemonize引數

多個哨兵(sentinel)

配置了一個哨兵,如果該哨兵宕機了,那麼整個主從架構就回復到了原始的情況,所以我們可以配置多個哨兵,每個哨兵監控Redis資訊,並且哨兵之間也會互相監控


修改sentinel.conf中的最低通過票數


在拷貝二份sentinel.conf

cp ./sentinel.conf sentinel.26479.conf
cp ./sentinel.conf sentinel.26579.conf

修改sentinel.26579.conf和sentinel.26479.conf中的port


在新開二個xshell會話,檢視26479 和 26579的控制檯資訊

在每個會話分別啟動一個sentinel

此時控制檯資訊

26379:


增加了2個sentinel

26479:


26579:


強制殺掉6379


Sentinel發現宕機情況


3個都是一樣的

重新啟動6379,sentinel 列印的資訊室一樣的

好吧多個sentinel和一個sentinel的效果是一樣,那麼我們殺掉master試試

和單個哨兵是差不多的

整個故障轉移過程是需要啊一個leader來調整的,所以多個sentinel會選舉一個leader

在Leader觸發failover之前,首先wait數秒(隨即0~5),以便讓其他sentinel例項準備和調整, 如果一切正常,那麼leader就需要開始將一個salve提升為master,此slave必須為狀態良好(不能處於SDOWN/ODOWN狀態)且權重值最低(redis.conf中)的,當master身份被確認後,開始failover

另外2個sentinel的控制檯資訊

26479:

26579:

大概結果就是這樣  ╮(╯▽╰)╭

那麼我們強行殺掉一個sentinel試試

殺掉之後另外2個sentinel 都打印出了這個結果

僅此而已  其他的暫時沒有發現什麼東東


詳細學習文章:

Redis Sentinel:叢集Failover解決方案

Redis基於Sentinel哨兵高可用方案