部署和安裝
上一節(jié)介紹了Redis Sentinel的基本架構扮饶,本節(jié)將介紹如何安裝和部署Redis Sentinel。
-
部署拓撲結構
下面將以3個Sentinel節(jié)點贞让、1個主節(jié)點周崭、2個從節(jié)點組成一個Redis Sentinel進行說明,拓撲結構如下圖:
2019-05-03-12-26-03.png具體的物理部署如下表:
角色 ip port 別名(為了后文中方便) master 127.0.0.1 6379 主節(jié)點或者6379節(jié)點 slave-1 127.0.0.1 6380 slave-1節(jié)點或者6380節(jié)點 slave-2 127.0.0.1 6381 slave-2節(jié)點或者6381節(jié)點 sentinel-1 127.0.0.1 26379 sentinel-1節(jié)點或者26379節(jié)點 sentinel-2 127.0.0.1 26380 sentinel-2節(jié)點或者26380節(jié)點 sentinel-3 127.0.0.1 26381 sentinel-3節(jié)點或者26381節(jié)點 -
部署Redis數(shù)據(jù)節(jié)點
上節(jié)提到過喳张,Redis Sentinel中Redis數(shù)據(jù)節(jié)點沒有做任何特殊配置续镇,按照之前章節(jié)介紹的方法啟動就可以,下面以一個比較簡單的配置進行說明蹲姐。
-
啟動主節(jié)點
配置:
redis-6379.conf port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/opt/soft/redis/data/"
啟動主節(jié)點:
redis-server redis-6379.conf
確認是否啟動磨取。一般來說只需要ping命令檢測一下就可以,確認Redis數(shù)據(jù)節(jié)點是否已經啟動柴墩。
$ redis-cli -h 127.0.0.1 -p 6379 ping PONG
-
啟動兩個從節(jié)點
配置:
兩個從節(jié)點的配置是完全一樣的忙厌,下面以一個從節(jié)點為例子進行說明,和主節(jié)點的配置不一樣的是添加了slaveof配置江咳。
redis-6380.conf port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/opt/soft/redis/data/" slaveof 127.0.0.1 6379
啟動主節(jié)點:
redis-server redis-6380.conf redis-server redis-6381.conf
驗證:
$ redis-cli -h 127.0.0.1 -p 6380 ping PONG $ redis-cli -h 127.0.0.1 -p 6381 ping PONG
-
確認主從關系
主節(jié)點視角逢净,它有兩個從節(jié)點,分別是127.0.0.1:6380和127.0.0.1:6381:
$ redis-cli -h 127.0.0.1 -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=281,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=281,lag=0
從節(jié)點的視角歼指,它的主節(jié)點是127.0.0.1:6379:
$ redis-cli -h 127.0.0.1 -p 6379 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up ....................
-
-
部署Sentinel節(jié)點
3個Sentinel節(jié)點的部署方法是完全一致的(端口不同)爹土,下面以sentinel-1節(jié)點的部署為例進行說明。
-
配置Sentinel節(jié)點
redis-sentinel-26379.conf port 26379 daemonize yes logfile "26379.log" dir /opt/soft/redis/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-millisenconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
1)Sentinel節(jié)點的默認端口是26379.
2)sentinel monitor mymaster 127.0.0.1 6379 2 配置代表sentinel-1節(jié)點需要監(jiān)控127.0.0.1:6379這個主節(jié)點踩身,2代表判斷主節(jié)點失敗至少需要2個Sentinel節(jié)點同意胀茵,mymaster是主節(jié)點的別名,其余Sentinel配置將在下一節(jié)進行詳細說明挟阻。
-
啟動Sentinel節(jié)點
Sentinel節(jié)點的啟動方法有兩種:
方法一琼娘,使用redis-sentinel命令:
redis-sentinel redis-sentinel-26379.conf
方法二,使用redis-server命令加--sentinel參數(shù):
redis-server redis-sentinel-26379.conf --sentinel
兩種方法本質上是一樣的附鸽。
-
確認
Sentinel節(jié)點本質上是一個特殊的節(jié)點脱拼,所以也可以通過info命令來查詢它的相關信息,從下面info的Sentinel片段來看坷备,Sentinel節(jié)點找到了主節(jié)點127.0.0.1:6379熄浓,發(fā)現(xiàn)了它的兩個從節(jié)點,同時發(fā)現(xiàn)Redis Sentinel一共有3個Sentinel節(jié)點省撑。這里只需要了解Sentinel節(jié)點能夠彼此感知到對方赌蔑,同時能夠感知到Redis數(shù)據(jù)節(jié)點就可以了:
$ redis-cli -h 127.0.0.1 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_titl:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinel=3
至此Redis Sentinel已經搭建起來了,整體上還是比較容易的竟秫,但是有2點需要強調一下:
1)生產環(huán)境中建議Redis Sentinel的所有節(jié)點應該分布在不同的物理機上娃惯。
2)Redis Sentinel中的數(shù)據(jù)節(jié)點和普通的Redis數(shù)據(jù)節(jié)點在配置上沒有任何區(qū)別,只不過是添加了一些Sentinel節(jié)點對它們進行監(jiān)控鸿摇。
-
配置優(yōu)化
了解每個配置的含義有助于更加合理地使用Redis Sentinel,一次本節(jié)將對每個配置的使用和優(yōu)化進行詳細介紹劈猿。Redis安裝目錄下有一個sentinel.conf拙吉,是默認的Sentinel節(jié)點配置文件潮孽,下面就以它作為例子進行說明。
-
配置說明和優(yōu)化
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節(jié)點的端口和工作目錄筷黔,下面重點對sentinel相關配置進行詳細說明往史。
-
sentinel monitor
配置如下:
sentinel monitor <master-name> <ip> <port> <quorum>
Sentinel節(jié)點會定期監(jiān)控主節(jié)點,所以從配置上必然也會有所體現(xiàn)佛舱,本配置說明Sentinel節(jié)點要監(jiān)控的是一個名字叫做<master-name>椎例,ip地址和端口為<ip> <port>的主節(jié)點。<quorum>代表要判定主節(jié)點最終不可達所需要的票數(shù)请祖。但實際上Sentinel節(jié)點會對所有節(jié)點進行監(jiān)控订歪,但是在Sentinel節(jié)點的配置中沒有看到有關從節(jié)點和其余Sentinel節(jié)點的配置,那是因為Sentinel節(jié)點會從主節(jié)點中獲取有關從節(jié)點以及其余Sentinel節(jié)點的相關信息肆捕。
當所有節(jié)點啟動后刷晋,配置文件中的內容發(fā)生了變化,體現(xiàn)在三個方面:
Sentinel節(jié)點自動發(fā)現(xiàn)了從節(jié)點慎陵、其余Sentinel節(jié)點眼虱。
去掉了默認配置,例如parallel-syncs席纽、failover-timeout參數(shù)捏悬。
添加了配置紀元相關參數(shù)。
<quorum>參數(shù)用于故障發(fā)現(xiàn)和判定润梯,例如將quorum配置為2过牙,代表至少有2個Sentinel節(jié)點認為主節(jié)點不可達,那么這個不可達的判定才是客觀的仆救。對于<quorum>設置的越小抒和,那么達到下線的條件越寬松,反之越嚴格彤蔽。一般建議將其設置為Sentinel節(jié)點一半加一摧莽。
同時<quorum>還與Sentinel節(jié)點的領導者選舉有關,至少要有max(quorum, num(sentinels)/2 + 1)個Sentinel節(jié)點參與選舉顿痪,才能選出領導者Sentinel镊辕,從而完成故障轉移。例如有5個Sentinel節(jié)點蚁袭,quorum=4征懈,那么至少要有max(quorum, num(sentinels)/ 2 + 1)=4個在線Sentinel節(jié)點才可以進行領導者選舉。
-
sentinel down-after-milliseconds
配置如下:
sentinel down-after-milliseconds <master-name> <times>
每個Sentinel節(jié)點都要通過定期發(fā)送ping命令來判斷Redis數(shù)據(jù)節(jié)點和其余Sentinel節(jié)點是否可達揩悄,如果超過了down-after-milliseconds配置的時間且沒有有效地回復卖哎,則判定頂節(jié)點不可達,<times>(單位為毫秒)就是超時時間。這個配置是對節(jié)點時便判定的重要依據(jù)亏娜。
優(yōu)化說明:down-after-milliseconds越大焕窝,代表Sentinel節(jié)點對于節(jié)點不可達的條件越寬松,反之越嚴格维贺。條件寬松有可能帶來的問題是節(jié)點確實不可達了它掂,那么應用方需要等待故障轉移的時間越長,也就意味著應用方故障時間可能越長溯泣。條件嚴格雖然可以及時發(fā)現(xiàn)故障完成故障轉移虐秋,但是也存在一定的誤判率。
-
-
sentinel parallel-syncs
配置如下:
sentinel parallel-syncs <master-name> <nums>
當Sentinel節(jié)點集合對主節(jié)點故障判定達成一致時垃沦,Sentinel領導者節(jié)點會做故障轉移操作客给,選出新的主節(jié)點,原來的從節(jié)點會向新的主節(jié)點發(fā)起的復制操作栏尚,parallel-syncs就是用來限制在一次故障轉移之后起愈,每次向新的主節(jié)點發(fā)起復制操作的從節(jié)點個數(shù)。如果這個參數(shù)配置的比較大译仗,那么多個從節(jié)點會向新的主節(jié)點同時發(fā)起復制操作抬虽,盡管復制操作通常不會阻塞主節(jié)點,但是同時向主節(jié)點發(fā)起復制纵菌,必然會對主節(jié)點所在的機器造成一定的網絡和磁盤IO開銷阐污。
-
sentinel failover-timeout
配置如下:
sentinel failover-timeout <master-name> <times>
failover-timeout通常被解釋成故障轉移超時時間,但實際上它作用于故障轉移的各個階段:
a)選出合適從節(jié)點咱圆。
b)晉升選出的從節(jié)點為主節(jié)點笛辟。
c)命令其余從節(jié)點復制新的主節(jié)點。
d)等待原主機點恢復后命令它去復制新的主節(jié)點序苏。failover-timeout的作用具體體現(xiàn)在四個方面:
1)如果Redis Sentinel對一個主節(jié)點故障轉移失敗手幢,那么下次再對該主節(jié)點做故障轉移的起始時間是failover-timeout的2倍。
2)在b)階段是忱详,如果Sentinel節(jié)點向a)階段選出來的從節(jié)點執(zhí)行slaveof no one一直失斘Ю础(例如該從節(jié)點此時出現(xiàn)故障),當此過程超過failover-timeout是匈睁,則故障轉移失敗监透。
3)在b階段如果執(zhí)行成功,Sentinel節(jié)點還會執(zhí)行info命令來確認a)階段選出來的階段確實晉升為主節(jié)點航唆,如果此過程執(zhí)行時間超過failover-timeout是胀蛮,則故障轉移失敗。
4)在c)階段執(zhí)行時間超過了failover-timeout(不包含復制時間)糯钙,則故障轉移失敗粪狼。注意即使超過了這個時間退腥,Sentinel節(jié)點也會最終配置從節(jié)點去同步最新的主節(jié)點。
-
sentinel auth-pass
配置如下:
sentinel auth-pass <master-name> <password>
如果Sentinel監(jiān)控的主節(jié)點配置了密碼再榄,sentinel auth-pass配置通過添加主節(jié)點的密碼阅虫,防止Sentinel節(jié)點對主節(jié)點無法監(jiān)控。
-
sentinel notification-script
配置如下:
sentinel notification-script <master-name> <script-path>
sentinel notification-script的作用是在故障轉移期間不跟,當一些警告級別的Sentinel時間發(fā)生(指重要事件,例如-sdown:客觀下線米碰、-odown:主觀下線)時窝革,會觸發(fā)對應路徑的腳本,并向腳本發(fā)送相應的事件參數(shù)吕座。
-
sentinel client-reconfig-script
配置如下:
sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script的作用是在故障轉移結束后虐译,會觸發(fā)對應路徑的腳本,并向腳本發(fā)送故障轉移結果的相關參數(shù)吴趴。和notification-script類似漆诽,可以在/opt/redis/scripts/下配置client-reconfig.sh,該腳本會接收每個Sentinel節(jié)點傳過來的故障轉移結果參數(shù)锣枝,并觸發(fā)類似短信和郵件報警:
#!/bin/sh # 獲取所有參數(shù) msg=$* # 報警腳本或者接口厢拭,將msg作為參數(shù) exit 0
如果需要該功能,就可以在Sentinel節(jié)點添加如下配置(<master-name>=mymaster):
sentinel client-reconfig-script mymaster /opt/redis/scripts/client-reconfig.sh
當故障轉移結束撇叁,每個Sentinel節(jié)點會將故障轉移的結果發(fā)送給對應的腳本供鸠,具體參數(shù)如下:
<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
- < master-name >:主節(jié)點名。
- < role >:Sentinel節(jié)點的角色陨闹,分別是leader和observer楞捂,leader代表當前Sentinel節(jié)點是領導者,是它進行的故障轉移趋厉;observer是其余Sentinel節(jié)點寨闹。
- < from-ip >:原主節(jié)點的ip地址。
- < from-port >:原主節(jié)點的端口君账。
- < to-ip >:新主節(jié)點的ip地址繁堡。
- < to-port >:新主節(jié)點的端口。
有關sentinel notification-script和sentinel client-reconfig-script有幾點需要注意:
- < script-path > 必須有可執(zhí)行權限杈绸。
- < script-path > 開頭必須包含shell腳本頭(例如#!/bin/sh)帖蔓,否則時間發(fā)生時Redis將無法執(zhí)行腳本產生錯誤。
- Redis規(guī)定腳本的最大執(zhí)行時間不能超過60秒瞳脓,超過后腳本將被殺掉塑娇。
- 如果shell腳本以exit 1結束,那么腳本稍后重試執(zhí)行劫侧。如果以exit 2或者更高的值結束埋酬,那么腳本不會重試哨啃。正常返回值是exit 0.
- 如果需要運維的Redis Sentinel比較多,建議不要使用這種腳本的形式來進行通知写妥,這樣會增加部署的成本拳球。
-
-
如何監(jiān)控多個主節(jié)點
Redis Sentinel可以同時監(jiān)控多個主節(jié)點。配置方法也比較簡單珍特,只需要指定多個masterName來區(qū)分不同的主節(jié)點即可祝峻。
-
調整位置
和普通的Redis數(shù)據(jù)節(jié)點一樣,Sentinel節(jié)點也支持動態(tài)地設置參數(shù)扎筒,而且和普通的Redis數(shù)據(jù)節(jié)點一樣并不是支持所有的參數(shù)莱找,具體使用方法如下:
sentinel set <param> <value>
參數(shù) 使用方法 quorum sentinel set mymaster quorum2 down-after-milliseconds sentinel set mymaster down-after-milliseconds 30000 failover-timeout sentinel set mymaster failover-timeout 360000 parallel-syncs sentinel set mymaster parallel-syncs 2 notification-script sentinel set mymaster notification-script /opt/xx.sh client-reconfig-script sentinel set mymaster client-reconfig-script /opt/yy.sh auth-pass sentinel set mymaster auth-pass masterPassword 有幾點需要注意一下:
1)sentinel set命令只對當前Sentinel節(jié)點有效。
2)sentinel set命令如執(zhí)行成功會立即刷新配置文件嗜桌,這點和Redis普通數(shù)據(jù)節(jié)點設置配置需要執(zhí)行config rewrite刷新到配置文件不同奥溺。
3)建議所有Sentinel節(jié)點的配置盡可能一致,這樣在故障發(fā)現(xiàn)和轉移時比較容易達成一致骨宠。
4)上表為sentinel set支持的參數(shù)浮定,具體可以參考源碼中的sentinel.c的sentinelSetCommand函數(shù)。
5)Sentinel對外不支持config命令层亿。
-
-
部署技巧
到現(xiàn)在有關Redis Sentinel的配置和部署方法相信讀者已經基本掌握了桦卒,但在實際生產環(huán)境中都有哪些部署的技巧?本節(jié)總結一下匿又。
1)Sentinel節(jié)點不應該部署在一臺物理“機器”上闸盔。
這里特意強調物理機是因為一臺物理機做成了若干虛擬機或者現(xiàn)今比較流行的容器,它們雖然有不同的IP地址琳省,但實際上它們都是同一臺物理機迎吵,同一臺物理機意味著如果這臺機器有什么硬件故障,所有的虛擬機都會受到影響针贬,為了實現(xiàn)Sentinel節(jié)點集合真正的高可用击费,請勿將Sentinel節(jié)點部署在同一臺物理機器上。
2)部署至少三個且奇數(shù)個的Sentinel節(jié)點桦他。
3)3個以上時通過增加Sentinel節(jié)點的個數(shù)提高對于故障判定的準確性蔫巩,因為領導者選舉需要至少一半加1個節(jié)點,奇數(shù)個節(jié)點可以在滿足該條件的基礎上節(jié)省一個節(jié)點快压。
4)只有一套Sentinel圆仔,還是每個主節(jié)點配置一套Sentinel?
方案一:一套Sentinel蔫劣,很明顯這種方案在一定程度上降低了維護成本坪郭,因為只需要維護固定個數(shù)的Sentinel節(jié)點,集中對多個Redis數(shù)據(jù)節(jié)點進行管理就可以了脉幢。但是這同時也是它的缺點歪沃,如果這套Sentinel節(jié)點集合出現(xiàn)異常嗦锐,可能會對多個Redis數(shù)據(jù)節(jié)點造成影響。還有如果監(jiān)控的Redis數(shù)據(jù)節(jié)點較多沪曙,會造成Sentinel節(jié)點產生過多的網絡連接奕污,也會有一定的影響。
方案二:多套Sentinel液走,顯然這種方案的優(yōu)點和缺點和上面的相反,每個Redis主節(jié)點都有自己的Sentinel節(jié)點集合 磅崭,會造成資源浪費瓦哎。但是優(yōu)點也很明顯割岛,每套Redis Sentinel都是彼此隔離的。
運維提示:如果Sentinel節(jié)點集合監(jiān)控的是同一個業(yè)務的多個主節(jié)點集合,那么使用方案一、否則一般建議采用方案二较性。