來源:水滴與銀彈國產(chǎn) Star 破 10w+ 的開源項目,前端包括管理后臺 + 微信小程序,后端支持單體和微服務(wù)架構(gòu)。
功能涵蓋 RBAC 權(quán)限、SaaS 多租戶、數(shù)據(jù)權(quán)限、商城、支付、工作流、大屏報表、微信公眾號等等功能:
- 從最簡單的開始:單機(jī)版 Redis
- 數(shù)據(jù)持久化:有備無患
- 主從復(fù)制:多副本
- 哨兵:故障自動切換
- 分片集群:橫向擴(kuò)展
- 總結(jié)
這篇文章我想和你聊一聊 Redis 的架構(gòu)演化之路。
現(xiàn)如今 Redis 變得越來越流行,幾乎在很多項目中都要被用到,不知道你在使用 Redis 時,有沒有思考過,Redis 到底是如何穩(wěn)定、高性能地提供服務(wù)的?
- 我使用 Redis 的場景很簡單,只使用單機(jī)版 Redis 會有什么問題嗎?
- 我的 Redis 故障宕機(jī)了,數(shù)據(jù)丟失了怎么辦?如何能保證我的業(yè)務(wù)應(yīng)用不受影響?
- 為什么需要主從集群?它有什么優(yōu)勢?
- 什么是分片集群?我真的需要分片集群嗎?
- ...
如果你對 Redis 已經(jīng)有些了解,肯定也聽說過「數(shù)據(jù)持久化、主從復(fù)制、哨兵、分片集群 」這些概念,它們之間又有什么區(qū)別和聯(lián)系呢?
如果你存在這樣的疑惑,這篇文章,我會從 0 到 1,再從 1 到 N,帶你一步步構(gòu)建出一個穩(wěn)定、高性能的 Redis 集群。
在這個過程中,你可以了解到 Redis 為了做到穩(wěn)定、高性能,都采取了哪些優(yōu)化方案,以及為什么要這么做?
掌握了這些原理,這樣平時你在使用 Redis 時,就能夠做到「游刃有余」。
從最簡單的開始:單機(jī)版 Redis
首先,我們從最簡單的場景開始。
假設(shè)現(xiàn)在你有一個業(yè)務(wù)應(yīng)用,需要引入 Redis 來提高應(yīng)用的性能,此時你可以選擇部署一個單機(jī)版的 Redis 來使用,就像這樣:
這個架構(gòu)非常簡單,你的業(yè)務(wù)應(yīng)用可以把 Redis 當(dāng)做緩存來使用,從 MySQL 中查詢數(shù)據(jù),然后寫入到 Redis 中,之后業(yè)務(wù)應(yīng)用再從 Redis 中讀取這些數(shù)據(jù),由于 Redis 的數(shù)據(jù)都存儲在內(nèi)存中,所以這個速度飛快。
如果你的業(yè)務(wù)體量并不大,那這樣的架構(gòu)模型基本可以滿足你的需求。是不是很簡單?
隨著時間的推移,你的業(yè)務(wù)體量逐漸發(fā)展起來了,Redis 中存儲的數(shù)據(jù)也越來越多,此時你的業(yè)務(wù)應(yīng)用對 Redis 的依賴也越來越重。
突然有一天,你的 Redis 因為某些原因宕機(jī)了,這時你的所有業(yè)務(wù)流量,都會打到后端 MySQL 上,MySQL 壓力劇增,嚴(yán)重的話甚至?xí)嚎?MySQL。
這時你應(yīng)該怎么辦?
我猜你的方案肯定是,趕緊重啟 Redis,讓它可以繼續(xù)提供服務(wù)。
但是,因為之前 Redis 中的數(shù)據(jù)都在內(nèi)存中,盡管你現(xiàn)在把 Redis 重啟了,之前的數(shù)據(jù)也都丟失了(假設(shè)沒開持久化)。重啟后的 Redis 雖然可以正常工作,但是由于 Redis 中沒有任何數(shù)據(jù),業(yè)務(wù)流量還是都會打到后端 MySQL 上,MySQL 的壓力還是很大。
有沒有什么好的辦法解決這個問題?
既然 Redis 只把數(shù)據(jù)存儲在內(nèi)存中,那是否可以把這些數(shù)據(jù)也寫一份到磁盤上呢?
如果采用這種方式,當(dāng) Redis 重啟時,我們把磁盤中的數(shù)據(jù)快速「恢復(fù) 」到內(nèi)存中,這樣它就可以繼續(xù)正常提供服務(wù)了。
是的,這是一個很好的解決方案,這個把內(nèi)存數(shù)據(jù)寫到磁盤上的過程,就是「數(shù)據(jù)持久化」。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
數(shù)據(jù)持久化:有備無患
現(xiàn)在,你設(shè)想的 Redis 數(shù)據(jù)持久化是這樣的:
3
但是,數(shù)據(jù)持久化具體應(yīng)該怎么做呢?
我猜你最容易想到的一個方案是,Redis 每一次執(zhí)行寫操作,除了寫內(nèi)存之外,同時也寫一份到磁盤上,就像這樣:
沒錯,這是最簡單直接的方案。
但仔細(xì)想一下,這個方案有個問題:客戶端的每次寫操作,既需要寫內(nèi)存,又需要寫磁盤,而寫磁盤的耗時相比于寫內(nèi)存來說,肯定要慢很多!這勢必會影響到 Redis 的性能。
如何規(guī)避這個問題?
這時我們需要分析寫磁盤的細(xì)節(jié)問題了。
我們都知道,要把內(nèi)存數(shù)據(jù)寫到磁盤,其實是分 2 步的:
- 程序?qū)懳募?PageCache(write)
- 把 PageCache 刷到磁盤(fsync)
具體就是下圖這樣:
數(shù)據(jù)持久化最粗暴的思路就是上面提到的那樣,寫完 Redis 內(nèi)存后,同步寫 PageCache + fsync 磁盤,當(dāng)然,這樣肯定因為磁盤拖慢整個寫入速度。
如何優(yōu)化?也很簡單,我們可以這樣做:Redis 寫內(nèi)存由主線程來做,寫內(nèi)存完成后就給客戶端返回結(jié)果,然后 Redis 用「另一個線程」去寫磁盤,這樣就可以避免主線程寫磁盤對性能的影響。
這種持久化方案,其實就是我們經(jīng)常聽到的 Redis AOF(Append Only File)。
Redis AOF 持久化提供了 3 種刷盤機(jī)制:
- appendfsync always:主線程同步 fsync
- appendfsync no:由 OS fsync
- appendfsync everysec:后臺線程每間隔1秒 fsync
解決了數(shù)據(jù)實時持久化,我們還會面臨另一個問題,數(shù)據(jù)實時寫入 AOF,隨著時間的推移,AOF 文件會越來越大,那使用 AOF 恢復(fù)時變得非常慢,這該怎么辦?
Redis 很貼心地提供了 AOF rewrite 方案,俗稱 AOF 「瘦身」,顧名思義,就是壓縮 AOF 的體積。
因為 AOF 里記錄的都是每一次寫命令,例如執(zhí)行 set k1 v1,set k1 v2,其實我們只關(guān)心數(shù)據(jù)的最終版本 v2 就可以了。AOF rewrite 正是利用了這個特點,在 AOF 體積越來越大時(超過設(shè)定閾值),Redis 就會定期重寫一份新的 AOF,這個新的 AOF 只記錄數(shù)據(jù)的最終版本就可以了。
這樣就可以壓縮 AOF 體積。
除此之外,我們可以換個角度,思考一下還有什么方式可以持久化數(shù)據(jù)?
這時你就要結(jié)合 Redis 的使用場景來考慮了。
回憶一下,我們在使用 Redis 時,通常把它用作什么場景?
是的,緩存。
把 Redis 當(dāng)做緩存來用,意味著盡管 Redis 中沒有保存全量數(shù)據(jù),對于不在緩存中的數(shù)據(jù),我們的業(yè)務(wù)應(yīng)用依舊可以通過查詢后端數(shù)據(jù)庫得到結(jié)果,只不過查詢后端數(shù)據(jù)的速度會慢一點而已,但對業(yè)務(wù)結(jié)果其實是沒有影響的。
基于這個特點,我們的 Redis 數(shù)據(jù)持久化還可以用「數(shù)據(jù)快照 」的方式來做。
那什么是數(shù)據(jù)快照呢?
簡單來講,你可以這么理解:
- 你把 Redis 想象成一個水杯,向 Redis 寫入數(shù)據(jù),就相當(dāng)于往這個杯子里倒水
- 此時你拿一個相機(jī)給這個水杯拍一張照片,拍照的這一瞬間,照片中記錄到這個水杯中水的容量,就是水杯的數(shù)據(jù)快照
也就是說,Redis 的數(shù)據(jù)快照,是記錄某一時刻下 Redis 中的數(shù)據(jù),然后只需要把這個數(shù)據(jù)快照寫到磁盤上就可以了。
它的優(yōu)勢在于,只在需要持久化時,把數(shù)據(jù)「一次性 」寫入磁盤,其它時間都不需要操作磁盤。
基于這個方案,我們可以「定時 」給 Redis 做數(shù)據(jù)快照,把數(shù)據(jù)持久化到磁盤上。
這種方案就是我們經(jīng)常聽到的 Redis RDB,RDB 采用「定時快照 」的方式進(jìn)行數(shù)據(jù)持久化,它的優(yōu)點是:
- 持久化文件體積?。ǘM(jìn)制 + 壓縮)
- 寫盤頻率低(定時寫入)
缺點也很明顯,因為是定時持久化,數(shù)據(jù)肯定沒有 AOF 實時持久化完整,如果你的 Redis 只當(dāng)做緩存,對于丟失數(shù)據(jù)不敏感(可從后端的數(shù)據(jù)庫查詢),那這種持久化方式是非常合適的。
如果讓你來選擇持久化方案,你可以這樣選擇:
- 業(yè)務(wù)對于數(shù)據(jù)丟失不敏感,選 RDB
- 業(yè)務(wù)對數(shù)據(jù)完整性要求比較高,選 AOF
理解了 RDB 和 AOF,我們再進(jìn)一步思考一下,有沒有什么辦法,既可以保證數(shù)據(jù)完整性,還能讓持久化文件體積更小,恢復(fù)更快呢?
回顧一下我們前面講到的,RDB 和 AOF 各自的特點:
- RDB 以二進(jìn)制 + 數(shù)據(jù)壓縮方式存儲,文件體積小
- AOF 記錄每一次寫命令,數(shù)據(jù)最全
我們可否利用它們各自的優(yōu)勢呢?
當(dāng)然可以,這就是 Redis 的「混合持久化 」。
要想數(shù)據(jù)完整性更高,肯定就不能只用 RDB 了,重點還是要放在 AOF 優(yōu)化上。
具體來說,當(dāng) AOF 在做 rewrite 時,Redis 先以 RDB 格式在 AOF 文件中寫入一個數(shù)據(jù)快照,再把在這期間產(chǎn)生的每一個寫命令,追加到 AOF 文件中。
因為 RDB 是二進(jìn)制壓縮寫入的,這樣 AOF 文件體積就變得更小了。
因為 AOF 體積進(jìn)一步壓縮,你在使用 AOF 恢復(fù)數(shù)據(jù)時,這個恢復(fù)時間就會更短了!
Redis 4.0 以上版本才支持混合持久化。
注意:混合持久化是對 AOF rewrite 的優(yōu)化,這意味著使用它必須基于 AOF + AOF rewrite。
這么一番優(yōu)化,你的 Redis 再也不用擔(dān)心實例宕機(jī)了,當(dāng)發(fā)生宕機(jī)時,你就可以用持久化文件快速恢復(fù) Redis 中的數(shù)據(jù)。
但這樣就沒問題了嗎?
仔細(xì)想一下,雖然我們已經(jīng)把持久化的文件優(yōu)化到最小了,但在恢復(fù)數(shù)據(jù)時依舊是需要時間 的,在這期間你的業(yè)務(wù)應(yīng)用無法提供服務(wù),這怎么辦?
一個實例宕機(jī),只能用恢復(fù)數(shù)據(jù)來解決,那我們是否可以部署多個 Redis 實例,然后讓這些實例數(shù)據(jù)保持實時同步,這樣當(dāng)一個實例宕機(jī)時,我們在剩下的實例中選擇一個繼續(xù)提供服務(wù)就好了。
沒錯,這個方案就是接下來要講的「主從復(fù)制:多副本」。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/yudao-cloud
- 視頻教程:https://doc.iocoder.cn/video/
主從復(fù)制:多副本
你可以部署多個 Redis 實例,架構(gòu)模型就變成了這樣:
我們這里把實時讀寫的節(jié)點叫做 master,另一個實時同步數(shù)據(jù)的節(jié)點叫做 slave。
采用多副本的方案,它的優(yōu)勢是:
- 縮短不可用時間 :master 發(fā)生宕機(jī),我們可以手動把 slave 提升為 master 繼續(xù)提供服務(wù)
- 提升讀性能 :讓 slave 分擔(dān)一部分讀請求,提升應(yīng)用的整體性能
這個方案不錯,不僅節(jié)省了數(shù)據(jù)恢復(fù)的時間,還能提升性能。
但它的問題在于:當(dāng) master 宕機(jī)時,我們需要「手動」把 slave 提升為 master,這個過程也是需要花費時間的。
雖然比恢復(fù)數(shù)據(jù)要快得多,但還是需要人工介入處理。一旦需要人工介入,就必須要算上人的反應(yīng)時間、操作時間,所以,在這期間你的業(yè)務(wù)應(yīng)用依舊會受到影響。
我們是否可以把這個切換的過程,變成自動化?
哨兵:故障自動切換
要想自動切換,肯定不能依賴人了。
現(xiàn)在,我們可以引入一個「觀察者」,讓這個觀察者去實時監(jiān)測 master 的健康狀態(tài),這個觀察者就是「哨兵」。
具體如何做?
- 哨兵每間隔一段時間,詢問 master 是否正常
- master 正?;貜?fù),表示狀態(tài)正常,回復(fù)超時表示異常
- 哨兵發(fā)現(xiàn)異常,發(fā)起主從切換
有了這個方案,就不需要人去介入處理了,一切就變得自動化了,是不是很爽?
但這里還有一個問題,如果 master 狀態(tài)正常,但這個哨兵在詢問 master 時,它們之間的網(wǎng)絡(luò)發(fā)生了問題,那這個哨兵可能會「誤判 」。
這個問題怎么解決?
既然一個哨兵會誤判,那我們可以部署多個哨兵,讓它們分布在不同的機(jī)器上,讓它們一起監(jiān)測 master 的狀態(tài),流程就變成了這樣:
- 多個哨兵每間隔一段時間,詢問 master 是否正常
- master 正?;貜?fù),表示狀態(tài)正常,回復(fù)超時表示異常
- 一旦有一個哨兵判定 master 異常(不管是否是網(wǎng)絡(luò)問題),就詢問其它哨兵,如果多個哨兵(設(shè)置一個閾值)都認(rèn)為 master 異常了,這才判定 master 確實發(fā)生了故障
- 多個哨兵經(jīng)過協(xié)商后,判定 master 故障,則發(fā)起主從切換
所以,我們用多個哨兵互相協(xié)商來判定 master 的狀態(tài),這樣,就可以大大降低誤判的概率。
哨兵協(xié)商判定 master 異常后,這里還有一個問題:由哪個哨兵來發(fā)起主從切換呢?
答案是,選出一個哨兵「領(lǐng)導(dǎo)者」,由這個領(lǐng)導(dǎo)者進(jìn)行主從切換。
問題又來了,這個領(lǐng)導(dǎo)者怎么選?
想象一下,在現(xiàn)實生活中,選舉是怎么做的?
是的,投票。
在選舉哨兵領(lǐng)導(dǎo)者時,我們可以制定這樣一個選舉規(guī)則:
- 每個哨兵都詢問其它哨兵,請求對方為自己投票
- 每個哨兵只投票給第一個請求投票的哨兵,且只能投票一次
- 首先拿到超過半數(shù)投票的哨兵,當(dāng)選為領(lǐng)導(dǎo)者,發(fā)起主從切換
這個選舉的過程就是我們經(jīng)常聽到的:分布式系統(tǒng)領(lǐng)域中的「共識算法 」。
什么是共識算法?
我們在多個機(jī)器部署哨兵,它們需要共同協(xié)作完成一項任務(wù),所以它們就組成了一個「分布式系統(tǒng)」。
在分布式系統(tǒng)領(lǐng)域,多個節(jié)點如何就一個問題達(dá)成共識的算法,就叫共識算法。
在這個場景下,多個哨兵共同協(xié)商,選舉出一個都認(rèn)可的領(lǐng)導(dǎo)者,就是使用共識算法完成的。
這個算法還規(guī)定節(jié)點的數(shù)量必須是奇數(shù)個,這樣可以保證系統(tǒng)中即使有節(jié)點發(fā)生了故障,剩余超過「半數(shù)」的節(jié)點狀態(tài)正常,依舊可以提供正確的結(jié)果,也就是說,這個算法還兼容了存在故障節(jié)點的情況。
共識算法在分布式系統(tǒng)領(lǐng)域有很多,例如 Paxos、Raft,哨兵選舉領(lǐng)導(dǎo)者這個場景,使用的是 Raft 共識算法,因為它足夠簡單,且易于實現(xiàn)。
好,到這里我們先小結(jié)一下。
你的 Redis 從最簡單的單機(jī)版,經(jīng)過數(shù)據(jù)持久化、主從多副本、哨兵集群,這一路優(yōu)化下來,你的 Redis 不管是性能還是穩(wěn)定性,都越來越高,就算節(jié)點發(fā)生故障,也不用擔(dān)心了。
Redis 以這樣的架構(gòu)模式部署,基本上就可以穩(wěn)定運行很長時間了。
...
隨著時間的發(fā)展,你的業(yè)務(wù)體量開始迎來了爆炸性增長,此時你的架構(gòu)模型,還能夠承擔(dān)這么大的流量嗎?
我們一起來分析一下:
- 數(shù)據(jù)怕丟失 :持久化(RDB/AOF)
- 恢復(fù)時間久 :主從副本(副本隨時可切)
- 手動切換時間長 :哨兵集群(自動切換)
- 讀存在壓力 :擴(kuò)容副本(讀寫分離)
- 寫存在壓力 :一個 mater 扛不住怎么辦?
可見,現(xiàn)在剩下的問題是,當(dāng)寫請求量越來越大時,一個 master 實例可能就無法承擔(dān)這么大的寫流量了。
要想完美解決這個問題,此時你就需要考慮使用「分片集群」了。
分片集群:橫向擴(kuò)展
什么是「分片集群」?
簡單來講,一個實例扛不住寫壓力,那我們是否可以部署多個實例,然后把這些實例按照一定規(guī)則組織起來,把它們當(dāng)成一個整體,對外提供服務(wù),這樣不就可以解決集中寫一個實例的瓶頸問題嗎?
所以,現(xiàn)在的架構(gòu)模型就變成了這樣:
現(xiàn)在問題又來了,這么多實例如何組織呢?
我們制定規(guī)則如下:
- 每個節(jié)點各自存儲一部分?jǐn)?shù)據(jù),所有節(jié)點數(shù)據(jù)之和才是全量數(shù)據(jù)
- 制定一個路由規(guī)則,對于不同的 key,把它路由到固定一個實例上進(jìn)行讀寫
數(shù)據(jù)分多個實例存儲,那尋找 key 的路由規(guī)則需要放在客戶端來做,具體就是下面這樣:
這種方案也叫做「客戶端分片」,這個方案的缺點是,客戶端需要維護(hù)這個路由規(guī)則,也就是說,你需要把路由規(guī)則寫到你的業(yè)務(wù)代碼中。
如何做到不把路由規(guī)則耦合在客戶端業(yè)務(wù)代碼中呢?
繼續(xù)優(yōu)化,我們可以在客戶端和服務(wù)端之間增加一個「中間代理層」,這個代理就是我們經(jīng)常聽到的 Proxy,路由轉(zhuǎn)發(fā)規(guī)則,放在這個 Proxy 層來維護(hù)。
這樣,客戶端就無需關(guān)心服務(wù)端有多少個 Redis 節(jié)點了,只需要和這個 Proxy 交互即可。
Proxy 會把你的請求根據(jù)路由規(guī)則,轉(zhuǎn)發(fā)到對應(yīng)的 Redis 節(jié)點上,而且,當(dāng)集群實例不足以支撐更大的流量請求時,還可以橫向擴(kuò)容,添加新的 Redis 實例提升性能,這一切對于你的客戶端來說,都是透明無感知的。
業(yè)界開源的 Redis 分片集群方案,例如 Twemproxy、Codis 就是采用的這種方案。
這種方案的優(yōu)點在于,客戶端無需關(guān)心數(shù)據(jù)轉(zhuǎn)發(fā)規(guī)則,只需要和 Proxy 打交道,客戶端像操作單機(jī) Redis 那樣去操作后面的集群,簡單易用。
架構(gòu)演進(jìn)到目前為止,路由規(guī)則無論是客戶端來做,還是 Proxy 來做,都是「社區(qū)」演進(jìn)出來的分片解決方案,它們的特點是集群中的 Redis 節(jié)點,都不知道對方的存在,只有客戶端或 Proxy 才會統(tǒng)籌數(shù)據(jù)寫到哪里,從哪里讀取,而且它們都依賴哨兵集群負(fù)責(zé)故障自動切換。
也就是說我們其實就是把多個孤立的 Redis 節(jié)點,自己組合起來使用。
Redis 在 3.0 其實就推出了「官方」的 Redis Cluster 分片方案,但由于推出初期不穩(wěn)定,所以用的人很少,也因此業(yè)界涌現(xiàn)出了各種開源方案,上面講到的 Twemproxy、Codis 分片方案就是在這種背景下誕生的。
但隨著 Redis Cluster 方案的逐漸成熟,業(yè)界越來越多的公司開始采用官方方案(畢竟官方保證持續(xù)維護(hù),Twemproxy、Codis 目前都逐漸放棄維護(hù)了),Redis Cluster 方案比上面講到的分片方案更簡單,它的架構(gòu)如下。
Redis Cluster 無需部署哨兵集群,集群內(nèi) Redis 節(jié)點通過 Gossip 協(xié)議互相探測健康狀態(tài),在故障時可發(fā)起自動切換。
另外,關(guān)于路由轉(zhuǎn)發(fā)規(guī)則,也不需要客戶端自己編寫了,Redis Cluster 提供了「配套」的 SDK,只要客戶端升級 SDK,就可以和 Redis Cluster 集成,SDK 會幫你找到 key 對應(yīng)的 Redis 節(jié)點進(jìn)行讀寫,還能自動適配 Redis 節(jié)點的增加和刪除,業(yè)務(wù)側(cè)無感知。
雖然省去了哨兵集群的部署,維護(hù)成本降低了不少,但對于客戶端升級 SDK,對于新業(yè)務(wù)應(yīng)用來說,可能成本不高,但對于老業(yè)務(wù)來講,「升級成本」還是比較高的,這對于切換官方 Redis Cluster 方案有不少阻力。
于是,各個公司有開始自研針對 Redis Cluster 的 Proxy,降低客戶端的升級成本,架構(gòu)就變成了這樣:
這樣,客戶端無需做任何變更,只需把連接地址切到 Proxy 上即可,由 Proxy 負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù),以及應(yīng)對后面集群增刪節(jié)點帶來的路由變更。
至此,業(yè)界主流的 Redis 分片架構(gòu)已經(jīng)成型,當(dāng)你使用分片集群后,對于未來更大的流量壓力,也都可以從容面對了!
總結(jié)
總結(jié)一下,我們是如何從 0 到 1,再從 1 到 N 構(gòu)建一個穩(wěn)定、高性能的 Redis 集群的,從這之中你可以清晰地看到 Redis 架構(gòu)演進(jìn)的整個過程。
- 數(shù)據(jù)怕丟失 :持久化(RDB/AOF)
- 恢復(fù)時間久: 主從副本(副本隨時可切)
- 故障手動切換慢 :哨兵集群(自動切換)
- 讀存在壓力 :擴(kuò)容副本(讀寫分離)
- 寫存在壓力/容量瓶頸 :分片集群
- 分片集群社區(qū)方案 :Twemproxy、Codis(Redis 節(jié)點之間無通信,需要部署哨兵,可橫向擴(kuò)容)
- 分片集群官方方案 :Redis Cluster (Redis 節(jié)點之間 Gossip 協(xié)議,無需部署哨兵,可橫向擴(kuò)容)
- 業(yè)務(wù)側(cè)升級困難 :Proxy + Redis Cluster(不侵入業(yè)務(wù)側(cè))
至此,我們的 Redis 集群才得以長期穩(wěn)定、高性能的為我們的業(yè)務(wù)提供服務(wù)。
希望這篇文章可以幫你更好的理解 Redis 架構(gòu)的演進(jìn)之路。
-
架構(gòu)
+關(guān)注
關(guān)注
1文章
505瀏覽量
25420 -
高性能
+關(guān)注
關(guān)注
0文章
155瀏覽量
20360 -
Redis
+關(guān)注
關(guān)注
0文章
369瀏覽量
10810
原文標(biāo)題:Redis 架構(gòu)演化之路
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論