1. 程式人生 > >redis高可用 - sentinel

redis高可用 - sentinel

標記 目標 系統管理員 int 可用 選項 也有 可靠的 實時監控

sentinel簡介

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)沒有實現自動進行主備切換。而Redis-sentinel是一個獨立運行的進程,它能監控多個master-slave集群,發現master宕機後能進行自動切換。

它的主要功能有以下幾點:

  1. 不時地監控redis是否按照預期良好地運行;
  2. 如果發現某個redis節點運行出現狀況,能夠通知另外一個進程(例如它的客戶端);
  3. 能夠進行自動切換。當一個master節點不可用時,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節點會將它所追隨的master的地址改為被提升為master的slave的新地址。
  4. Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換

sentinel工作方式

  1. 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令
  2. 如果一個實例(instance)距離最後一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記為主觀下線。
  3. 如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
  4. 當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
  5. 一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
  6. 當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
  7. 沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。
  8. 若 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的集群。該系統主要執行四個任務:

  1. 監控( Monitoring ): Redis Sentinel實時監控主服務器和從服務器運行狀態。
  2. 提醒(notification): 當被監控的某個 Redis 服務器出現問題時, Redis Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程序發送通知。
  3. 自動故障轉移:如果一個master不正常運行了,哨兵可以啟動一個故障轉移進程,將一個slave升級成為master,其他的slave被重新配置使用新的master,並且應用程序使用Redis服務端通知的新地址。
  4. 配置提供者:哨兵作為Redis客戶端發現的權威來源:客戶端連接到哨兵請求當前可靠的master的地址。如果發生故障,哨兵將報告

sentinel集群

很顯然,只使用單個sentinel進程來監控redis集群是不可靠的,當sentinel進程宕掉後(sentinel本身也有單點問題,single-point-of-failure)整個集群系統將無法按照預期的方式運行。所以有必要將sentinel集群,這樣有幾個好處:

  1. 即使有一些sentinel進程宕掉了,依然可以進行redis集群的主備切換;
  2. 如果只有一個sentinel進程,如果這個進程運行出錯,或者是網絡堵塞,那麽將無法實現redis集群的主備切換(單點問題);
  3. 如果有多個sentinel,redis的客戶端可以隨意地連接任意一個sentinel來獲得關於redis集群中的信息。

##############

redis高可用 - sentinel