Redis學習筆記(四) Redis哨兵(sentinel)
Redis的哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務:
· 監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
· 提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程式傳送通知。
· 自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個
哨兵(sentinel) 是一個分散式系統,你可以在一個架構中執行多個哨兵(sentinel) 程序,這些程序使用流言協議(gossipprotocols)來接收關於Master是否下線的資訊,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作為新的Master.
每個哨兵(sentinel) 會向其它哨兵
若“哨兵群”中的多數sentinel,都報告某一master沒響應,系統才認為該master"徹底死亡"(即:客觀上的真正down機,Objective Down,簡稱odown),通過一定的vote演算法,從剩下的slave節點中,選一臺提升為master,然後自動修改相關配置.
雖然哨兵(sentinel) 釋出為一個單獨的可執行檔案 redis-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哨兵高可用方案