Redis之哨兵模式原理探究

在前面講的master/slave模式值纱,在一個典型的一主多從的系統(tǒng)中生音,slave在整個體系中起到了數(shù)據(jù)冗余備份和讀寫分離的作用步做。當(dāng)master遇到異常終端后卡乾,需要從slave中選舉一個新的master繼續(xù)對外提供服務(wù),這種機制在前面提到過N次信卡,比如在zk中通過leader選舉隔缀、kafka中可以基于zk的節(jié)點實現(xiàn)master選舉。所以在redis中也需要一種機制去實現(xiàn)master的決策傍菇,redis并沒有提供自動master選舉功能蚕泽,而是需要借助一個哨兵來進行監(jiān)控。

定義

什么是哨兵
顧名思義桥嗤,哨兵的作用就是監(jiān)控Redis系統(tǒng)的運行狀況须妻,它的功能包括幾個
\1.監(jiān)控(Monitoring): 監(jiān)控master和slave是否正常運行
\2. 自動故障遷移(Automatic failover):當(dāng)一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級為新的Master, 并讓失效Master的其他Slave改為復(fù)制新的Master; 當(dāng)客戶端試圖連接失效的Master時,集群也會向客戶端返回新Master的地址,使得集群可以使用Master代替失效Master泛领。

  1. 提醒(Notification):當(dāng)被監(jiān)控的某個 Redis出現(xiàn)問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應(yīng)用程序發(fā)送通知荒吏。

哨兵是一個獨立的進程,使用哨兵后的架構(gòu)圖

為了解決master選舉問題渊鞋,又引出了一個單點問題绰更,也就是哨兵的可用性(哨兵掛了)如何解決,在一個一主多從的Redis系統(tǒng)中锡宋,可以使用多個哨兵進行監(jiān)控任務(wù)以保證系統(tǒng)足夠穩(wěn)定儡湾。此時哨兵不僅會監(jiān)控master和slave,同時還會互相監(jiān)控执俩;這種方式稱為哨兵集群徐钠,哨兵集群需要解決故障發(fā)現(xiàn)、和master決策的協(xié)商機制問題役首。

sentinel之間會相互感知

sentinel節(jié)點之間會因為共同監(jiān)視同一個master從而產(chǎn)生了關(guān)聯(lián)尝丐,一個新加入的sentinel節(jié)點需要和其他監(jiān)視相同

master節(jié)點的sentinel相互感知,首先:

\1. 需要相互感知的sentinel都向他們共同監(jiān)視的master節(jié)點訂channel:sentinel:hello

\2. 新加入的sentinel節(jié)點向這個channel發(fā)布一條消息衡奥,包含自己本身的信息爹袁,這樣訂閱了這個channel的sentinel就可以發(fā)現(xiàn)這個新的sentinel

\3. 新加入得sentinel和其他sentinel節(jié)點建立長連接。


master的故障發(fā)現(xiàn)

sentinel節(jié)點會定期向master節(jié)點發(fā)送心跳包來判斷存活狀態(tài)矮固,一旦master節(jié)點沒有正確響應(yīng)失息,sentinel會把master設(shè)置為“主觀不可用狀態(tài)”,然后它會把“主觀不可用”發(fā)送給其他所有的sentinel節(jié)點去確認(rèn)档址,當(dāng)確認(rèn)的sentinel節(jié)點數(shù)大于>quorum時盹兢,則會認(rèn)為master是“客觀不可用”,接著就開始進入選舉新的master流程辰晕;

但是蛤迎,這里又會遇到一個問題,就是sentinel中含友,本身是一個集群替裆,如果多個節(jié)點同時發(fā)現(xiàn)master節(jié)點達(dá)到客觀不可用狀態(tài)校辩,那誰來決策選擇哪個節(jié)點作為maste呢?

這個時候就需要從sentinel集群中選擇一個leader來做決策辆童。而這里用到了一致性算法Raft算法宜咒、它和Paxos算法類似,都是分布式一致性算法把鉴。但是它比Paxos算法要更容易理解故黑;

Raft和Paxos算法一樣,也是基于投票算法庭砍,只要保證過半數(shù)節(jié)點通過提議即可;
動畫演示地址:http://thesecretlivesofdata.com/raft/

配置實現(xiàn)

通過在這個配置的基礎(chǔ)上增加哨兵機制场晶。在其中任意一臺服務(wù)器上創(chuàng)建一個sentinel.conf文件(在redis文件中,也會存在一個sentinel.conf的示例文件)怠缸,文件內(nèi)容

sentinel monitor name ip port quorum

其中name表示要監(jiān)控的master的名字诗轻,這個名字是自己定義。 ip和port表示master的ip和端口號揭北。 最后一個1表示最低通過票數(shù)扳炬,也就是說至少需要幾個哨兵節(jié)點統(tǒng)一才可以,后面會具體說明:

port 6040 //哨兵自己的端口號
sentinel monitor mymaster 192.168.11.131 6379 1
sentinel down-after-milliseconds mymaster 5000 --表示如果5s內(nèi)mymaster沒響應(yīng)搔体,就認(rèn)為SDOWN

sentinel failover-timeout mymaster 15000 --表示如果15秒后,mysater仍沒活過來恨樟,則啟動failover,從剩下的slave中選一個升級為master

兩種方式啟動哨兵
redis-sentinel sentinel.conf
redis-server /path/to/sentinel.conf --sentinel



啟動如上圖
哨兵監(jiān)控一個系統(tǒng)時疚俱,只需要配置監(jiān)控master即可劝术,哨兵會自動發(fā)現(xiàn)所有slave;
這時候计螺,我們把master關(guān)閉夯尽,等待指定時間后(默認(rèn)是30秒),會自動進行切換登馒,會輸出如下消息
shutdown
+sdown表示哨兵主管認(rèn)為master已經(jīng)停止服務(wù)了,+odown表示哨兵客觀認(rèn)為master停止服務(wù)了咆槽。如圖所示:


關(guān)于主觀和客觀陈轿,每個sentinel以每秒一次向他所記錄的master或slave其他的sentinel相互ping,檢測是否存活秦忿。

超過down-after-milliseconds的時間麦射,則標(biāo)記為主觀下線。然后其他的sentinel也要開始確認(rèn)是否主觀下線灯谣,如果超過一定確認(rèn)變更為客觀下線潜秋。

接著哨兵開始進行故障恢復(fù),挑選一個slave升級為master
+try-failover表示哨兵開始進行故障恢復(fù)
+failover-end 表示哨兵完成故障恢復(fù)
+slave表示列出新的master和slave服務(wù)器胎许,我們?nèi)匀豢梢钥吹揭呀?jīng)停掉的master峻呛,哨兵并沒有清楚已停止的服務(wù)的實例罗售,這是因為已經(jīng)停止的服務(wù)器有可能會在某個時間進行恢復(fù),恢復(fù)以后會以slave角色加入到整個集群中钩述。

即使是使用哨兵寨躁,此時的Redis集群的每個數(shù)據(jù)庫依然存有集群中的所有數(shù)據(jù),從而導(dǎo)致集群的總數(shù)據(jù)存儲量受限于可用存儲內(nèi)存最小的節(jié)點牙勘,形成了木桶效應(yīng)职恳。而因為Redis是基于內(nèi)存存儲的,所以這一個問題在redis中就顯得尤為突出了
在redis3.0之前方面,我們是通過在客戶端去做的分片放钦,通過hash環(huán)的方式對key進行分片存儲。分片雖然能夠解決各個節(jié)點的存儲壓力恭金,但是導(dǎo)致維護成本高最筒、增加、移除節(jié)點比較繁瑣蔚叨。



因此redis3中床蜘,就出現(xiàn)支持集群。

總結(jié)幾點

1.性能蔑水,內(nèi)存撐不住邢锯。
2.只有一個master,并發(fā)上不去搀别。
3.Master一掛的過程是無法寫入的丹擎,重啟的過程需要一秒或幾秒,如果做的是秒殺的業(yè)務(wù)歇父,在幾秒內(nèi)秒殺結(jié)束蒂培,redis掛了,會影響前臺的業(yè)務(wù)榜苫。大公司已經(jīng)不會再用哨兵模式了护戳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垂睬,隨后出現(xiàn)的幾起案子媳荒,更是在濱河造成了極大的恐慌,老刑警劉巖驹饺,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳枕,死亡現(xiàn)場離奇詭異,居然都是意外死亡赏壹,警方通過查閱死者的電腦和手機鱼炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝌借,“玉大人昔瞧,你說我怎么就攤上這事指蚁。” “怎么了硬爆?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵欣舵,是天一觀的道長。 經(jīng)常有香客問我缀磕,道長缘圈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任袜蚕,我火速辦了婚禮糟把,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牲剃。我一直安慰自己遣疯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布凿傅。 她就那樣靜靜地躺著缠犀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聪舒。 梳的紋絲不亂的頭發(fā)上辨液,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音箱残,去河邊找鬼滔迈。 笑死,一個胖子當(dāng)著我的面吹牛被辑,可吹牛的內(nèi)容都是我干的燎悍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盼理,長吁一口氣:“原來是場噩夢啊……” “哼谈山!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榜揖,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勾哩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后举哟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡迅矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年妨猩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽褒。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡壶硅,死狀恐怖威兜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庐椒,我是刑警寧澤椒舵,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站约谈,受9級特大地震影響笔宿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棱诱,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一泼橘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迈勋,春花似錦炬灭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厦凤,卻和暖如春鼻吮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泳唠。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工狈网, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笨腥。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓拓哺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脖母。 傳聞我的和親對象是個殘疾皇子士鸥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容