1. 程式人生 > >《Redis的哨兵機制》 模式 原理詳解,其實很簡單

《Redis的哨兵機制》 模式 原理詳解,其實很簡單

一.什麼是哨兵機制?

答:Redis的哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務:
       監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
       提醒(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)、master、slave定時傳送訊息,以確認對方是否”活”著,如果發現對方在指定時間(可配置)內未迴應,則暫時認為對方已掛(所謂的”主觀認為宕機” Subjective Down,簡稱sdown).
若“哨兵群”中的多數sentinel,都報告某一master沒響應,系統才認為該master"徹底死亡"(即:客觀上的真正down機,Objective Down,簡稱odown),通過一定的vote演算法,從剩下的slave節點中,選一臺提升為master,然後自動修改相關配置。
雖然哨兵(sentinel) 釋出為一個單獨的可執行檔案 redis-sentinel ,但實際上它只是一個執行在特殊模式下的 Redis 伺服器,你可以在啟動一個普通 Redis 伺服器時通過給定 --sentinel 選項來啟動哨兵(sentinel)。
      哨兵(sentinel) 的一些設計思路和zookeeper非常類似


二.哨兵模式的配置修改

實現步驟:
1.拷貝到etc目錄
cp sentinel.conf  /usr/local/redis/etc
2.修改sentinel.conf配置檔案
    sentinel monitor mymast  192.168.110.133 6379 1  #主節點 名稱 IP 埠號 選舉次數

  #配置主伺服器的密碼(如沒設定密碼,可以省略)  
   sentinel auth-pass mymaster 123456  
3. 修改心跳檢測 5000毫秒
    sentinel down-after-milliseconds mymaster 5000
4. 做多多少合格節點

    sentinel parallel-syncs mymaster 2


5. 啟動哨兵模式
   ./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &
6. 停止哨兵模式

注意:

1.當啟動哨兵模式之後,如果你的master伺服器宕機之後,哨兵自動會在從redis伺服器裡面 投票選舉一個master主伺服器出來;這個主伺服器也可以進行讀寫操作!

2.如果之前宕機的主伺服器已經修好,可以正式運行了。那麼這個伺服器只能進行的操作,會自動跟隨由哨兵選舉出來的新伺服器!

3.大家可以進入./redis-cli,輸入info,檢視你的狀態資訊;


三、哨兵(Sentinel)總結

1、Sentinel的作用:

AMaster 狀態監測

B、如果Master 異常,則會進行Master-slave 轉換,將其中一個Slave作為Master,將之前的Master作為Slave 

CMaster-Slave切換後,master_redis.confslave_redis.confsentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換 

2、Sentinel的工作方式:

1):每個Sentinel以每秒鐘一次的頻率向它所知的MasterSlave以及其他 Sentinel 例項傳送一個 PING 命令。

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

3):如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。

4):當有足夠數量的 Sentinel(大於等於配置檔案指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態,則Master會被標記為客觀下線 。

5):在一般情況下,每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有MasterSlave傳送 INFO 命令 。

6):當Master Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次 。

7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。

Master 重新向 Sentinel PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

最後,如果大家看不太懂,推薦大家看兩個部落格,就明白了!

1.http://blog.csdn.net/zbw18297786698/article/details/52891695
2.http://blog.csdn.net/candy_rainbow/article/details/52842402