一文帶你了解Redis的三種集群模式
Redis 的三種集群模式
Redis 的常用的集群方式主要有以下三種,分別是主從復(fù)制模式、哨兵模式、Redis-Cluster集群模式,那么下面我們就分別了解一下這三種集群模式的優(yōu)點(diǎn)與缺點(diǎn)。
主從復(fù)制模式
主從復(fù)制,是指將一臺(tái) Redis 服務(wù)器的數(shù)據(jù),復(fù)制到其他的 Redis 服務(wù)器。前者稱(chēng)為主節(jié)點(diǎn)(Master),后者稱(chēng)為從節(jié)點(diǎn)(Slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。Redis 的主從復(fù)制模式一般是由一主一從(一個(gè)主節(jié)點(diǎn)+一個(gè)從節(jié)點(diǎn))或一主多從(一個(gè)主節(jié)點(diǎn)+多個(gè)從節(jié)點(diǎn))的形式來(lái)構(gòu)成。主節(jié)點(diǎn)負(fù)責(zé)寫(xiě)操作,從節(jié)點(diǎn)負(fù)責(zé)讀操作,從節(jié)點(diǎn)從主節(jié)點(diǎn)復(fù)制數(shù)據(jù),通過(guò)這種方式也可以實(shí)現(xiàn)讀寫(xiě)分離。
下面我們一起看看主從復(fù)制的原理 ??
- 從服務(wù)器連接主服務(wù)器,發(fā)送 SYNC 命令(即 sync command 命令),請(qǐng)求同步鏈接
- 主服務(wù)器接收到 SYNC 命名后,開(kāi)始執(zhí)行 BGSAVE 命令生成 RDB 文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫(xiě)命令
- 主服務(wù)器BGSAVE執(zhí)行完后,向所有從服務(wù)器發(fā)送快照文件,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫(xiě)命令
- 從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù),載入收到的快照
- 主服務(wù)器快照發(fā)送完畢后開(kāi)始向從服務(wù)器發(fā)送緩沖區(qū)中的寫(xiě)命令;
- 從服務(wù)器完成對(duì)快照的載入,開(kāi)始接收命令請(qǐng)求,并執(zhí)行來(lái)自主服務(wù)器緩沖區(qū)的寫(xiě)命令;(從服務(wù)器初始化完成)
- 主服務(wù)器每執(zhí)行一個(gè)寫(xiě)命令就會(huì)向從服務(wù)器發(fā)送相同的寫(xiě)命令,從服務(wù)器接收并執(zhí)行收到的寫(xiě)命令(從服務(wù)器初始化完成后的操作)
了解了主從復(fù)制模式的概念和原理后,我們一起總結(jié)一下主從復(fù)制模式的優(yōu)缺點(diǎn):
??優(yōu)點(diǎn)??
1、支持主從復(fù)制,主機(jī)會(huì)自動(dòng)將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫(xiě)分離,同時(shí)緩解了主庫(kù)的壓力。
2、Master Server 是以非阻塞的方式為 Slaves 提供服務(wù)。所以在 Master-Slave 同步期間,客戶(hù)端仍然可以提交查詢(xún)或修改請(qǐng)求;Slave Server 同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶(hù)端提交查詢(xún)請(qǐng)求,Redis則返回同步之前的數(shù)據(jù)。
??缺點(diǎn)??
1、由于 Redis 不具備自動(dòng)容錯(cuò)和恢復(fù)功能,主機(jī)從機(jī)的宕機(jī)都會(huì)導(dǎo)致部分讀寫(xiě)請(qǐng)求失敗,需要等待機(jī)器重啟或者手動(dòng)將某臺(tái)從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)才能解決。而且在主機(jī)宕機(jī)時(shí),宕機(jī)前部分?jǐn)?shù)據(jù)未能及時(shí)同步到從機(jī),切換IP后還會(huì)引入數(shù)據(jù)不一致的問(wèn)題,降低了系統(tǒng)的可用性。
我們看完主從復(fù)制模式后,可能有些小伙伴就發(fā)現(xiàn)了一些問(wèn)題:主從復(fù)制模式下,當(dāng)主節(jié)點(diǎn)宕機(jī)后,需要手動(dòng)將某臺(tái)從節(jié)點(diǎn)切換為主節(jié)點(diǎn),這需要人工干預(yù),不僅費(fèi)時(shí)費(fèi)力,而且還會(huì)造成一段時(shí)間內(nèi)服務(wù)不可用,這個(gè)問(wèn)題該如何解決呢?? 接下來(lái)就需要請(qǐng)哨兵模式登場(chǎng)了....
哨兵模式
為了解決我們剛剛談到的問(wèn)題,Redis 2.8 中提供了哨兵工具來(lái)實(shí)現(xiàn)自動(dòng)化的系統(tǒng)監(jiān)控和故障恢復(fù)功能。其實(shí)哨兵模式也是一種主從復(fù)制模式,只不過(guò)增加了哨兵的功能,哨兵的功能主要有兩點(diǎn):第一是監(jiān)控主服務(wù)器和從服務(wù)器是否正常運(yùn)行;第二是當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí)自動(dòng)將從節(jié)點(diǎn)轉(zhuǎn)換為主節(jié)點(diǎn)。
哨兵的啟動(dòng)依賴(lài)于主從模式,所以須把主從模式安裝好的情況下再去做哨兵模式,所有節(jié)點(diǎn)上都需要部署哨兵模式,哨兵模式會(huì)監(jiān)控所有的 Redis 工作節(jié)點(diǎn)是否正常,當(dāng) Master (主節(jié)點(diǎn))出現(xiàn)問(wèn)題的時(shí)候,因?yàn)槠渌?jié)點(diǎn)與主節(jié)點(diǎn)失去聯(lián)系,因此會(huì)進(jìn)行投票,投票過(guò)半就認(rèn)為這個(gè) Master (主節(jié)點(diǎn))的確出現(xiàn)問(wèn)題,然后會(huì)通知其他哨兵,并從 Slaves (從節(jié)點(diǎn))中選取一個(gè)作為新的 Master(主節(jié)點(diǎn))。既然涉及到了投票過(guò)半的要求,那么參與投票的哨兵就必須為單數(shù),即整個(gè)運(yùn)行哨兵的集群的數(shù)量?不得少于3個(gè)節(jié)點(diǎn)?。在選取新的主節(jié)點(diǎn)的過(guò)程中,我們又可以將整個(gè)過(guò)程細(xì)分為兩步,分別為“選哨兵領(lǐng)導(dǎo)”和“由哨兵領(lǐng)導(dǎo)推舉主節(jié)點(diǎn)”。
?? 第一步:選哨兵領(lǐng)導(dǎo) ??
哨兵A: 哎哎哎?。?!兄弟們,我發(fā)現(xiàn)主節(jié)點(diǎn)掉了啊?。?!你們趕緊選我當(dāng)頭,我去選一個(gè)新的子節(jié)點(diǎn)來(lái)做主節(jié)點(diǎn)!??!
哨兵B(niǎo): 額...行吧,我選你當(dāng)頭,雖然我很想當(dāng)領(lǐng)導(dǎo),但是也沒(méi)啥經(jīng)驗(yàn)?zāi)?,還是你來(lái)吧。
哨兵C: 不行!!我不支持你,我才是當(dāng)領(lǐng)導(dǎo)的材料?。?br />哨兵A: 哨兵C你去一邊子的,咱們就三個(gè)兄弟,我和哨兵B(niǎo)都支持,那我就是領(lǐng)導(dǎo)了??
P.S. 如果此時(shí)有多個(gè)哨兵同時(shí)參選,則在等待任意時(shí)間后重新發(fā)起投票,直到選出了領(lǐng)頭的
?? 第二步:哨兵領(lǐng)導(dǎo)選擇主節(jié)點(diǎn) ??
哨兵A: 我來(lái)看看以前的領(lǐng)導(dǎo)留下來(lái)的《如何選擇主節(jié)點(diǎn)》里是怎么寫(xiě)的...翻書(shū)ing... 根據(jù)書(shū)里的記載,我需要按照健康性(哨兵發(fā)送ping命令后的響應(yīng)時(shí)間長(zhǎng)短,時(shí)間越短則越健康)、完整性(選擇復(fù)制偏移量最大,也就是復(fù)制最完整的從節(jié)點(diǎn))、優(yōu)先級(jí)高低(選擇配置文件中從節(jié)點(diǎn)優(yōu)先級(jí)配置最高的,即replica-priority,其默認(rèn)值為100)來(lái)進(jìn)行主節(jié)點(diǎn)的挑選工作,如果有兩個(gè)從節(jié)點(diǎn)都具備這三個(gè)條件的話(huà),那就根據(jù)節(jié)點(diǎn)啟動(dòng)時(shí)分配的 run id 來(lái)決定誰(shuí)做主節(jié)點(diǎn)(runid越小越有可能被選擇為主節(jié)點(diǎn))...
哨兵A: 還是查書(shū)有用啊,要不我還真不知道怎么干,我去選主節(jié)點(diǎn)啦~~
P.S. 選擇主節(jié)點(diǎn)的過(guò)程又稱(chēng)為故障轉(zhuǎn)移的過(guò)程
這里有一點(diǎn)是需要注意的,哨兵的下線(xiàn)分為兩種,分別是主觀(guān)下線(xiàn)(我認(rèn)為你掉線(xiàn)了)和客觀(guān)下線(xiàn)(我們認(rèn)為你掉線(xiàn)了)。每個(gè)哨兵節(jié)點(diǎn)每隔1秒會(huì)向主節(jié)點(diǎn)、從節(jié)點(diǎn)及其它哨兵節(jié)點(diǎn)發(fā)送一次 ping 命令做一次心跳檢測(cè)。如果主節(jié)點(diǎn)在一定時(shí)間范圍內(nèi)不回復(fù)或者是回復(fù)一個(gè)錯(cuò)誤消息,那么這個(gè)哨兵就會(huì)認(rèn)為這個(gè)主節(jié)點(diǎn)主觀(guān)下線(xiàn)了(單方面的)。當(dāng)超過(guò)半數(shù)哨兵節(jié)點(diǎn)認(rèn)為該主節(jié)點(diǎn)主觀(guān)下線(xiàn)了,這樣就客觀(guān)下線(xiàn)了。客觀(guān)下線(xiàn)是針對(duì)于主節(jié)點(diǎn)來(lái)說(shuō)的概念,也就是說(shuō)只有發(fā)生了客觀(guān)下線(xiàn),才會(huì)執(zhí)行我們上面所說(shuō)的兩個(gè)步驟;如果從節(jié)點(diǎn)和哨兵節(jié)點(diǎn)發(fā)生故障,被哨兵主觀(guān)下線(xiàn)后,則不會(huì)再有后續(xù)的客觀(guān)下線(xiàn)和故障轉(zhuǎn)移操作。
通過(guò)上面的講解,我們也就可以總結(jié)出哨兵模式的優(yōu)點(diǎn)了:哨兵模式是基于主從模式的,所有主從的優(yōu)點(diǎn),哨兵模式都具有,同時(shí)使用哨兵模式后主從節(jié)點(diǎn)可以自動(dòng)切換,可以讓系統(tǒng)更健壯,可用性更高。
Redis-Cluster集群模式
Redis 的哨兵模式基本已經(jīng)可以實(shí)現(xiàn)高可用,讀寫(xiě)分離 ,但是在這種模式下每臺(tái) Redis 服務(wù)器都存儲(chǔ)相同的數(shù)據(jù),很浪費(fèi)內(nèi)存,所以在 Redis3.0 上加入了 Cluster 模式,實(shí)現(xiàn)的 Redis 的分布式存儲(chǔ),即每臺(tái) Redis 節(jié)點(diǎn)(Node)上存儲(chǔ)不同的內(nèi)容,很大程度上節(jié)約了內(nèi)容。需要注意的是,集群中的節(jié)點(diǎn)也是分為主節(jié)點(diǎn)和從節(jié)點(diǎn)的,只有主節(jié)點(diǎn)負(fù)責(zé)讀寫(xiě)請(qǐng)求和集群信息的維護(hù),而從節(jié)點(diǎn)只進(jìn)行主節(jié)點(diǎn)數(shù)據(jù)和狀態(tài)信息的復(fù)制。Redis-Cluster采用無(wú)中心結(jié)構(gòu),它有以下三個(gè)特點(diǎn) ??
① 所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬。
②節(jié)點(diǎn)的失效(下線(xiàn))是通過(guò)集群中超過(guò)半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效。
③ 客戶(hù)端與 Redis 節(jié)點(diǎn)直連,不需要中間代理層,客戶(hù)端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可。
接下來(lái)我們一起看看 Redis-Cluster 集群模式的工作流程:
在 Redis 的每一個(gè)節(jié)點(diǎn)上,都有這么兩個(gè)小東西,一個(gè)是插槽(slot),它的的取值范圍是:0-16383,另一個(gè)就是cluster,可以理解為是一個(gè)集群管理的插件。當(dāng) Redis 拿到了需要存取的 key 時(shí),Redis 會(huì)根據(jù) CRC16 算法得出一個(gè)結(jié)果,然后把結(jié)果對(duì) 16384 求余數(shù),這樣每個(gè) key 都會(huì)對(duì)應(yīng)一個(gè)編號(hào)在 0-16383 之間的哈希槽,通過(guò)這個(gè)值,去找到對(duì)應(yīng)的插槽所對(duì)應(yīng)的節(jié)點(diǎn),然后直接自動(dòng)跳轉(zhuǎn)到這個(gè)對(duì)應(yīng)的節(jié)點(diǎn)上進(jìn)行存取操作。為了保證高可用,Redis-Cluster 集群引入了主從模式,一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)一個(gè)或者多個(gè)從節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)宕機(jī)的時(shí)候,就會(huì)啟用從節(jié)點(diǎn)。
雖說(shuō) Redis-Cluster 集群引入了主從模式,但是也帶來(lái)了一個(gè)問(wèn)題:如果集群中具有A、B、C三個(gè)節(jié)點(diǎn),如果節(jié)點(diǎn)B失敗了,整個(gè)集群就會(huì)因缺少5461-10922這個(gè)范圍的插槽而不可使用;如果為每個(gè)節(jié)點(diǎn)添加一個(gè)從節(jié)點(diǎn)A1、B1、C1整個(gè)集群便有三個(gè)Master節(jié)點(diǎn)和三個(gè)slave節(jié)點(diǎn)組成,當(dāng)在節(jié)點(diǎn)B失敗后,那么集群選舉B1位為主節(jié)點(diǎn)繼續(xù)服務(wù)。但是當(dāng)B和B1都失敗后,集群將不可用。
有些小伙伴看到這里可能會(huì)產(chǎn)生一個(gè)疑問(wèn):為什么插槽數(shù)是16384個(gè)呢?為什么不能是65535或者是其他數(shù)值呢?其實(shí)關(guān)于這個(gè)問(wèn)題,作者已經(jīng)給了我們一個(gè)回復(fù)??
The reason is:
- Normal heartbeat packets carry the full configuration of a node, that can be replaced in an idempotent way with the old in order to update an old config. This means they contain the slots configuration for a node, in raw form, that uses 2k of space with16k slots, but would use a prohibitive 8k of space using 65k slots.
- At the same time it is unlikely that Redis Cluster would scale to more than 1000 mater nodes because of other design tradeoffs.
So 16k was in the right range to ensure enough slots per master with a max of 1000 maters, but a small enough number to propagate the slot configuration as a raw bitmap easily. Note that in small clusters the bitmap would be hard to compress because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.
用一句話(huà)總結(jié)出來(lái)就是:由于 Redis 節(jié)點(diǎn)之間通訊會(huì)相互交換槽信息,那如果槽過(guò)多(意味著網(wǎng)絡(luò)包會(huì)變大),網(wǎng)絡(luò)包變大,就意味著會(huì)過(guò)度占用網(wǎng)絡(luò)的帶寬,同時(shí)作者認(rèn)為 Redis 集群中節(jié)點(diǎn)數(shù)不會(huì)超過(guò)1000個(gè),所以作者就取了16384這個(gè)數(shù),即可以將數(shù)據(jù)合理打散至 Redis 集群中的不同實(shí)例,又不會(huì)在交換數(shù)據(jù)時(shí)導(dǎo)致帶寬占用過(guò)多。
小結(jié)
本人經(jīng)驗(yàn)有限,有些地方可能講的沒(méi)有特別到位,如果您在閱讀的時(shí)候想到了什么問(wèn)題,歡迎在評(píng)論區(qū)留言,我們后續(xù)再一一探討??
以上就是一文帶你了解Redis的三種集群模式的詳細(xì)內(nèi)容,更多關(guān)于Redis集群模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Redis三種集群模式詳解
- Redis cluster集群模式的原理解析
- Redis集群搭建(主從模式、哨兵模式、集群模式)
- 詳解簡(jiǎn)單基于spring的redis配置(單機(jī)和集群模式)
- Redis?集群模式(Cluster)原理詳解
- Redis集群(cluster模式)搭建過(guò)程
- Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu)詳解
- Redis 單機(jī)安裝和哨兵模式集群安裝的實(shí)現(xiàn)
- Redis從單點(diǎn)到集群部署模式(單機(jī)模式?主從模式?哨兵模式)
- Redis哨兵集群模式全方位解讀
- Redis中群集三種模式的實(shí)現(xiàn)
相關(guān)文章
Python利用redis限制用戶(hù)重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題
在網(wǎng)站開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要控制用戶(hù)重復(fù)刷新頁(yè)面的情況,本文就來(lái)介紹了Python利用redis限制用戶(hù)重復(fù)刷新帶來(lái)的數(shù)據(jù)問(wèn)題,感興趣的可以了解一下2024-03-03
redis實(shí)現(xiàn)分布式的方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。2019-06-06
redis8.0新特性之布谷鳥(niǎo)過(guò)濾器(Cuckoo Filter)的使用
布谷鳥(niǎo)過(guò)濾器是一種概率數(shù)據(jù)結(jié)構(gòu),就像布隆過(guò)濾器一樣,可以以非??焖偾夜?jié)省空間的方式檢查元素是否存在于集合中,同時(shí)還支持刪除操作,并在某些場(chǎng)景下表現(xiàn)優(yōu)于布隆過(guò)濾器,感興趣的可以了解一下2025-08-08
一文解決Redis后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致fork失敗
Redis作為一個(gè)內(nèi)存數(shù)據(jù)庫(kù),在執(zhí)行后臺(tái)持久化(例如 BGSAVE 命令時(shí))需要fork一個(gè)子進(jìn)程來(lái)生成數(shù)據(jù)庫(kù)快照(RDB 文件),在生產(chǎn)環(huán)境中,有時(shí)你可能會(huì)在Redis日志中遇到持久化失敗的問(wèn)題,本文將詳細(xì)介紹該問(wèn)題的原因以及如何通過(guò)調(diào)整內(nèi)核和Redis配置來(lái)解決此問(wèn)題2025-07-07
利用控制臺(tái)如何對(duì)Redis執(zhí)行增刪改查命令
這篇文章主要給大家介紹了關(guān)于利用控制臺(tái)如何對(duì)Redis執(zhí)行增刪改查命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08

