Redis哨兵集群模式全方位解讀
Redis哨兵集群模式
Redis提供了哨兵機(jī)制,來實(shí)現(xiàn)主從復(fù)制自動故障恢復(fù)。
當(dāng)Redis主節(jié)點(diǎn)宕機(jī)后,Sentinel會在從節(jié)點(diǎn)中選擇一個從節(jié)點(diǎn)成為主節(jié)點(diǎn),并通知給Redis客戶端,這樣Redis客戶端就知道下次進(jìn)行操作的時(shí)候,就知道該給那個節(jié)點(diǎn)操作了。
?
Sentinel基于心跳機(jī)制監(jiān)測服務(wù)狀態(tài),每隔1秒向集群中的每一個實(shí)例發(fā)送ping命令
主觀下線
如果某個Sentinel節(jié)點(diǎn)發(fā)現(xiàn)某實(shí)例未在規(guī)定時(shí)間內(nèi)響應(yīng),那么就會認(rèn)為是主觀下線(就是某Sentinel一個節(jié)點(diǎn)認(rèn)為下線,但是其他Sentinel還沒有認(rèn)為下線)。
?
客觀下線
若超過指定數(shù)量(quorum)的Sentinel都認(rèn)為該實(shí)例主觀下線,則該實(shí)例客觀下線,quorum值最好超過Sentinel實(shí)例數(shù)量的一半。
?
哨兵模式的選主規(guī)則:
- 首先判斷主與從節(jié)點(diǎn)斷開時(shí)間的長短,如超過指定的值那么久排該從節(jié)點(diǎn)。
- 然后判斷從節(jié)點(diǎn)的slave-priority值,越小優(yōu)先級越高。
- 如果slave-priority值一樣,那么就判斷offset值,值越大的優(yōu)先級越高。
- 最后是判斷slave節(jié)點(diǎn)的運(yùn)行id大小,越小優(yōu)先級越高。
?
哨兵模式(腦裂),腦裂就是當(dāng)主節(jié)點(diǎn)和Sentinel因?yàn)榫W(wǎng)絡(luò)原因,不在同一個網(wǎng)絡(luò)了,那么Sentinel就會去從節(jié)點(diǎn)中選出一個主節(jié)點(diǎn)出來,但是Redis客戶端依舊能訪問到老的主節(jié)點(diǎn) 。
當(dāng)網(wǎng)絡(luò)恢復(fù)后,老的主節(jié)點(diǎn)和新的主節(jié)點(diǎn)又在同一個網(wǎng)絡(luò)了,這時(shí)候Sentinel就會強(qiáng)制將老的主節(jié)點(diǎn),改變?yōu)閺墓?jié)點(diǎn),那么這個從節(jié)點(diǎn)會把自己的數(shù)據(jù)清空去新的主節(jié)點(diǎn)中同步數(shù)據(jù),在之前腦裂的過程中,客戶端寫的數(shù)據(jù)就丟失了。
?
?
解決方案
在Redis中有兩個配置參數(shù),如果不滿足這兩個要求,那么就會拒絕客戶端的請求,這樣就不會導(dǎo)致大量的數(shù)據(jù)丟失了。
?
springboot中如何實(shí)現(xiàn)主從哨兵集群呢?
當(dāng)配置好redis配置文件的內(nèi)容后,并啟動了主節(jié)點(diǎn)從節(jié)點(diǎn)哨兵后,在我們的application.yml配置文件中就可以進(jìn)行配置了,不需要寫redis的主節(jié)點(diǎn)的ip,因?yàn)樯诒鴷约喝フ业街鞴?jié)點(diǎn)。
注意:節(jié)點(diǎn)之間可以用逗號進(jìn)行分割哦。(我這里是一主2從,那么我的哨兵就應(yīng)該是3個哨兵。)
?
這樣就可以實(shí)現(xiàn)簡單的主從哨兵機(jī)制啦,可以測試一下,當(dāng)主節(jié)點(diǎn)的redis宕機(jī)后,那么哨兵就會根據(jù)指定的規(guī)則在從節(jié)點(diǎn)中選一個新的主節(jié)點(diǎn)出來,如果原來那個主節(jié)點(diǎn)恢復(fù)回來了就會被哨兵強(qiáng)制變?yōu)閺墓?jié)點(diǎn)。
怎么保證Redis的高可用呢?
哨兵模式,實(shí)現(xiàn)主從集群的自動故障恢復(fù)。監(jiān)控每一個實(shí)例是否健康,自動故障恢復(fù),某一個主節(jié)點(diǎn)宕機(jī)后,那么哨兵機(jī)制通過選主的規(guī)則,來選擇某一個從節(jié)點(diǎn)來成為主節(jié)點(diǎn),通知客戶端去連接哪一個Redis。
你們使用的Redis是單點(diǎn)還是集群,哪種集群?
集群,主從集群(1主1從)+哨兵。單節(jié)點(diǎn)不超過10G內(nèi)存,如果Redis內(nèi)存不足則可以給不同服務(wù)分配獨(dú)立的Redis主從節(jié)點(diǎn)。
Redis中不建議存儲海量的數(shù)據(jù),Redis中一般用來存儲一些熱點(diǎn)數(shù)據(jù)。
Redis的集群腦裂,如何解決呢?
Redis的集群腦裂主要是因?yàn)?,主?jié)點(diǎn)和從節(jié)點(diǎn)以及Sentinel因?yàn)榫W(wǎng)絡(luò)原因不在同一個網(wǎng)絡(luò),那么哨兵就會在從節(jié)點(diǎn)中選出一個新的主節(jié)點(diǎn),但是客戶端依舊能訪問到老的節(jié)點(diǎn),當(dāng)網(wǎng)絡(luò)恢復(fù)后,老的主節(jié)點(diǎn)會被強(qiáng)制變?yōu)閺墓?jié)點(diǎn)并清理所有數(shù)據(jù)去同步新的主節(jié)點(diǎn),這樣就導(dǎo)致了腦裂期間,大量數(shù)據(jù)的丟失。
解決方案的話 可以去redis的配置文件中修改兩個配置 一個是設(shè)置主節(jié)點(diǎn)最少擁有的從節(jié)點(diǎn)以及縮短主從數(shù)據(jù)同步的延遲時(shí)間,達(dá)不到要求就拒絕請求,這樣就可以避免大量的數(shù)據(jù)丟失。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis實(shí)現(xiàn)優(yōu)惠券限一單限制詳解
這篇文章主要介紹了Redis解決優(yōu)惠券秒殺應(yīng)用案例,本文先講了搶購問題,指出其中會出現(xiàn)的多線程問題,提出解決方案采用悲觀鎖和樂觀鎖兩種方式進(jìn)行實(shí)現(xiàn),然后發(fā)現(xiàn)在搶購過程中容易出現(xiàn)一人多單現(xiàn)象,需要的朋友可以參考下2022-12-12
SpringSession通過Redis統(tǒng)計(jì)在線用戶數(shù)量的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringSession通過Redis統(tǒng)計(jì)在線用戶數(shù)量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題
這篇文章主要介紹了Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
redis string實(shí)現(xiàn)共享會話和手機(jī)驗(yàn)證碼應(yīng)用場景
本文主要介紹了redis string實(shí)現(xiàn)共享會話和手機(jī)驗(yàn)證碼應(yīng)用場景,一種是使用Redis集中管理會話信息,解決不同應(yīng)用服務(wù)器間會話共享問題;另一種是實(shí)現(xiàn)手機(jī)驗(yàn)證碼功能,包括生成、驗(yàn)證驗(yàn)證碼的過程,感興趣的可以了解一下2025-11-11

