一.sentinel介紹
1.什么是sentinel确沸?
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案姥份,當(dāng)用Redis做Master-slave的高可用方案時(shí),假如master宕機(jī)了嚷节,Redis本身(包括它的很多客戶端)都沒(méi)有實(shí)現(xiàn)自動(dòng)進(jìn)行主備切換,而Redis-sentinel本身也是一個(gè)獨(dú)立運(yùn)行的進(jìn)程,它能監(jiān)控多個(gè)master-slave集群,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自動(dòng)切換生兆。
2.sentinel的構(gòu)造
Sentinel 是一個(gè)監(jiān)視器难捌,它可以根據(jù)被監(jiān)視實(shí)例的身份和狀態(tài)來(lái)判斷應(yīng)該執(zhí)行何種動(dòng)作膝宁。
3.sentinel的功能
1)監(jiān)控(Monitoring): Sentinel會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
2)提醒(Notification): 當(dāng)被監(jiān)控的某個(gè)Redis服務(wù)器出現(xiàn)問(wèn)題時(shí)根吁,Sentinel可以通過(guò)API向管理員或者其他應(yīng)用程序發(fā)送通知员淫。
3)自動(dòng)故障遷移(Automatic failover): 當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),Sentinel會(huì)開(kāi)始一次自動(dòng)故障遷移操作击敌,它會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器介返,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當(dāng)客戶端試圖連接失效的主服務(wù)器時(shí)沃斤,集群也會(huì)向客戶端返回新主服務(wù)器的地址圣蝎,使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
4.發(fā)現(xiàn)并連接主服務(wù)器
Sentinel通過(guò)用戶給定的配置文件來(lái)發(fā)現(xiàn)主服務(wù)器衡瓶。
Sentinel會(huì)與被監(jiān)視的主服務(wù)器創(chuàng)建兩個(gè)網(wǎng)絡(luò)連接:
命令連接
用于向主服務(wù)器發(fā)送命令徘公。
訂閱連接
用于訂閱指定的頻道,從而發(fā)現(xiàn)監(jiān)視同一主服務(wù)器的其他Sentinel哮针。
5.發(fā)現(xiàn)并連接從服務(wù)器
Sentinel通過(guò)向主服務(wù)器發(fā)送INFO命令來(lái)自動(dòng)獲得所有從服務(wù)器的地址关面。
跟主服務(wù)器一樣,Sentinel 會(huì)與每個(gè)被發(fā)現(xiàn)的從服務(wù)器創(chuàng)建命令連接和訂閱連接十厢。
6.發(fā)現(xiàn)其他sentinel
Sentinel 會(huì)通過(guò)命令連接向被監(jiān)視的主從服務(wù)器發(fā)送 “HELLO” 信息等太,該消息包含 Sentinel 的 IP、端口號(hào)蛮放、ID 等內(nèi)容缩抡,以此來(lái)向其他 Sentinel 宣告自己的存在。與此同時(shí)Sentinel 會(huì)通過(guò)訂閱連接接收其他 Sentinel 的“HELLO” 信息包颁,以此來(lái)發(fā)現(xiàn)監(jiān)視同一個(gè)主服務(wù)器的其他 Sentinel 瞻想。
1)一個(gè)Sentinel可以與其他多個(gè)Sentinel進(jìn)行連接,各個(gè)Sentinel之間可以互相檢查對(duì)方的可用性徘六,并進(jìn)行信息交換内边。你無(wú)須為運(yùn)行的每個(gè) Sentinel 分別設(shè)置其他 Sentinel 的地址,因?yàn)镾entinel可以通過(guò)發(fā)布與訂閱功能來(lái)自動(dòng)發(fā)現(xiàn)正在監(jiān)視相同主服務(wù)器的其他 Sentinel 待锈,這一功能是通過(guò)向頻道sentinel:hello發(fā)送信息來(lái)實(shí)現(xiàn)的漠其。
2)與此類似,你也不必手動(dòng)列出主服務(wù)器屬下的所有從服務(wù)器,因?yàn)?Sentinel 可以通過(guò)詢問(wèn)主服務(wù)器來(lái)獲得所有從服務(wù)器的信息和屎。每個(gè)Sentinel會(huì)以每?jī)擅胍淮蔚念l率拴驮,通過(guò)發(fā)布與訂閱功能,向被它監(jiān)視的所有主服務(wù)器和從服務(wù)器的sentinel:hello頻道發(fā)送一條信息柴信,信息中包含了Sentinel的IP地址套啤、端口號(hào)和運(yùn)行ID(runid)。
3)每個(gè)Sentinel都訂閱了被它監(jiān)視的所有主服務(wù)器和從服務(wù)器的sentinel:hello 頻道随常,查找之前未出現(xiàn)過(guò)的sentinel(looking for unknown sentinels)潜沦。當(dāng)一個(gè)Sentinel發(fā)現(xiàn)一個(gè)新的Sentinel時(shí),它會(huì)將新的Sentinel添加到一個(gè)列表中绪氛,這個(gè)列表保存了Sentinel已知的唆鸡,監(jiān)視同一個(gè)主服務(wù)器的所有其他 Sentinel 。Sentinel發(fā)送的信息中還包括完整的主服務(wù)器當(dāng)前配置(configuration)枣察。如果一個(gè) Sentinel 包含的主服務(wù)器配置比另一個(gè)Sentinel發(fā)送的配置要舊争占,那么這個(gè) Sentinel 會(huì)立即升級(jí)到新配置上。
4)在將一個(gè)新 Sentinel 添加到監(jiān)視主服務(wù)器的列表上面之前序目,Sentinel 會(huì)先檢查列表中是否已經(jīng)包含了和要添加的 Sentinel 擁有相同運(yùn)行 ID 或者相同地址(包括 IP 地址和端口號(hào))的 Sentinel 臂痕,如果是的話,Sentinel 會(huì)先移除列表中已有的那些擁有相同運(yùn)行 ID或者相同地址的 Sentinel 猿涨,然后再添加新 Sentinel 握童。
7.多個(gè)sentinel之間連接
Sentinel之間只會(huì)互相創(chuàng)建命令連接,用于進(jìn)行通信嘿辟。因?yàn)橐呀?jīng)有主從服務(wù)器作為發(fā)送和接收HELLO信息的中介舆瘪,所以Sentinel之間不會(huì)創(chuàng)建訂閱連接。
8.檢測(cè)實(shí)例的狀態(tài)
Sentinel使用PING命令來(lái)檢測(cè)實(shí)例的狀態(tài):如果實(shí)例在指定的時(shí)間內(nèi)沒(méi)有返回回復(fù)红伦,或者返回錯(cuò)誤的回復(fù)英古,那么該實(shí)例會(huì)被 Sentinel 判斷為下線。
Redis的Sentinel中關(guān)于下線(down)有兩個(gè)不同的概念:
1)主觀下線(Subjectively Down昙读, 簡(jiǎn)稱 SDOWN)指的是單個(gè) Sentinel 實(shí)例對(duì)服務(wù)器做出的下線判斷召调。
2)客觀下線(Objectively Down,簡(jiǎn)稱 ODOWN)指的是多個(gè)Sentinel實(shí)例在對(duì)同一個(gè)服務(wù)器做出SDOWN判斷蛮浑,并且通過(guò)SENTINEL is-master-down-by-addr命令互相交流之后唠叛,得出的服務(wù)器下線判斷。(一個(gè) Sentinel可以通過(guò)向另一個(gè)Sentinel發(fā)送SENTINEL is-master-down-by-addr命令來(lái)詢問(wèn)對(duì)方是否認(rèn)為給定的服務(wù)器已下線沮稚。)
如果一個(gè)服務(wù)器沒(méi)有在 master-down-after-milliseconds 選項(xiàng)所指定的時(shí)間內(nèi)艺沼,對(duì)向它送PING命令的Sentinel返回一個(gè)有效回復(fù)(valid reply),那么Sentinel就會(huì)將這個(gè)服務(wù)器標(biāo)記為主觀下線蕴掏。
服務(wù)器對(duì)PING命令的有效回復(fù)可以是以下三種回復(fù)的其中一種:
1)返回 +PONG 障般。
2)返回 -LOADING 錯(cuò)誤调鲸。
3)返回 -MASTERDOWN 錯(cuò)誤。
如果服務(wù)器返回除以上三種回復(fù)之外的其他回復(fù)挽荡,又或者在指定時(shí)間內(nèi)沒(méi)有回復(fù)Ping命令藐石,那么Sentinel認(rèn)為服務(wù)器返回的回復(fù)無(wú)效(non-valid)。
注意:一個(gè)服務(wù)器必須在master-down-after-milliseconds毫秒內(nèi)定拟,一直返回?zé)o效回復(fù)才會(huì)被Sentinel標(biāo)記為主觀下線于微。
舉個(gè)例子,如果master-down-after-milliseconds選項(xiàng)的值為30000毫秒(30秒)青自,那么只要服務(wù)器能在每29秒之內(nèi)返回至少一次有效回復(fù)株依,這個(gè)服務(wù)器就仍然會(huì)被認(rèn)為是處于正常狀態(tài)的。
從主觀下線狀態(tài)切換到客觀下線狀態(tài)并沒(méi)有使用嚴(yán)格的法定人數(shù)算法(strong quorum algorithm)性穿,而是使用了流言協(xié)議:如果 Sentinel 在給定的時(shí)間范圍內(nèi)勺三,從其他Sentinel那里接收到了足夠數(shù)量的主服務(wù)器下線報(bào)告,那么Sentinel就會(huì)將主服務(wù)器的狀態(tài)從主觀下線改變?yōu)榭陀^下線需曾。如果之后其他Sentinel不再報(bào)告主服務(wù)器已下線,那么客觀下線狀態(tài)就會(huì)被移除祈远。
客觀下線條件只適用于主服務(wù)器:對(duì)于任何其他類型的Redis實(shí)例呆万,Sentinel在將它們判斷為下線前不需要進(jìn)行協(xié)商,所以從服務(wù)器或者其他 Sentinel 永遠(yuǎn)不會(huì)達(dá)到客觀下線條件车份。
只要一個(gè)Sentinel發(fā)現(xiàn)某個(gè)主服務(wù)器進(jìn)入了客觀下線狀態(tài)谋减,這個(gè)Sentinel就可能會(huì)被其他Sentinel推選出,并對(duì)失效的主服務(wù)器執(zhí)行自動(dòng)故障遷移操作扫沼。
9.故障轉(zhuǎn)移FAILOVER
一次故障轉(zhuǎn)移操作由以下步驟組成:
1)發(fā)現(xiàn)主服務(wù)器已經(jīng)進(jìn)入客觀下線狀態(tài)出爹。
2)基于Raft leader election協(xié)議 ,進(jìn)行投票選舉
3)如果當(dāng)選失敗缎除,那么在設(shè)定的故障遷移超時(shí)時(shí)間的兩倍之后严就,重新嘗試當(dāng)選。如果當(dāng)選成功器罐,那么執(zhí)行以下步驟梢为。
4)選出一個(gè)從服務(wù)器,并將它升級(jí)為主服務(wù)器轰坊。
5)向被選中的從服務(wù)器發(fā)送 SLAVEOF NO ONE 命令铸董,讓它轉(zhuǎn)變?yōu)橹鞣?wù)器。
6)通過(guò)發(fā)布與訂閱功能肴沫,將更新后的配置傳播給所有其他Sentinel粟害,其他Sentinel對(duì)它們自己的配置進(jìn)行更新。
7)向已下線主服務(wù)器的從服務(wù)器發(fā)送SLAVEOF命令颤芬,讓它們?nèi)?fù)制新的主服務(wù)器悲幅。
8)當(dāng)所有從服務(wù)器都已經(jīng)開(kāi)始復(fù)制新的主服務(wù)器時(shí)孽文, leader Sentinel 終止這次故障遷移操作。
每當(dāng)一個(gè)Redis實(shí)例被重新配置(reconfigured)—— 無(wú)論是被設(shè)置成主服務(wù)器夺艰、從服務(wù)器芋哭、又或者被設(shè)置成其他主服務(wù)器的從服務(wù)器 —— Sentinel 都會(huì)向被重新配置的實(shí)例發(fā)送一個(gè)CONFIG REWRITE命令,從而確保這些配置會(huì)持久化在硬盤(pán)里郁副。
Sentinel使用以下規(guī)則來(lái)選擇新的主服務(wù)器:
1)在失效主服務(wù)器屬下的從服務(wù)器當(dāng)中减牺,那些被標(biāo)記為主觀下線、已斷線存谎、或者最后一次回復(fù)PING命令的時(shí)間大于五秒鐘的從服務(wù)器都會(huì)被淘汰拔疚。
2)在失效主服務(wù)器屬下的從服務(wù)器當(dāng)中,那些與失效主服務(wù)器連接斷開(kāi)的時(shí)長(zhǎng)超過(guò)down-after選項(xiàng)指定的時(shí)長(zhǎng)十倍的從服務(wù)器都會(huì)被淘汰既荚。
3)在經(jīng)歷了以上兩輪淘汰之后剩下來(lái)的從服務(wù)器中稚失,我們選出復(fù)制偏移量(replication offset)最大的那個(gè)從服務(wù)器作為新的主服務(wù)器;如果復(fù)制偏移量不可用恰聘,或者從服務(wù)器的復(fù)制偏移量相同句各,那么帶有最小運(yùn)行ID的那個(gè)從服務(wù)器成為新的主服務(wù)器。
Sentinel自動(dòng)故障遷移的一致性特質(zhì):
1)Sentinel自動(dòng)故障遷移使用Raft算法來(lái)選舉領(lǐng)頭(leader)Sentinel 晴叨,從而確保在一個(gè)給定的周期(epoch)里凿宾,只有一個(gè)領(lǐng)頭產(chǎn)生。
2)這表示在同一個(gè)周期中兼蕊, 不會(huì)有兩個(gè) Sentinel 同時(shí)被選中為領(lǐng)頭初厚,并且各個(gè) Sentinel 在同一個(gè)節(jié)點(diǎn)中只會(huì)對(duì)一個(gè)領(lǐng)頭進(jìn)行投票。 3)更高的配置節(jié)點(diǎn)總是優(yōu)于較低的節(jié)點(diǎn)孙技,因此每個(gè) Sentinel 都會(huì)主動(dòng)使用更新的節(jié)點(diǎn)來(lái)代替自己的配置产禾。 簡(jiǎn)單來(lái)說(shuō),我們可以將Sentinel配置看作是一個(gè)帶有版本號(hào)的狀態(tài)牵啦。一個(gè)狀態(tài)會(huì)以最后寫(xiě)入者勝出(last-write-wins)的方式(也即是亚情,最新的配置總是勝出)傳播至所有其他Sentinel。
舉個(gè)例子:
1)當(dāng)出現(xiàn)網(wǎng)絡(luò)分割(network partitions)時(shí)蕾久,一個(gè)Sentinel可能會(huì)包含了較舊的配置势似,而當(dāng)這個(gè)Sentinel接到其他Sentinel發(fā)來(lái)的版本更新的配置時(shí),Sentinel就會(huì)對(duì)自己的配置進(jìn)行更新僧著。
2)如果要在網(wǎng)絡(luò)分割出現(xiàn)的情況下仍然保持一致性履因, 那么應(yīng)該使用 min-slaves-to-write 選項(xiàng),讓主服務(wù)器在連接的從實(shí)例少于給定數(shù)量時(shí)停止執(zhí)行寫(xiě)操作盹愚,與此同時(shí)栅迄,應(yīng)該在每個(gè)運(yùn)行Redis主服務(wù)器或從服務(wù)器的機(jī)器上運(yùn)行Redis Sentinel進(jìn)程。
Sentinel狀態(tài)的持久化:
1)Sentinel 的狀態(tài)會(huì)被持久化在 Sentinel 配置文件里面皆怕。
2)每當(dāng)Sentinel接收到一個(gè)新的配置毅舆,或者當(dāng)領(lǐng)頭Sentinel為主服務(wù)器創(chuàng)建一個(gè)新的配置時(shí)西篓,這個(gè)配置會(huì)與配置節(jié)點(diǎn)一起被保存到磁盤(pán)里面。
3)這意味著停止和重啟Sentinel進(jìn)程都是安全的憋活。
Sentinel在非故障遷移的情況下對(duì)實(shí)例進(jìn)行重新配置:
1)即使沒(méi)有自動(dòng)故障遷移操作在進(jìn)行岂津,Sentinel總會(huì)嘗試將當(dāng)前的配置設(shè)置到被監(jiān)視的實(shí)例上面。 特別是: 根據(jù)當(dāng)前的配置悦即,如果一個(gè)從服務(wù)器被宣告為主服務(wù)器吮成,那么它會(huì)代替原有的主服務(wù)器,成為新的主服務(wù)器辜梳,并且成為原有主服務(wù)器的所有從服務(wù)器的復(fù)制對(duì)象粱甫。
2)那些連接了錯(cuò)誤主服務(wù)器的從服務(wù)器會(huì)被重新配置, 使得這些從服務(wù)器會(huì)去復(fù)制正確的主服務(wù)器作瞄。
3)不過(guò)茶宵,在以上這些條件滿足之后,Sentinel在對(duì)實(shí)例進(jìn)行重新配置之前仍然會(huì)等待一段足夠長(zhǎng)的時(shí)間宗挥,確蔽谑可以接收到其他Sentinel發(fā)來(lái)的配置更新,從而避免自身因?yàn)楸4媪诉^(guò)期的配置而對(duì)實(shí)例進(jìn)行了不必要的重新配置属韧。
二.sentinel實(shí)戰(zhàn)及配置講解
環(huán)境規(guī)劃與ip分配
1.sentinel配置
說(shuō)明:這里基于之前的主從復(fù)制環(huán)境安拟,主從復(fù)制配置請(qǐng)參考:http://www.reibang.com/p/63430524bf58
Redis哨兵+主從+密碼
#密碼認(rèn)證需要在配置文件中寫(xiě)入,后期添加可能出現(xiàn)不生效的情況宵喂。如果需要,啟動(dòng)服務(wù)前加入会傲。
主從密碼配置文件里添加2行參數(shù):
requirepass "123456"
masterauth "123456"
哨兵配置文件添加一行參數(shù):
sentinel auth-pass myredis 123456
這里三臺(tái)服務(wù)器都需要配置
#創(chuàng)建安裝目錄
[root@redis01 ~]# mkdir -p /data/redis_26379
[root@redis01 ~]# mkdir -p /opt/redis_26379/{conf,pid,logs}
?
#配置哨兵的配置文件
注意:三臺(tái)機(jī)器都操作
cat >/opt/redis_26379/conf/redis_26379.conf << EOF
bind $(ifconfig eth0|awk 'NR==2{print $2}')
port 26379
daemonize yes
logfile /opt/redis_26379/logs/redis_26379.log
dir /data/redis_26379
sentinel monitor myredis 10.0.0.73 6379 2
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 18000
EOF
#啟動(dòng)哨兵
[root@redis01 ~]# redis-sentinel /opt/redis_26379/conf/redis_26379.conf
[root@redis02 ~]# redis-sentinel /opt/redis_26379/conf/redis_26379.conf
[root@redis03 ~]# redis-sentinel /opt/redis_26379/conf/redis_26379.conf
#檢測(cè)啟動(dòng)
[root@redis01 ~]# netstat -lntp|grep 26379
tcp 0 0 10.0.0.73:26379 0.0.0.0:* LISTEN 7434/redis-sentinel
#驗(yàn)證主節(jié)點(diǎn)
[root@redis01 ~]# redis-cli -h 10.0.0.73 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.73"
2) "6379"
?
[root@redis02 ~]# redis-cli -h 10.0.0.73 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.73"
2) "6379"
?
[root@redis03 ~]# redis-cli -h 10.0.0.73 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.73"
2) "6379"
配置文件詳解
sentinel monitor mymaster 127.0.0.1 6379 2
Sentinel 去監(jiān)視一個(gè)名為mymaster的主服務(wù)器锅棕,這個(gè)主服務(wù)器的IP地址為127.0.0.1,端口號(hào)為6379淌山,而將這個(gè)主服務(wù)器判斷為失效至少需要2個(gè)Sentinel同意(只要同意Sentinel的數(shù)量不達(dá)標(biāo)裸燎,自動(dòng)故障遷移就不會(huì)執(zhí)行,不過(guò)要注意泼疑,無(wú)論你設(shè)置要多少個(gè)Sentinel同意才能判斷一個(gè)服務(wù)器失效德绿,一個(gè) Sentinel 都需要獲得系統(tǒng)中多數(shù)(majority) Sentinel 的支持,才能發(fā)起一次自動(dòng)故障遷移退渗,并預(yù)留一個(gè)給定的配置節(jié)點(diǎn)(configuration Epoch移稳,一個(gè)配置節(jié)點(diǎn)就是一個(gè)新主服務(wù)器配置的版本號(hào))。換句話說(shuō)会油,在只有少數(shù)(minority)Sentinel進(jìn)程正常運(yùn)作的情況下个粱,Sentinel 是不能執(zhí)行自動(dòng)故障遷移的。
?
sentinel down-after-milliseconds mymaster 3000
指定了Sentinel認(rèn)為服務(wù)器已經(jīng)斷線所需的毫秒數(shù)翻翩。如果服務(wù)器在給定的毫秒數(shù)之內(nèi)都许,沒(méi)有返回Sentinel發(fā)送的Ping命令的回復(fù)稻薇,或者返回一個(gè)錯(cuò)誤,那么Sentinel將這個(gè)服務(wù)器標(biāo)記為主觀下線(subjectively down胶征,簡(jiǎn)稱SDOWN)塞椎。不過(guò)只有一個(gè)Sentinel將服務(wù)器標(biāo)記為主觀下線并不一定會(huì)引起服務(wù)器的自動(dòng)故障遷移:只有在足夠數(shù)量的Sentinel都將一個(gè)服務(wù)器標(biāo)記為主觀下線之后,服務(wù)器才會(huì)被標(biāo)記為客觀下線(objectively down睛低, 簡(jiǎn)稱 ODOWN )案狠,這時(shí)自動(dòng)故障遷移才會(huì)執(zhí)行。
?
sentinel failover-timeout mymaster 180000
自動(dòng)故障切換的超時(shí)時(shí)間
?
sentinel parallel-syncs mymaster 1
在執(zhí)行故障轉(zhuǎn)移時(shí)暇昂,最多可以有多少個(gè)從服務(wù)器同時(shí)對(duì)新的主服務(wù)器進(jìn)行同步莺戒,這個(gè)數(shù)字越小,完成故障轉(zhuǎn)移所需的時(shí)間就越長(zhǎng)急波。如果從服務(wù)器被設(shè)置為允許使用過(guò)期數(shù)據(jù)集(參見(jiàn)對(duì) redis.conf 文件中對(duì) slave-serve-stale-data 選項(xiàng)的說(shuō)明)从铲,那么你可能不希望所有從服務(wù)器都在同一時(shí)間向新的主服務(wù)器發(fā)送同步請(qǐng)求,因?yàn)楸M管復(fù)制過(guò)程的絕大部分步驟都不會(huì)阻塞從服務(wù)器澄暮,但從服務(wù)器在載入主服務(wù)器發(fā)來(lái)的 RDB 文件時(shí)名段,仍然會(huì)造成從服務(wù)器在一段時(shí)間內(nèi)不能處理命令請(qǐng)求:如果全部從服務(wù)器一起對(duì)新的主服務(wù)器進(jìn)行同步,那么就可能會(huì)造成所有從服務(wù)器在短時(shí)間內(nèi)全部不可用的情況出現(xiàn)泣懊∩毂伲可以通過(guò)將這個(gè)值設(shè)為1來(lái)保證每次只有一個(gè)從服務(wù)器處于不能處理命令請(qǐng)求的狀態(tài)。
2.sentinel切換測(cè)試
#連接主庫(kù)
[root@redis01 ~]# redis-cli
#關(guān)閉主庫(kù)
127.0.0.1:6379> SHUTDOWN
not connected>
#登錄從庫(kù)slave01查看
[root@redis02 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.75
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:4276
slave_priority:100 #權(quán)重
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#登錄從庫(kù)slave02查看
[root@redis03 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master #從庫(kù)已經(jīng)被選為新的主庫(kù)
connected_slaves:1
slave0:ip=10.0.0.74,port=6379,state=online,offset=14246,lag=1
master_repl_offset:14246
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14245
#查看配置文件命令
[root@redis03 ~]# tailf -6 /opt/redis_26379/conf/redis_26379.conf
sentinel leader-epoch myredis 1
sentinel known-slave myredis 10.0.0.73 6379
sentinel known-slave myredis 10.0.0.74 6379
sentinel known-sentinel myredis 10.0.0.73 26379 b31d8fde205f7e2d81a496bff2d0368b4e1ccead
sentinel known-sentinel myredis 10.0.0.74 26379 fb1d5631597e040a2bfab6af8f81dbd923f5e337
sentinel current-epoch 1
?
?
#開(kāi)啟舊的主庫(kù)
?
[root@redis01 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:slave #角色變成了slave
master_host:10.0.0.75
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:94849
slave_priority:100 #權(quán)重
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
?
#在新主庫(kù)庫(kù)再次查看信息
[root@redis03 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.74,port=6379,state=online,offset=114115,lag=0
slave1:ip=10.0.0.73,port=6379,state=online,offset=114115,lag=0
master_repl_offset:114379
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:114378
3.模擬權(quán)重選舉
設(shè)置其他節(jié)點(diǎn)的權(quán)重為0
手動(dòng)發(fā)起重新選舉
觀察所有節(jié)點(diǎn)消息是否同步
觀察切換結(jié)果是否符合預(yù)期
說(shuō)明:默認(rèn)權(quán)重為100
默認(rèn)選舉規(guī)則
命令解釋: 1.查詢權(quán)重命令:CONFIG GET slave-priority 2.設(shè)置權(quán)重命令:CONFIG SET slave-priority 0 3.主動(dòng)切換:sentinel failover myredis
操作命令:
默認(rèn)的都是升級(jí)權(quán)重,但是該模式只能降級(jí)使用
#這里指定漂移回master
[root@redis02 ~]# redis-cli -h 10.0.0.74 -p 6379 CONFIG SET slave-priority 0
[root@redis03 ~]# redis-cli -h 10.0.0.75 -p 26379 sentinel failover myredis
驗(yàn)證選舉結(jié)果:
[root@redis03 ~]# redis-cli -h 10.0.0.75 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.73"
2) "6379"
恢復(fù)原來(lái)的權(quán)重:
[root@redis02 ~]# redis-cli -h 10.0.0.74 -p 6379 CONFIG SET slave-priority 100
[root@redis03 ~]# redis-cli -h 10.0.0.75 -p 6379 CONFIG SET slave-priority 100