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以及被替換了
到此實驗算是成功了 休息一下眼睛 如上述有出現問題還請指出,可以及時更正,感激不盡