redis sentinel 哨兵

redis 哨兵

參考鏈接

##redis中文官網
本文到部分來自中文官網文檔

哨兵的作用

  • 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
  • 提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
  • 自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其他從服務器改爲複製新的主服務器; 當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可以使用新主服務器代替失效服務器。

啓動sentinel的兩種方式

  • redis-sentinel redis.conf
  • redis-server redis.conf --sentinel

原來的主從複製當master假如宕機了,需要我們手動的 slaveof no one 等一些操作切換主從關係
sentinel 可以很好的解決這個問題他會去實時監控master 的情況,當master出現問題,sentinel可以完成故障轉換幫我們切換master

sentinel中的概念

  • 主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 實例對服務器做出的下線判斷。
  • 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 實例在對同一個服務器做出 SDOWN 判斷, 並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後, 得出的服務器下線判斷。

什麼時候示例被判定爲主觀下線呢:----如果一個服務器沒有在 master-down-after-milliseconds 選項所指定的時間內, 對向它發送 PING 命令的 Sentinel 返回一個有效回覆(valid reply), 那麼 Sentinel 就會將這個服務器標記爲主觀下線。

故障轉移操作:---->只要一個 Sentinel 發現某個主服務器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 並對失效的主服務器執行自動故障遷移操作。

每個 Sentinel 都需要定期執行的任務

  • 每個 Sentinel 以每秒鐘一次的頻率向它所知的主服務器、從服務器以及其他 Sentinel 實例發送一個 PING 命令。
  • 如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個實例會被 Sentinel 標記爲主觀下線。 一個有效回覆可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
  • 如果一個主服務器被標記爲主觀下線, 那麼正在監視這個主服務器的所有 Sentinel 要以每秒一次的頻率確認主服務器的確進入了主觀下線狀態。
  • 如果一個主服務器被標記爲主觀下線, 並且有足夠數量的 Sentinel (至少要達到配置文件指定的數量)在指定的時間範圍內同意這一判斷, 那麼這個主服務器被標記爲客觀下線。
  • 在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主服務器和從服務器發送 INFO 命令。 當一個主服務器被 Sentinel 標記爲客觀下線時, Sentinel 向下線主服務器的所有從服務器發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次。
  • 當沒有足夠數量的 Sentinel 同意主服務器已經下線, 主服務器的客觀下線狀態就會被移除。 當主服務器重新向 Sentinel 的 PING 命令返回有效回覆時, 主服務器的主觀下線狀態就會被移除。

sentinel 和其他redis實例相互通信·

  • 一個 Sentinel 可以與其他多個 Sentinel 進行連接, 各個 Sentinel 之間可以互相檢查對方的可用性, 並進行信息交換。
  • Sentinel 可以通過發佈與訂閱功能來自動發現正在監視相同主服務器的其他 Sentinel , 這一功能是通過向頻道 sentinel:hello 發送信息來實現的。
  • 每個 Sentinel 會以每兩秒一次的頻率, 通過發佈與訂閱功能, 向被它監視的所有主服務器和從服務器的 sentinel:hello 頻道發送一條信息, 信息中包含了 Sentinel 的 IP 地址、端口號和運行 ID (runid)。
  • 每個 Sentinel 都訂閱了被它監視的所有主服務器和從服務器的 sentinel:hello 頻道, 查找之前未出現過的 sentinel (looking for unknown sentinels)。 當一個 Sentinel 發現一個新的 Sentinel 時, 它會將新的 Sentinel 添加到一個列表中, 這個列表保存了 Sentinel 已知的, 監視同一個主服務器的所有其他 Sentinel 。
  • Sentinel 發送的信息中還包括完整的主服務器當前配置(configuration)。 如果一個 Sentinel 包含的主服務器配置比另一個 Sentinel 發送的配置要舊, 那麼這個 Sentinel 會立即升級到新配置上。
  • 在將一個新 Sentinel 添加到監視主服務器的列表上面之前, Sentinel 會先檢查列表中是否已經包含了和要添加的 Sentinel 擁有相同運行 ID 或者相同地址(包括 IP 地址和端口號)的 Sentinel , 如果是的話, Sentinel 會先移除列表中已有的那些擁有相同運行 ID 或者相同地址的 Sentinel , 然後再添加新 Sentinel 。

故障轉移

一次故障轉移操作由以下步驟組成:

  • 發現主服務器已經進入客觀下線狀態。
  • 對我們的當前紀元進行自增(詳情請參考 Raft leader election ), 並嘗試在這個紀元中當選。
  • 如果當選失敗, 那麼在設定的故障遷移超時時間的兩倍之後, 重新嘗試當選。 如果當選成功, 那麼執行以下步驟。
  • 選出一個從服務器,並將它升級爲主服務器。
  • 向被選中的從服務器發送 SLAVEOF NO ONE 命令,讓它轉變爲主服務器。
  • 通過發佈與訂閱功能, 將更新後的配置傳播給所有其他 Sentinel , 其他 Sentinel 對它們自己的配置進行更新。
  • 向已下線主服務器的從服務器發送 SLAVEOF 命令, 讓它們去複製新的主服務器。
  • 當所有從服務器都已經開始複製新的主服務器時, 領頭 Sentinel 終止這次故障遷移操作。

這時對sentinel也已經有了大致的瞭解

配置

講一下配置寫3份改一下端口就行,我這裏命名爲redis-sentinel.conf

# Sentinel節點的端口
port 16379
dir "/root/redis-sentinel/port16379"
logfile "16379.log"
daemonize yes
# 當前Sentinel節點監控 127.0.0.1:6379 這個主節點
# 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意
# mymaster是主節點的別名
sentinel monitor mymaster 127.0.0.1 6381 2
#選項指定了 Sentinel 認爲服務器已經斷線所需的毫秒數 60秒。
sentinel down-after-milliseconds mymaster 60000
# parallel-syncs 選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。
sentinel parallel-syncs mymaster 2
#故障轉移超時時間爲180000毫秒
sentinel failover-timeout mymaster 180000

以上配置文件 sentinel monitor mymaster 127.0.0.1 6381 2 當一臺master出現故障需要轉移時至少需要兩個sentinel同意
換句話說, 在只有少數(minority) Sentinel 進程正常運作的情況下, Sentinel 是不能執行自動故障遷移的。

  • 1.配置主從複製(這個我前面已經寫過了)

假設現在有4個redis實例 port 分別爲 6379 6380 6381 6382
其中 6379爲master
我這裏已經啓動好了4個實例redis
在這裏插入圖片描述

  • 2 開始配置sentinel
    我這裏準備啓動3個 sentinel ,被監控的master下線後需要2個sentinel主觀下線,被選舉的sentinel纔會執行故障轉移

在這裏插入圖片描述

  • 啓動sentinel
    redis-sentinel redis-sentinel.conf
    可以看到我這裏 已經啓動起來了
    在這裏插入圖片描述

  • 查看一下16379 sentinel實例的配置文件

在這裏插入圖片描述

  • 這裏說一下啓動sentinel之後出現的配置
    sentinel config-epoch mymaster 18 ###確認mymater SDOWN時長
    sentinel leader-epoch mymaster 18 ###同時一時間最多18個slave可同時更新配置,建議數字不要太大,以免影響正常對外提供服務
    sentinel known-slave mymaster 127.0.0.1 6380 ###已知的slave 地址
    sentinel known-slave mymaster 127.0.0.1 6381 ###已知的slave 地址
    sentinel known-slave mymaster 127.0.0.1 6382 ###已知的slave 地址
    sentinel known-sentinel mymaster 127.0.0.1 16380 be964e6330ee1eaa9a6b5a97417e866448c0ae40 ###已知sentinel的唯一id
    sentinel known-sentinel mymaster 127.0.0.1 16381 3e468037d5dda0bbd86adc3e47b29c04f2afe9e6 ###已知sentinel的唯一id
    sentinel current-epoch 18 ####當前可同時同步的salve數最大同步閥值

  • 我們看一下主從的信息
    現在我們可以看到 port6379 是master,我們手動殺了它,看看sentinel會不會給我們切換master,以及別的slave的 master指向改變了沒有

在這裏插入圖片描述

  • kill - 9 進程PID
  • 這裏我們需要等待60秒,因爲配置文件那裏sentinel down-after-milliseconds mymaster 60000 此時
    我們可以再 port16379上 看到master以及被替換了
    在這裏插入圖片描述

在這裏插入圖片描述

到此實驗算是成功了 休息一下眼睛 如上述有出現問題還請指出,可以及時更正,感激不盡

發佈了50 篇原創文章 · 獲贊 9 · 訪問量 3440
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章