Redis Sentinel 介紹與部署
1. Sentinel介紹
1.1 主從復(fù)制的問題
Redis主從復(fù)制可將主節(jié)點(diǎn)數(shù)據(jù)同步給從節(jié)點(diǎn),從節(jié)點(diǎn)此時(shí)有兩個(gè)作用:
一旦主節(jié)點(diǎn)宕機(jī)正卧,從節(jié)點(diǎn)作為主節(jié)點(diǎn)的備份可以隨時(shí)頂上來迅皇。
擴(kuò)展主節(jié)點(diǎn)的讀能力榴徐,分擔(dān)主節(jié)點(diǎn)讀壓力技掏。
但是問題來了:
一旦主節(jié)點(diǎn)宕機(jī)署恍,從節(jié)點(diǎn)晉升成主節(jié)點(diǎn)隔显,同時(shí)需要修改應(yīng)用方的主節(jié)點(diǎn)地址却妨,還需要命令所有從節(jié)點(diǎn)去復(fù)制新的主節(jié)點(diǎn),整個(gè)過程需要人工干預(yù)括眠。
主節(jié)點(diǎn)的寫能力受到單機(jī)的限制彪标。
主節(jié)點(diǎn)的存儲(chǔ)能力受到單機(jī)的限制。
第一個(gè)問題掷豺,我們接下來講的Sentinel就可以解決捞烟。而后兩個(gè)問題,Redis也給出了方案Redis Cluster当船。
1.2 Redis Sentinel的高可用
Redis Sentinel是一個(gè)分布式架構(gòu)题画,包含若干個(gè)Sentinel節(jié)點(diǎn)和Redis數(shù)據(jù)節(jié)點(diǎn),每個(gè)Sentinel節(jié)點(diǎn)會(huì)對數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)進(jìn)行監(jiān)控德频,當(dāng)發(fā)現(xiàn)節(jié)點(diǎn)不可達(dá)時(shí)苍息,會(huì)對節(jié)點(diǎn)做下線標(biāo)識。
如果被標(biāo)識的是主節(jié)點(diǎn),他還會(huì)選擇和其他Sentinel節(jié)點(diǎn)進(jìn)行“協(xié)商”竞思,當(dāng)大多數(shù)的Sentinel節(jié)點(diǎn)都認(rèn)為主節(jié)點(diǎn)不可達(dá)時(shí)表谊,他們會(huì)選舉出一個(gè)Sentinel節(jié)點(diǎn)來完成自動(dòng)故障轉(zhuǎn)移工作,同時(shí)將這個(gè)變化通知給Redis應(yīng)用方盖喷。
接下來我們就通過部署一個(gè)Redis Sentinel實(shí)例來了解整體框架爆办。
2. Redis Sentinel部署
我們部署的拓?fù)浣Y(jié)構(gòu)如圖所示:
分別有3個(gè)Sentinel節(jié)點(diǎn),1個(gè)主節(jié)點(diǎn)课梳,2個(gè)從節(jié)點(diǎn)組成一個(gè)Redis Sentinel距辆。
roleIPport
master127.0.0.16379
slave1127.0.0.16380
slave2127.0.0.16381
Sentinel1127.0.0.126379
Sentinel2127.0.0.126380
Sentinel3127.0.0.126381
2.1 啟動(dòng)主節(jié)點(diǎn)
配置:
port 6379daemonize yes
logfile "6379.log"dbfilename "dump-6379.rdb"dir "/var/redis/data/"
啟動(dòng)主節(jié)點(diǎn)
?? sudo redis-server redis-6379.conf
使用PING命令檢測是否啟動(dòng)
?? redis-cli -h 127.0.0.1 -p 6379 ping
PONG
2.2 啟動(dòng)兩個(gè)從節(jié)點(diǎn)
配置(兩個(gè)從節(jié)點(diǎn)配置相同,除了文件名有區(qū)分)
port 6380daemonize yes
logfile "6380.log"dbfilename "dump-6380.rdb"dir "/var/redis/data/"
slaveof 127.0.0.1 6379? ? ? // 從屬主節(jié)點(diǎn)
啟動(dòng)兩個(gè)從節(jié)點(diǎn)
?? sudo redis-server redis-6380.conf
?? sudo redis-server redis-6381.conf
使用PING命令檢測是否啟動(dòng)
?? redis-cli -h 127.0.0.1 -p 6380 ping
PONG
?? redis-cli -h 127.0.0.1 -p 6381 ping
PONG
主節(jié)點(diǎn)視角
?? redis-cli -h 127.0.0.1 -p 6379 INFO replication# Replicationrole:master
connected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=0slave1:ip=127.0.0.1,port=6381,state=online,offset=85,lag=0......
從節(jié)點(diǎn)視角(6380端口)
?? redis-cli -h 127.0.0.1 -p 6380 INFO replication# Replicationrole:slave
master_host:127.0.0.1master_port:6379master_link_status:up
......
確立中從關(guān)系暮刃,如下圖所示:
2.4 部署Sentinel節(jié)點(diǎn)
3個(gè)Sentinel節(jié)點(diǎn)的部署方法是相同的(端口不同)挑格。以26379為例。
配置
// Sentinel節(jié)點(diǎn)的端口port 26379?
dir /var/redis/data/
logfile "26379.log"http:// 當(dāng)前Sentinel節(jié)點(diǎn)監(jiān)控 127.0.0.1:6379 這個(gè)主節(jié)點(diǎn)// 2代表判斷主節(jié)點(diǎn)失敗至少需要2個(gè)Sentinel節(jié)點(diǎn)節(jié)點(diǎn)同意// mymaster是主節(jié)點(diǎn)的別名sentinel monitor mymaster 127.0.0.1 6379 2//每個(gè)Sentinel節(jié)點(diǎn)都要定期PING命令來判斷Redis數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)是否可達(dá)沾歪,如果超過30000毫秒且沒有回復(fù),則判定不可達(dá)sentinel down-after-milliseconds mymaster 30000//當(dāng)Sentinel節(jié)點(diǎn)集合對主節(jié)點(diǎn)故障判定達(dá)成一致時(shí)雾消,Sentinel領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作灾搏,選出新的主節(jié)點(diǎn),原來的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作立润,限制每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù)為1sentinel parallel-syncs mymaster 1//故障轉(zhuǎn)移超時(shí)時(shí)間為180000毫秒sentinel failover-timeout mymaster 180000
啟動(dòng)(兩種方法)?
redis-sentinel sentinel-26379.conf
redis-server sentinel-26379.conf --sentinel
sudo redis-sentinel sentinel-26379.conf --sentinel
確認(rèn)
?? redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1 //sentinels=1表示啟動(dòng)了1個(gè)Sentinel
部署三個(gè)Sentinel節(jié)點(diǎn)之后狂窑,真?zhèn)€拓?fù)浣Y(jié)構(gòu)如圖所示:
當(dāng)部署號Redis Sentinel之后,會(huì)有如下變化?
Sentinel節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)了從節(jié)點(diǎn)桑腮、其余Sentinel節(jié)點(diǎn)泉哈。
去掉了默認(rèn)配置,例如:parallel-syncs破讨、failover-timeout丛晦。
新添加了紀(jì)元(epoch)參數(shù)。
我們拿端口26379的舉例提陶,啟動(dòng)所有的Sentinel和數(shù)據(jù)節(jié)點(diǎn)后烫沙,配置文件如下:
port 26379dir "/var/redis/data"sentinel myid 70a3e215c1a34b4d9925d170d9606e615a8874f2
sentinel monitor mymaster 127.0.0.1 6379 2sentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0daemonize yes
logfile "26379.log"http:// 發(fā)現(xiàn)了兩個(gè)從節(jié)點(diǎn)sentinel known-slave mymaster 127.0.0.1 6381sentinel known-slave mymaster 127.0.0.1 6380// 發(fā)送了連個(gè)Sentinel節(jié)點(diǎn)sentinel known-sentinel mymaster 127.0.0.1 26381 e1148ad6caf60302dd6d0dbd693cb3448e209ac2
sentinel known-sentinel mymaster 127.0.0.1 26380 39db5b040b21a52da5334dd2d798244c034b4fc3
sentinel current-epoch
2.5 故障轉(zhuǎn)移實(shí)驗(yàn)
先查看一下節(jié)點(diǎn)的進(jìn)程pid
?? ps -aux | grep redis
root? ? 18225? 0.1? 0.0? 40208 11212 ?? ? ? ? Ssl? 22:10? 0:05 redis-server 127.0.0.1:6379root? ? 18234? 0.0? 0.0? 38160? 8364 ?? ? ? ? Ssl? 22:10? 0:04 redis-server 127.0.0.1:6380root? ? 18244? 0.0? 0.0? 38160? 8308 ?? ? ? ? Ssl? 22:10? 0:04 redis-server 127.0.0.1:6381root? ? 20568? 0.1? 0.0? 38160? 8460 ?? ? ? ? Ssl? 23:05? 0:02 redis-sentinel *:26379 [sentinel]
root? ? 20655? 0.1? 0.0? 38160? 8296 ?? ? ? ? Ssl? 23:07? 0:02 redis-sentinel *:26380 [sentinel]
root? ? 20664? 0.1? 0.0? 38160? 8312 ?? ? ? ? Ssl? 23:07? 0:02 redis-sentinel *:26381 [sentinel
?? sudo kill -9 18225?? ps -aux | grep redis
root? ? 18234? 0.0? 0.0? 38160? 8364 ?? ? ? ? Ssl? 22:10? 0:05 redis-server 127.0.0.1:6380root? ? 18244? 0.0? 0.0? 38160? 8308 ?? ? ? ? Ssl? 22:10? 0:05 redis-server 127.0.0.1:6381root? ? 20568? 0.1? 0.0? 38160? 8460 ?? ? ? ? Ssl? 23:05? 0:03 redis-sentinel *:26379 [sentinel]
root? ? 20655? 0.1? 0.0? 38160? 8296 ?? ? ? ? Ssl? 23:07? 0:03 redis-sentinel *:26380 [sentinel]
root? ? 20664? 0.1? 0.0? 38160? 8312 ?? ? ? ? Ssl? 23:07? 0:03 redis-sentinel *:26381 [sentinel]
此時(shí),Redis Sentinel對主節(jié)點(diǎn)進(jìn)行客觀下線(Objectively Down隙笆, 簡稱 ODOWN)的判斷锌蓄,確認(rèn)主節(jié)點(diǎn)不可達(dá),則通知從節(jié)點(diǎn)中止復(fù)制主節(jié)點(diǎn)的操作撑柔。
當(dāng)主節(jié)點(diǎn)下線時(shí)長超過配置的下線時(shí)長30000秒瘸爽,Redis Sentinel執(zhí)行故障轉(zhuǎn)移操作。
此時(shí)铅忿,我們查看一下Sentinel節(jié)點(diǎn)監(jiān)控的主節(jié)點(diǎn)信息:
127.0.0.1:26379> sentinel masters 1)? 1) "name"? ? 2) "mymaster"? ? 3) "ip"? ? 4) "127.0.0.1"? ? 5) "port"? ? 6) "6380"? ? ? ? ? //可以看到主節(jié)點(diǎn)已經(jīng)成為6380端口的節(jié)點(diǎn)? ? 7) "runid"? ? 8) "084850ab4ff6c2f2502b185c8eab5bdd25a26ce2"? ? 9) "flags"? 10) "master"? ? ..............
看一下Sentinel節(jié)點(diǎn)監(jiān)控的從節(jié)點(diǎn)信息:
127.0.0.1:26379> sentinel slaves mymaster1)? 1) "name"? ? 2) "127.0.0.1:6379"? ? ? ? ? ? //ip:port? ? 3) "ip"? ? 4) "127.0.0.1"? ? 5) "port"? ? 6) "6379"? ? 7) "runid"? ? 8) ""? ? 9) "flags"? 10) "s_down,slave,disconnected"? //端口6379的原主節(jié)點(diǎn)已經(jīng)斷開了連接? ..............2)? 1) "name"? ? 2) "127.0.0.1:6381"? ? ? ? ? ?
? ? 3) "ip"? ? 4) "127.0.0.1"? ? 5) "port"? ? 6) "6381"? ? 7) "runid"? ? 8) "24495fe180e4fd64ac47467e0b2652894406e9e4"? ? 9) "flags"? 10) "slave"? ? ? ? ? ? ? ? ? ? ? //本來的從節(jié)點(diǎn)剪决,還是從節(jié)點(diǎn)的role? ? ..............
由以上信息可得,端口為6380的Redis數(shù)據(jù)節(jié)點(diǎn)成為新的主節(jié)點(diǎn),端口為6379的舊主節(jié)點(diǎn)斷開連接昼捍。如圖所示:
我們在試著重啟端口6379的數(shù)據(jù)節(jié)點(diǎn)识虚。
?? sudo redis-server redis-6379.conf
?? ps -aux | grep redis? ? ? ? ? ? ?
root? ? 18234? 0.1? 0.0? 40208 11392 ?? ? ? ? Ssl? 5月22? 0:06 redis-server 127.0.0.1:6380root? ? 18244? 0.1? 0.0? 40208 10356 ?? ? ? ? Ssl? 5月22? 0:07 redis-server 127.0.0.1:6381root? ? 20568? 0.1? 0.0? 38160? 8460 ?? ? ? ? Ssl? 5月22? 0:05 redis-sentinel *:26379 [sentinel]
root? ? 20655? 0.1? 0.0? 38160? 8296 ?? ? ? ? Ssl? 5月22? 0:05 redis-sentinel *:26380 [sentinel]
root? ? 20664? 0.1? 0.0? 38160? 8312 ?? ? ? ? Ssl? 5月22? 0:05 redis-sentinel *:26381 [sentinel]
menwen? 22475? 0.0? 0.0? 14216? 5920 pts/2? ? S+? 5月22? 0:00 redis-cli -p 26379// 6379的數(shù)據(jù)節(jié)點(diǎn)已重啟root? ? 22617? 0.0? 0.0? 38160? 8304 ?? ? ? ? Ssl? 00:00? 0:00 redis-server 127.0.0.1:6379?
看看發(fā)生什么:
127.0.0.1:26379> sentinel slaves mymaster1)? 1) "name"? ? 2) "127.0.0.1:6379"? ? //6379端口的節(jié)點(diǎn)重啟后,變成了"活"的從節(jié)點(diǎn)? ? 3) "ip"? ? 4) "127.0.0.1"? ? 5) "port"? ? 6) "6379"? ? 7) "runid"? ? 8) "de1b5c28483cf150d9550f8e338886706e952346"? ? 9) "flags"? 10) "slave"? ? ..............2)? 1) "name"? ? ? ? ? ? ? //6381端口的節(jié)點(diǎn)沒有變化妒茬,仍是從節(jié)點(diǎn)? ? 2) "127.0.0.1:6381"? ? ..............
他被降級成為端口6380的從節(jié)點(diǎn)担锤。
從上面的邏輯架構(gòu)和故障轉(zhuǎn)移試驗(yàn)中,可以看出Redis Sentinel的以下幾個(gè)功能乍钻。
監(jiān)控:Sentinel節(jié)點(diǎn)會(huì)定期檢測Redis數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)是否可達(dá)肛循。
通知:Sentinel節(jié)點(diǎn)會(huì)將故障轉(zhuǎn)移通知給應(yīng)用方。
主節(jié)點(diǎn)故障轉(zhuǎn)移:實(shí)現(xiàn)從節(jié)點(diǎn)晉升為主節(jié)點(diǎn)并維護(hù)后續(xù)正確的主從關(guān)系银择。
配置提供者:在Redis Sentinel結(jié)構(gòu)中多糠,客戶端在初始化的時(shí)候連接的是Sentinel節(jié)點(diǎn)集合,從中獲取主節(jié)點(diǎn)信息浩考。
3. Sentinel配置說明
sentinel monitor mymaster 127.0.0.1 6379 2
當(dāng)前Sentinel節(jié)點(diǎn)監(jiān)控 127.0.0.1:6379 這個(gè)主節(jié)點(diǎn)
2代表判斷主節(jié)點(diǎn)失敗至少需要2個(gè)Sentinel節(jié)點(diǎn)節(jié)點(diǎn)同意
mymaster是主節(jié)點(diǎn)的別名
sentinel down-after-milliseconds mymaster 30000
每個(gè)Sentinel節(jié)點(diǎn)都要定期PING命令來判斷Redis數(shù)據(jù)節(jié)點(diǎn)和其余Sentinel節(jié)點(diǎn)是否可達(dá)夹孔,如果超過30000毫秒且沒有回復(fù),則判定不可達(dá)
sentinel parallel-syncs mymaster 1
當(dāng)Sentinel節(jié)點(diǎn)集合對主節(jié)點(diǎn)故障判定達(dá)成一致時(shí)析孽,Sentinel領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作搭伤,選出新的主節(jié)點(diǎn),原來的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作袜瞬,限制每次向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作的從節(jié)點(diǎn)個(gè)數(shù)為1怜俐。
sentinel failover-timeout mymaster 180000
故障轉(zhuǎn)移超時(shí)時(shí)間為180000
sentinel auth-pass \ \?
如果Sentinel監(jiān)控的主節(jié)點(diǎn)配置了密碼,可以通過sentinel auth-pass配置通過添加主節(jié)點(diǎn)的密碼邓尤,防止Sentinel節(jié)點(diǎn)無法對主節(jié)點(diǎn)進(jìn)行監(jiān)控拍鲤。
例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
sentinel notification-script \ \?
在故障轉(zhuǎn)移期間,當(dāng)一些警告級別的Sentinel事件發(fā)生(指重要事件汞扎,如主觀下線季稳,客觀下線等)時(shí),會(huì)觸發(fā)對應(yīng)路徑的腳本澈魄,想腳本發(fā)送相應(yīng)的事件參數(shù)绞幌。
例如:sentinel notification-script mymaster /var/redis/notify.sh
sentinel client-reconfig-script \ \?
在故障轉(zhuǎn)移結(jié)束后,觸發(fā)應(yīng)對路徑的腳本一忱,并向腳本發(fā)送故障轉(zhuǎn)移結(jié)果的參數(shù)莲蜘。
例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh。