我們一起進大廠 —— Redis實戰之哨兵模式

前言

在Redis集羣中我們講到了,主機斷開後,我們得手動設置另一個從機變成主機!這是不智能的!在實際工作中,我們都是用哨兵模式來自動切換主機。

通俗點講,就是自己去選擇‘大哥'!

一、概述

主從切換技術的方法是:當主服務器宕機後,需要手動把一臺從服務器切換爲主服務器,這就需要人工干預,費事費力,還會造成一段時間內服務不可用。這不是一種推薦的方式,更多時候,我們優先考慮 哨兵模式

Redis從2.8開始正式提供了Sentinel(哨兵) 架構來解決這個問題。

謀朝篡位 的自動版,能夠後臺監控主機是否故障,如果故障了根據投票數自動將從庫轉換爲主庫。

哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的 進程 ,作爲進程,它會獨立運行。其原理是哨兵通過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。

二、配置哨兵

1、添加哨兵配置文件 sentinel.conf

內容如下:

# sentinel monitor 被監控的名稱 host port 1 (代表自動投票選舉大哥!)
sentinel monitor myredis 127.0.0.1 6379 1
複製代碼

2、啓動哨兵

命令:

redis-sentinel dyjConfig/sentinel.conf   #和啓動Redis一致
複製代碼

啓動成功後如下圖!

3、前提準備條件:

開啓一臺主機,兩臺從機,一主二從時最基本的!

4、測試主機宕機後自動選取大哥,如果主機此時回來了,只能歸併到新的主機下,當做從機,這就是哨兵模式的規則!

等待哨兵的默認配置時間時 30 秒!

再次查看redis信息:

可以發現8381變成主機,8380依舊是從機!

我們將老大哥主機連接試試!可以發現6379變成從機了,由大哥變爲小弟!

而6381成功成爲主機大哥大!

三、總結

1、優點

①哨兵集羣,基於主從複製模式 ,所有的主從配置優點,它全有

②主從可以切換,故障可以轉移 ,系統的 可用性 就會更好

③哨兵模式就是主從模式的升級,手動到自動,更加健壯!

2、缺點

①Redis 不好在線擴容 的,集羣容量一旦到達上限,在線擴容就十分麻煩!

②實現哨兵模式的配置其實是很 麻煩 的,裏面有很多選擇!

3、注意點:以上所有的配置因爲條件所限都是基於單機集羣的前提下!有興趣的可以自己搭建下正式集羣下的多哨兵模式來監控!如下圖:

4、哨兵的配置文件解析(網上找的,只需要關注幾個重點!):

# Example sentinel.conf 

# 哨兵sentinel實例運行的端口 默認26379 
port 26379 

# 哨兵sentinel的工作目錄 
dir /tmp 

# 哨兵sentinel監控的redis主節點的 ip port 
# master-name 可以自己命名的主節點名字 只能由字母A-z、數字0-9 、這三個字符".-_"組成。 
# quorum 配置多少個sentinel哨兵統一認爲master主節點失聯 那麼這時客觀上認爲主節點失聯了 
# sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor mymaster 127.0.0.1 6379 2 

# 當在Redis實例中開啓了requirepass foobared 授權密碼 這樣所有連接Redis實例的客戶端都要提供 密碼
# 設置哨兵sentinel 連接主從的密碼 注意必須爲主從設置一樣的驗證密碼 
# sentinel auth-pass <master-name> <password> 
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd 

# 指定多少毫秒之後 主節點沒有應答哨兵sentinel 此時 哨兵主觀上認爲主節點下線 默認30秒 
# sentinel down-after-milliseconds <master-name> <milliseconds> 
sentinel down-after-milliseconds mymaster 30000 

# 這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步
#這個數字越小,完成failover所需的時間就越長,
# 但是如果這個數字越大,就意味着越 多的slave因爲replication而不可用。 
#可以通過將這個值設爲 1 來保證每次只有一個slave 處於不能處理命令請求的狀態。 
# sentinel parallel-syncs <master-name> <numslaves> 
sentinel parallel-syncs mymaster 1 


# 故障轉移的超時時間 failover-timeout 可以用在以下這些方面: 
#1. 同一個sentinel對同一個master兩次failover之間的間隔時間。 
#2. 當一個slave從一個錯誤的master那裏同步數據開始計算時間。直到slave被糾正爲向正確的master那 裏同步數據時。 
#3.當想要取消一個正在進行的failover所需要的時間。 
#4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時, slaves依然會被正確配置爲指向master,但是就不按parallel-syncs所配置的規則來了 
# 默認三分鐘 # sentinel failover-timeout <master-name> 
sentinel failover-timeout mymaster 180000 


# SCRIPTS EXECUTION #配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理員,例如當系統運行不正常時發郵件通知 相關人員。 
#對於腳本的運行結果有以下規則: 
#若腳本執行後返回1,那麼該腳本稍後將會被再次執行,重複次數目前默認爲10 #若腳本執行後返回2,或者比2更高的一個返回值,腳本將不會重複執行。 
#如果腳本在執行過程中由於收到系統中斷信號被終止了,則同返回值爲1時的行爲相同。 
#一個腳本的最大執行時間爲60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之後重新執行。 
#通知型腳本:當sentinel有任何警告級別的事件發生時(比如說redis實例的主觀失效和客觀失效等等), 將會去調用這個腳本,這時這個腳本應該通過郵件,SMS等方式去通知系統管理員關於系統不正常運行的信 息。調用該腳本時,將傳給腳本兩個參數,一個是事件的類型,一個是事件的描述。如果sentinel.conf配 置文件中配置了這個腳本路徑,那麼必須保證這個腳本存在於這個路徑,並且是可執行的,否則sentinel無 法正常啓動成功。 
#通知腳本 
# shell編程 
# sentinel notification-script <master-name> <script-path> 
sentinel notification-script mymaster /var/redis/notify.sh 


# 客戶端重新配置主節點參數腳本 
# 當一個master由於failover而發生改變時,這個腳本將會被調用,通知相關的客戶端關於master地址已 經發生改變的信息。 
# 以下參數將會在調用腳本時傳給腳本: 
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> 
# 目前<state>總是“failover”, 
# <role>是“leader”或者“observer”中的一個。 
# 參數 from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的slave)通 信的
# 這個腳本應該是通用的,能被多次調用,不是針對性的。 
# sentinel client-reconfig-script <master-name> <script-path> 
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh 
# 一般都是由運維來配置!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章