Redis(3)--哨兵模式,集群
Redis的哨兵模式
什么是哨兵模式
Redis提供了哨兵的命令,哨兵是一個(gè)獨(dú)立的進(jìn)程,作為進(jìn)程,它會(huì)獨(dú)立運(yùn)行。其原理是哨兵通過(guò)發(fā)送命令,等待Redis服務(wù)器響應(yīng),從而監(jiān)控運(yùn)行的多個(gè)Redis實(shí)例。
哨兵的工作原理
每個(gè)哨兵會(huì)向其它哨兵、master、slave定時(shí)發(fā)送消息,以確認(rèn)對(duì)方是否”活”著,如果發(fā)現(xiàn)對(duì)方在指定時(shí)間(可配置)內(nèi)未回應(yīng),則暫時(shí)認(rèn)為對(duì)方主觀下線。若“哨兵群”中的半數(shù)sentinel,都報(bào)告某一master沒(méi)響應(yīng),系統(tǒng)才認(rèn)為該master"徹底死亡",即客觀下線。通過(guò)一定的vote算法,從剩下的slave節(jié)點(diǎn)中,選一臺(tái)提升為master,然后自動(dòng)修改相關(guān)配置。
實(shí)際上哨兵只是一個(gè)運(yùn)行在特殊模式下的 Redis 服務(wù)器,你可以在啟動(dòng)一個(gè)普通 Redis 服務(wù)器時(shí)通過(guò)給定 --sentinel 選項(xiàng)來(lái)啟動(dòng)哨兵(sentinel)。
哨兵的任務(wù)
- 監(jiān)控:哨兵(sentinel) 會(huì)不斷地檢查你的Master和Slave是否運(yùn)作正常。
- 提醒:當(dāng)被監(jiān)控的某個(gè) Redis出現(xiàn)問(wèn)題時(shí), 哨兵(sentinel) 可以通過(guò) API 向管理員或者其他應(yīng)用程序發(fā)送通知。
- 自動(dòng)故障遷移:當(dāng)一個(gè)Master不能正常工作時(shí),哨兵(sentinel)會(huì)開(kāi)始一次自動(dòng)故障遷移操作,它會(huì)將失效Master的其中一個(gè)Slave升級(jí)為新的Master,并讓失效Master的其他Slave改為復(fù)制新的Master;當(dāng)客戶端試圖連接失效的Master時(shí),集群也會(huì)向客戶端返回新Master的地址,使得集群可以使用Master代替失效Master。
哨兵的作用
- 通過(guò)發(fā)送命令,讓Redis服務(wù)器返回監(jiān)控其運(yùn)行狀態(tài),包括主服務(wù)器和從服務(wù)器。
- 當(dāng)哨兵監(jiān)測(cè)到master宕機(jī),會(huì)自動(dòng)將slave切換成master,然后通過(guò)發(fā)布訂閱模式通知其他的從服務(wù)器,修改配置文件,讓它們切換主機(jī)。
Redis集群
本篇文章對(duì)Redis集群的講解基于Redis官方提供的Redis Cluster模型來(lái)進(jìn)行。
什么是Redis集群
Redis集群提供一種方式自動(dòng)將數(shù)據(jù)分布在多個(gè)Redis節(jié)點(diǎn)上。Redis 集群通過(guò)分區(qū)來(lái)提供一定程度的可用性: 即使集群中有一部分節(jié)點(diǎn)失效或者無(wú)法進(jìn)行通訊, 集群也可以繼續(xù)處理命令請(qǐng)求。
數(shù)據(jù)分片
Redis 集群使用數(shù)據(jù)分片而非一致性哈希來(lái)實(shí)現(xiàn): 一個(gè) Redis 集群包含 16384 個(gè)哈希槽, 數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這 16384 個(gè)哈希槽的其中一個(gè), 集群使用公式 CRC16(key) % 16384 來(lái)計(jì)算鍵 key 屬于哪個(gè)槽。集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分哈希槽。
這種將哈希槽分布到不同節(jié)點(diǎn)的做法使得用戶可以很容易地向集群中添加或者刪除節(jié)點(diǎn)。 假設(shè)現(xiàn)在集群中有A,B,C,D四個(gè)節(jié)點(diǎn),如果我們現(xiàn)在想將新節(jié)點(diǎn)E添加到集群中,只需要將A,B,C,D的某些槽移動(dòng)到E就可以了。同理,如果我們要從集群中移除節(jié)點(diǎn) A , 那么集群只需要將節(jié)點(diǎn) A 中的所有哈希槽移動(dòng)到B,C,D , 然后再移除空白(不包含任何哈希槽)的節(jié)點(diǎn) A 就可以了。
因?yàn)閷⒁粋€(gè)哈希槽從一個(gè)節(jié)點(diǎn)移動(dòng)到另一個(gè)節(jié)點(diǎn)不會(huì)造成節(jié)點(diǎn)阻塞, 所以無(wú)論是添加新節(jié)點(diǎn)還是移除已存在節(jié)點(diǎn), 又或者改變某個(gè)節(jié)點(diǎn)包含的哈希槽數(shù)量, 都不會(huì)造成集群下線。
集群的高可用性
集群支持主從復(fù)制和主節(jié)點(diǎn)的自動(dòng)故障轉(zhuǎn)移(與哨兵類似);當(dāng)任一節(jié)點(diǎn)發(fā)生故障時(shí),集群仍然可以對(duì)外提供服務(wù)。
集群狀態(tài)
當(dāng)每個(gè)槽都被分配完畢,集群就處于上線狀態(tài),否則就處于下線狀態(tài)。
ASK錯(cuò)誤
當(dāng)客戶端向節(jié)點(diǎn)發(fā)送關(guān)于節(jié)點(diǎn)key的命令的時(shí)候,若發(fā)現(xiàn)節(jié)點(diǎn)key不存在于源節(jié)點(diǎn)的數(shù)據(jù)庫(kù)且源節(jié)點(diǎn)正在遷移槽i,則會(huì)向客戶端返回一個(gè)ASK錯(cuò)誤。當(dāng)客戶端收到ASK錯(cuò)誤后,從中讀取目標(biāo)節(jié)點(diǎn)的地址信息,并向目標(biāo)節(jié)點(diǎn)重新發(fā)送請(qǐng)求。
集群方案設(shè)計(jì)
設(shè)計(jì)集群方案時(shí),至少要考慮以下因素:
- 高可用要求:根據(jù)故障轉(zhuǎn)移的原理,至少需要3個(gè)主節(jié)點(diǎn)才能完成故障轉(zhuǎn)移,且3個(gè)主節(jié)點(diǎn)不應(yīng)在同一臺(tái)物理機(jī)上;每個(gè)主節(jié)點(diǎn)至少需要1個(gè)從節(jié)點(diǎn),且主從節(jié)點(diǎn)不應(yīng)在一臺(tái)物理機(jī)上;因此高可用集群至少包含6個(gè)節(jié)點(diǎn)。
- 數(shù)據(jù)量和訪問(wèn)量:估算應(yīng)用需要的數(shù)據(jù)量和總訪問(wèn)量(考慮業(yè)務(wù)發(fā)展,留有冗余),結(jié)合每個(gè)主節(jié)點(diǎn)的容量和能承受的訪問(wèn)量(可以通過(guò)benchmark得到較準(zhǔn)確估計(jì)),計(jì)算需要的主節(jié)點(diǎn)數(shù)量。
- 節(jié)點(diǎn)數(shù)量限制:Redis官方給出的節(jié)點(diǎn)數(shù)量限制為1000,主要是考慮節(jié)點(diǎn)間通信帶來(lái)的消耗。在實(shí)際應(yīng)用中應(yīng)盡量避免大集群;如果節(jié)點(diǎn)數(shù)量不足以滿足應(yīng)用對(duì)Redis數(shù)據(jù)量和訪問(wèn)量的要求,可以考慮:(1)業(yè)務(wù)分割,大集群分為多個(gè)小集群;(2)減少不必要的數(shù)據(jù);(3)調(diào)整數(shù)據(jù)過(guò)期策略等。
- 適度冗余:Redis可以在不影響集群服務(wù)的情況下增加節(jié)點(diǎn),因此節(jié)點(diǎn)數(shù)量適當(dāng)冗余即可,不用太大。
Redis集群的優(yōu)勢(shì)
- 可以將數(shù)據(jù)自動(dòng)切分到多個(gè)節(jié)點(diǎn)
- 當(dāng)集群中的一部分節(jié)點(diǎn)失效或者無(wú)法進(jìn)行通訊時(shí), 仍然可以繼續(xù)處理命令請(qǐng)求的能力
集群存在的一些不足
- 涉及多個(gè)key的操作通常是不被支持的。舉例來(lái)說(shuō),當(dāng)兩個(gè)set映射到不同的redis實(shí)例上時(shí),你就不能對(duì)這兩個(gè)set執(zhí)行交集操作。
- 涉及多個(gè)key的redis事務(wù)不能使用。
- 不能保證集群內(nèi)的數(shù)據(jù)均衡。分區(qū)的粒度是key,如果某個(gè)key的值是巨大的set、list,無(wú)法進(jìn)行拆分。
- 增加或刪除容量也比較復(fù)雜。redis集群需要支持在運(yùn)行時(shí)增加、刪除節(jié)點(diǎn)的透明數(shù)據(jù)平衡的能力。
對(duì)Redis高可用性的總結(jié)
我們之前Redis系列的文章提到了持久化、主從復(fù)制、哨兵模式和Redis集群等概念,下面我們對(duì)其進(jìn)行總結(jié):
- 持久化:持久化是最簡(jiǎn)單的高可用方法,主要作用是數(shù)據(jù)備份,即將數(shù)據(jù)存儲(chǔ)在硬盤(pán),保證數(shù)據(jù)不會(huì)因進(jìn)程退出而丟失。
- 復(fù)制:復(fù)制是高可用Redis的基礎(chǔ),哨兵和集群都是在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的。復(fù)制主要實(shí)現(xiàn)了數(shù)據(jù)的多機(jī)備份,以及對(duì)于讀操作的負(fù)載均衡和簡(jiǎn)單的故障恢復(fù)。缺陷:故障恢復(fù)無(wú)法自動(dòng)化;寫(xiě)操作無(wú)法負(fù)載均衡;存儲(chǔ)能力受到單機(jī)的限制。
- 哨兵:在復(fù)制的基礎(chǔ)上,哨兵實(shí)現(xiàn)了自動(dòng)化的故障恢復(fù)。缺陷:寫(xiě)操作無(wú)法負(fù)載均衡;存儲(chǔ)能力受到單機(jī)的限制。
- 集群:通過(guò)集群,Redis解決了寫(xiě)操作無(wú)法負(fù)載均衡,以及存儲(chǔ)能力受到單機(jī)限制的問(wèn)題,實(shí)現(xiàn)了較為完善的高可用方案。
參考:Redis哨兵(Sentinel)模式
redis主從復(fù)制下哨兵模式—選舉原理
Redis集群的原理和搭建
深入學(xué)習(xí)Redis(5):集群
深入學(xué)習(xí)Redis(4):哨兵
總結(jié)
以上是生活随笔為你收集整理的Redis(3)--哨兵模式,集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从0开始的TypeScriptの八:类
- 下一篇: 西安拟制定羊肉泡馍肉夹馍制作标准