Redis的集群分為兩種,一種是集群cluster一種是哨兵
- redis集群選舉分析
當(dāng)salve發(fā)現(xiàn)自己的master變?yōu)镕AIL狀態(tài)時(shí),嘗試進(jìn)行Failover(故障切換)
當(dāng)存在多個(gè)slave的時(shí)候,就需要競(jìng)爭(zhēng)成為master,過(guò)程如下
(1) slave發(fā)現(xiàn)自己的master變?yōu)镕AIL
(2) 將自己記錄的集群currentEpock加一,并廣播FAILOVER_AUTH_REQUEST信息
(3) 其他小集群的master會(huì)相應(yīng)slave的廣播消息,首先判斷請(qǐng)求者的合法性,并發(fā)送FAILOVER_AUTH_ACK,對(duì)每一個(gè)epoch只發(fā)送一次ack
(4) 嘗試failover的slave收集master返回的FAILOVER_AUTH_ACK
(5) Slave受到超過(guò)半數(shù)的master的ack就成為新的master
(6) Slave廣播ping消息通知其他集群節(jié)點(diǎn)
Slave節(jié)點(diǎn)不是主節(jié)點(diǎn)已進(jìn)入FAIL狀態(tài)就馬上嘗試發(fā)起選舉,而是有一定的延時(shí),一定的延時(shí)確保等待FAIL狀態(tài)在集群中傳播。Slave如果立即嘗試選舉,其它的masters或許尚未意識(shí)到FAIL狀態(tài),可能會(huì)拒絕投票。
延時(shí)計(jì)算公式:
DELAY = 500ms+random(0~5000ms)+SLAVE_RANK*1000ms
SLAVE_RANK表示此slave已經(jīng)從master復(fù)制數(shù)據(jù)的總量的rank。Rank越小代表已經(jīng)復(fù)制的數(shù)據(jù)越新。這種方式下,只有最新數(shù)據(jù)的slave將會(huì)首先發(fā)起選舉。
Redis集群如果發(fā)生腦裂,網(wǎng)絡(luò)分區(qū)導(dǎo)致腦裂后多個(gè)主節(jié)點(diǎn)對(duì)外提供寫(xiě)服務(wù),當(dāng)網(wǎng)絡(luò)分區(qū)回復(fù),會(huì)將其中一個(gè)主節(jié)點(diǎn)變?yōu)閺墓?jié)點(diǎn),變?yōu)閺墓?jié)點(diǎn)之后,回從現(xiàn)有主節(jié)點(diǎn)復(fù)制數(shù)據(jù),那原來(lái)的數(shù)據(jù)就會(huì)丟失,redis不像zookeeper有過(guò)半機(jī)制,是通過(guò)配置文件的參數(shù)
min-replicas-to-write 3
min-replicas-max-lag 10
第一個(gè)參數(shù)表示連接到master的最少slave數(shù)量
第二個(gè)參數(shù)表示slave連接到master的最大延遲時(shí)間
按照上面的配置,要求至少3個(gè)slave節(jié)點(diǎn),且數(shù)據(jù)復(fù)制和同步的延遲不能超過(guò)10秒,否則的話master就會(huì)拒絕寫(xiě)請(qǐng)求,配置了這兩個(gè)參數(shù)之后,如果發(fā)生集群腦裂,原先的master節(jié)點(diǎn)接收到客戶端的寫(xiě)入請(qǐng)求會(huì)拒絕,就可以減少數(shù)據(jù)同步之后的數(shù)據(jù)丟失。
- 哨兵的選舉
Redis 的哨兵選舉,首先是從sentinel中選出leader,由這個(gè)leader去操作redis主從切換.
- 選出sentinel的leader
當(dāng)一個(gè)master服務(wù)器被sentinel認(rèn)為下線狀態(tài)后,sentinel會(huì)與其余的sentinel協(xié)商選出的leader進(jìn)行故障轉(zhuǎn)移,每個(gè)發(fā)現(xiàn)master服務(wù)器進(jìn)入下線的sentinel都可以要求其他sentinel選自己為sentinel的leader,選舉是先到先得,同是每個(gè)sentinel每次選舉都會(huì)自增配置紀(jì)元(選舉周期),每個(gè)紀(jì)元中只有選擇一個(gè)sentinel的leader.如果所有超過(guò)一半的sentinel選舉其中一個(gè)sentinel作為leader.之后該sentinel作為leader進(jìn)行故障轉(zhuǎn)移操作,
- 操作redis服務(wù)器
從存活的slave中選舉新的master,這個(gè)選舉過(guò)程跟集群的master選舉很類(lèi)似.
關(guān)于哨兵可以參考https://www.cnblogs.com/Eugene-Jin/p/10819601.html