redis高可用 - sentinel
阿新 • • 發佈:2019-02-15
標記 目標 系統管理員 int 可用 選項 也有 可靠的 實時監控
sentinel簡介
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)沒有實現自動進行主備切換。而Redis-sentinel是一個獨立運行的進程,它能監控多個master-slave集群,發現master宕機後能進行自動切換。
它的主要功能有以下幾點:
- 不時地監控redis是否按照預期良好地運行;
- 如果發現某個redis節點運行出現狀況,能夠通知另外一個進程(例如它的客戶端);
- 能夠進行自動切換。當一個master節點不可用時,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節點會將它所追隨的master的地址改為被提升為master的slave的新地址。
- Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
sentinel工作方式
- 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令
- 如果一個實例(instance)距離最後一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。
- 如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
- 當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
- 一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
- 當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
- 沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
- 若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀下線狀態就會被移除
主觀下線和客觀下線:
- 主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器做出的下線判斷。
- 客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server做出 SDOWN 判斷,並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後,得出的Master Server下線判斷,然後開啟failover.
通俗來講就是sentinel就是用來管理多個redis服務器的,可以實現一個功能上實現HA的集群。該系統主要執行四個任務:
- 監控( Monitoring ): Redis Sentinel實時監控主服務器和從服務器運行狀態。
- 提醒(notification): 當被監控的某個 Redis 服務器出現問題時, Redis Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程序發送通知。
- 自動故障轉移:如果一個master不正常運行了,哨兵可以啟動一個故障轉移進程,將一個slave升級成為master,其他的slave被重新配置使用新的master,並且應用程序使用Redis服務端通知的新地址。
- 配置提供者:哨兵作為Redis客戶端發現的權威來源:客戶端連接到哨兵請求當前可靠的master的地址。如果發生故障,哨兵將報告
sentinel集群
很顯然,只使用單個sentinel進程來監控redis集群是不可靠的,當sentinel進程宕掉後(sentinel本身也有單點問題,single-point-of-failure)整個集群系統將無法按照預期的方式運行。所以有必要將sentinel集群,這樣有幾個好處:
- 即使有一些sentinel進程宕掉了,依然可以進行redis集群的主備切換;
- 如果只有一個sentinel進程,如果這個進程運行出錯,或者是網絡堵塞,那麽將無法實現redis集群的主備切換(單點問題);
- 如果有多個sentinel,redis的客戶端可以隨意地連接任意一個sentinel來獲得關於redis集群中的信息。
##############
redis高可用 - sentinel