Redis開發與運維之第九章哨兵(四)--配置優化

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命令。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章