Redis安裝目錄下有一個sentinel.conf,是默認的Sentinel節點配置文件,下面就以它作爲例子進行說明。
1.配置說明和優化
port 26379
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
#sentinel auth-pass <master-name> <password>
#sentinel notification-script <master-name> <script-path>
#sentinel client-reconfig-script <master-name> <script-path>
port和dir分別代表Sentinel節點的端口和工作目錄
(1)sentinel monitor
sentinel monitor <master-name> <ip> <port> <quorum>
Sentinel節點會定期監控主節點,所以從配置上必然也會有所體現,Sentinel節點要監控的是一個名字叫做<master-name>,ip地址和端口爲<ip><port>的主節點。<quorum>代表要判定主節點最終不可達所需要的票數。但實際上Sentinel節點會對所有節點進行監控,但是在Sentinel節點配置中沒有看到有關從節點和其餘Sentinel節點的配置,那是因爲Sentinel節點會從主節點中獲取有關從節點以及其餘Sentinel節點的相關信息
例如某個Sentinel初始節點配置如下:
port 26379
daemonize yes
logfile "26379.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
當所有節點啓動後,配置文件中的內容發生了變化,體現在三個方面:
·Sentinel節點自動發現了從節點、其餘Sentinel節點。
·去掉了默認配置,例如parallel-syncs、failover-timeout參數。
·添加了配置紀元相關參數。
啓動後變化爲:
port 26379
daemonize yes
logfile "26379.log"
dir "/opt/soft/redis/data"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
#發現兩個slave節點
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
#發現兩個sentinel節點
sentinel known-sentinel mymaster 127.0.0.1 26380 282a70ff56c36ed56e8f7ee6ada741
24140d6f53
sentinel known-sentinel mymaster 127.0.0.1 26381 f714470d30a61a8e39ae031192f1fe
ae7eb5b2be
sentinel current-epoch 0
<quorum>參數用於故障發現和判定,例如將quorum配置爲2,代表至少有2個Sentinel節點認爲主節點不可達,那麼這個不可達的判定纔是客觀的。
對於<quorum>設置的越小,那麼達到下線的條件越寬鬆,反之越嚴格。一般建議將其設置爲Sentinel節點的一半加1。
同時<quorum>還與Sentinel節點的領導者選舉有關,至少要有max(quorum,num(sentinels)/2+1)個Sentinel節點參與選舉,才能選出領導者Sentinel,從而完成故障轉移。例如有5個Sentinel節點,quorum=4,那麼至少要有max(quorum,num(sentinels)/2+1)=4個在線Sentinel節點纔可以進行領導者選舉。
(2)sentinel down-after-milliseconds
配置如下:
sentinel down-after-milliseconds <master-name> <times>
每個Sentinel節點都要通過定期發送ping命令來判斷Redis數據節點和其餘Sentinel節點是否可達,如果超過了down-after-milliseconds配置的時間且沒有有效的回覆,則判定節點不可達,<times>(單位爲毫秒)就是超時時間。這個配置是對節點失敗判定的重要依據。
優化說明:down-after-milliseconds越大,代表Sentinel節點對於節點不可達的條件越寬鬆,反之越嚴格。條件寬鬆有可能帶來的問題是節點確實不可達了,那麼應用方需要等待故障轉移的時間越長,也就意味着應用方故障時間可能越長。條件嚴格雖然可以及時發現故障完成故障轉移,但是也存在一定的誤判率。
down-after-milliseconds雖然以<master-name>爲參數,但實際上對Sentinel節點、主節點、從節點的失敗判定同時有效。
(3)sentinel parallel-syncs
sentinel parallel-syncs <master-name> <nums>
當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,parallel-syncs就是用來限制在一次故障轉移之後,每次向新的主節點發起復制操作的從節點個數。如果這個參數配置的比較大,那麼多個從節點會向新的主節點同時發起複製操作,儘管複製操作通常不會阻塞主節點,但是同時向主節點發起復制,必然會對主節點所在的機器造成一定的網絡和磁盤IO開銷。圖9-17展示parallel-syncs=3和parallel-syncs=1的效果,parallelsyncs=3會同時發起複製,parallel-syncs=1時從節點會輪詢發起複製。
(4)sentinel failover-timeout
sentinel failover-timeout <master-name> <times>
failover-timeout通常被解釋成故障轉移超時時間,但實際上它作用於故障轉移的各個階段:
a)選出合適從節點。
b)晉升選出的從節點爲主節點。
c)命令其餘從節點複製新的主節點。
d)等待原主節點恢復後命令它去複製新的主節點。
failover-timeout的作用具體體現在四個方面:
1)如果Redis Sentinel對一個主節點故障轉移失敗,那麼下次再對該主節點做故障轉移的起始時間是failover-timeout的2倍。
2)在b)階段時,如果Sentinel節點向a)階段選出來的從節點執行slaveof no one一直失敗(例如該從節點此時出現故障),當此過程超過failover-timeout時,則故障轉移失敗。
3)在b)階段如果執行成功,Sentinel節點還會執行info命令來確認a)階段選出來的節點確實晉升爲主節點,如果此過程執行時間超過failovertimeout時,則故障轉移失敗。
4)如果c)階段執行時間超過了failover-timeout(不包含複製時間),則故障轉移失敗。注意即使超過了這個時間,Sentinel節點也會最終配置從節點去同步最新的主節點。
(5)sentinel auth-pass
sentinel auth-pass <master-name> <password>
如果Sentinel監控的主節點配置了密碼,sentinel auth-pass配置通過添加主節點的密碼,防止Sentinel節點對主節點無法監控。
(6)sentinel notification-script
sentinel notification-script <master-name> <script-path>
sentinel notification-script的作用是在故障轉移期間,當一些警告級別的Sentinel事件發生(指重要事件,例如-sdown:客觀下線、-odown:主觀下線)時,會觸發對應路徑的腳本,並向腳本發送相應的事件參數。
例如在/opt/redis/scripts/下配置了notification.sh,該腳本會接收每個Sentinel節點傳過來的事件參數,可以利用這些參數作爲郵件或者短信報警依據:
#!/bin/sh
#獲取所有參數
msg=$*
#報警腳本或者接口,將msg作爲參數
exit 0
如果需要該功能,就可以在Sentinel節點添加如下配置(<mastername >= mymaster)
sentinel notification-script mymaster /opt/redis/scripts/notification.sh
例如下面就是某個Sentinel節點對主節點做了主觀下線後腳本收到的參數:
(7)sentinel client-reconfig-script
sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script的作用是在故障轉移結束後,會觸發對應路徑的腳本,並向腳本發送故障轉移結果的相關參數。和notification-script類似,可以在/opt/redis/scripts/下配置了client-reconfig.sh,該腳本會接收每個Sentinel節點傳過來的故障轉移結果參數,並觸發類似短信和郵件報警:
#!/bin/sh
#獲取所有參數
msg=$*
#報警腳本或者接口,將msg作爲參數
exit 0
如果需要該功能,就可以在Sentinel節點添加如下配置(<mastername>= mymaster)
sentinel client-reconfig-script mymaster /opt/redis/scripts/client-reconfig.sh
當故障轉移結束,每個Sentinel節點會將故障轉移的結果發送給對應的腳本,具體參數如下
<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
·<master-name>:主節點名。
·<role>:Sentinel節點的角色,分別是leader和observer,leader代表當前 Sentinel節點是領導者,是它進行的故障轉移;observer是其餘Sentinel節點。
·<from-ip>:原主節點的ip地址。
·<from-port>:原主節點的端口。
·<to-ip>:新主節點的ip地址。
·<to-port>:新主節點的端口。
例如以下內容分別是三個Sentinel節點發送給腳本的,其中一個是leader,另外兩個是observer:
mymaster leader start 127.0.0.1 6379 127.0.0.1 6380
mymaster observer start 127.0.0.1 6379 127.0.0.1 6380
mymaster observer start 127.0.0.1 6379 127.0.0.1 6380
有關sentinel notification-script和sentinel client-reconfig-script有幾點需要
注意:
·<script-path>必須有可執行權限。
·<script-path>開頭必須包含shell腳本頭(例如#!/bin/sh),否則事件發
生時Redis將無法執行腳本產生如下錯誤:
-script-error /opt/sentinel/notification.sh 0 2
·Redis規定腳本的最大執行時間不能超過60秒,超過後腳本將被殺掉。
·如果shell腳本以exit 1結束,那麼腳本稍後重試執行。如果以exit 2或者更高的值結束,那麼腳本不會重試。正常返回值是exit 0。
·如果需要運維的Redis Sentinel比較多,建議不要使用這種腳本的形式來進行通知,這樣會增加部署的成本。
2.如何監控多個主節點
Redis Sentinel可以同時監控多個主節點,具體拓撲圖類似於圖9-18。
配置方法也比較簡單,只需要指定多個masterName來區分不同的主節點即可,例如下面的配置監控monitor master-business-1(10.10.xx.1:6379)和monitor master-business-2(10.10.xx.2:6379)兩個主節點:
sentinel monitor master-business-1 10.10.xx.1 6379 2
sentinel down-after-milliseconds master-business-1 60000
sentinel failover-timeout master-business-1 180000
sentinel parallel-syncs master-business-1 1
sentinel monitor master-business-2 10.16.xx.2 6380 2
sentinel down-after-milliseconds master-business-2 10000
sentinel failover-timeout master-business-2 180000
sentinel parallel-syncs master-business-2 1
3.調整配置
和普通的Redis數據節點一樣,Sentinel節點也支持動態地設置參數,而且和普通的Redis數據節點一樣並不是支持所有的參數,具體使用方法如下
sentinel set <param> <value>
sentinel set命令支持的參數
有幾點需要注意一下:
1)sentinel set命令只對當前Sentinel節點有效。
2)sentinel set命令如果執行成功會立即刷新配置文件,這點和Redis普通數據節點設置配置需要執行config rewrite刷新到配置文件不同。
3)建議所有Sentinel節點的配置儘可能一致,這樣在故障發現和轉移時比較容易達成一致。
4)表中爲sentinel set支持的參數,具體可以參考源碼中的sentinel.c的sentinelSetCommand函數。
5)Sentinel對外不支持config命令。