Redis分片集群、數(shù)據(jù)讀寫(xiě)規(guī)則問(wèn)題小結(jié)
一、分片集群解決的問(wèn)題
盡管主從復(fù)制和哨兵模式解決了 Redis 的高可用和高并發(fā)讀的問(wèn)題,但它們?nèi)匀淮嬖趦蓚€(gè)主要限制:
- 海量數(shù)據(jù)存儲(chǔ)問(wèn)題:所有數(shù)據(jù)都存儲(chǔ)在一個(gè) Master 節(jié)點(diǎn)上,單個(gè)節(jié)點(diǎn)的內(nèi)存容量是有限的。當(dāng)數(shù)據(jù)量非常大時(shí),一個(gè) Master 節(jié)點(diǎn)無(wú)法承載。
- 高并發(fā)寫(xiě)的問(wèn)題:所有的寫(xiě)操作都集中在 Master 節(jié)點(diǎn)上,單個(gè) Master 節(jié)點(diǎn)的寫(xiě)能力是有限的。當(dāng)寫(xiě)請(qǐng)求非常多時(shí),Master 節(jié)點(diǎn)可能會(huì)成為瓶頸。
分片集群就是為了正是為了突破解決高并發(fā)寫(xiě)和海量數(shù)據(jù)存儲(chǔ)上的瓶頸。
二、分片集群圖解
分片集群特征
- 集群中有多個(gè)master,每個(gè)master保存不同數(shù)據(jù)(每個(gè)分片數(shù)據(jù)是不同的,分片內(nèi)主從數(shù)據(jù)是相同的)
- (分片內(nèi))每個(gè)master都可以有多個(gè)slave節(jié)點(diǎn)
- (不同分片間)master之間通過(guò)ping監(jiān)測(cè)彼此健康狀態(tài)
- 客戶端請(qǐng)求可以訪問(wèn)集群任意節(jié)點(diǎn),最終都會(huì)被轉(zhuǎn)發(fā)到正確節(jié)點(diǎn)
如何解決的上述問(wèn)題?(與哨兵模式對(duì)比)
特征 | 分片集群 | 哨兵模式 |
---|---|---|
數(shù)據(jù)分布 | 數(shù)據(jù)分散在多個(gè) Master 節(jié)點(diǎn)(數(shù)據(jù)分片) | 所有數(shù)據(jù)在一個(gè) Master 節(jié)點(diǎn)(全量復(fù)制) |
解決問(wèn)題 | 海量數(shù)據(jù)存儲(chǔ)、高并發(fā)寫(xiě) | 高可用、高并發(fā)讀 |
高可用實(shí)現(xiàn) | 集群內(nèi)部 Master 節(jié)點(diǎn)互相協(xié)商故障轉(zhuǎn)移 | 外部獨(dú)立 Sentinel 集群負(fù)責(zé)故障轉(zhuǎn)移 |
健康監(jiān)測(cè) | Master 節(jié)點(diǎn)之間互相監(jiān)測(cè) | Sentinel 監(jiān)測(cè) Master/Slave |
節(jié)點(diǎn)間通信 | Master 之間通過(guò)集群總線,Master 與 Slave 數(shù)據(jù)同步 | Sentinel 與 Redis 節(jié)點(diǎn),Sentinel 之間 |
客戶端連接 | 連接任意節(jié)點(diǎn),通過(guò)重定向找到正確節(jié)點(diǎn) | 通過(guò) Sentinel 獲取 Master 地址,直接連接 Master |
復(fù)雜性 | 相對(duì)復(fù)雜(數(shù)據(jù)分片、槽管理、數(shù)據(jù)遷移等) | 相對(duì)簡(jiǎn)單 |
使用場(chǎng)景
例如,在電商、在線課程等類型項(xiàng)目中,如果課程數(shù)量、用戶數(shù)量或活動(dòng)數(shù)據(jù)量非常龐大,單個(gè) Redis 實(shí)例無(wú)法承載時(shí),可以考慮使用分片集群:
- 存儲(chǔ)海量課程信息:將不同的課程信息分散到不同的 Master 節(jié)點(diǎn)上,例如按照課程ID的哈希值進(jìn)行分片。
- 處理高并發(fā)的寫(xiě)操作:例如在大型促銷活動(dòng)中,用戶頻繁修改個(gè)人信息、購(gòu)物車等,這些寫(xiě)操作可以分散到不同的 Master 節(jié)點(diǎn)上處理,提高整體的處理能力。
三、分片集群下的數(shù)據(jù)讀寫(xiě)
面試官:你提到分片集群解決了海量數(shù)據(jù)存儲(chǔ)和高并發(fā)寫(xiě)的問(wèn)題,那么它是如何決定一個(gè)key應(yīng)該存儲(chǔ)在哪個(gè)Master節(jié)點(diǎn)上的呢?
答:Redis 分片集群采用哈希槽 (Hash Slot) 的方式來(lái)管理數(shù)據(jù)。整個(gè)集群共有 16384 個(gè)哈希槽。每個(gè) key 在存儲(chǔ)時(shí),會(huì)根據(jù)其 key 的哈希值計(jì)算出一個(gè)槽號(hào)(通常是
CRC16(key) % 16384
)。集群中的每個(gè) Master 節(jié)點(diǎn)負(fù)責(zé)管理一部分哈希槽。客戶端根據(jù) key 計(jì)算出槽號(hào)后,就知道應(yīng)該去哪個(gè) Master 節(jié)點(diǎn)操作這個(gè) key。
圖示key的存儲(chǔ)過(guò)程
四、總結(jié)及缺點(diǎn)
分片集群(Redis Cluster) :是一種分布式解決方案,它通過(guò)將數(shù)據(jù)分散存儲(chǔ)在多個(gè) Master 節(jié)點(diǎn)上,來(lái)解決海量數(shù)據(jù)存儲(chǔ)和高并發(fā)寫(xiě)的問(wèn)題。每個(gè) Master 節(jié)點(diǎn)負(fù)責(zé)一部分?jǐn)?shù)據(jù)(通過(guò)哈希槽分配),并且可以有自己的 Slave 節(jié)點(diǎn)來(lái)保證高可用。
缺點(diǎn)和局限性:
集群間通信開(kāi)銷:集群之間的心跳檢測(cè)和數(shù)據(jù)通信會(huì)消耗大量的網(wǎng)絡(luò)帶寬
對(duì) Lua 腳本和事務(wù)支持有限:Redis 的 Lua 腳本和事務(wù)通常要求操作的 key 都在同一個(gè)節(jié)點(diǎn)上;在分片集群中,如果一個(gè) Lua 腳本或事務(wù)需要操作分布在不同 Master 節(jié)點(diǎn)上的 key,將無(wú)法執(zhí)行
維護(hù)復(fù)雜
數(shù)據(jù)遷移復(fù)雜
客戶端復(fù)雜
到此這篇關(guān)于Redis分片集群、數(shù)據(jù)讀寫(xiě)規(guī)則問(wèn)題小結(jié)的文章就介紹到這了,更多相關(guān)redis分片集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Redis命令和鍵_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Redis命令用于在redis服務(wù)器上執(zhí)行某些操作,下面通過(guò)本文給大家分享Redis命令和鍵,需要的的朋友參考下吧2017-08-08全網(wǎng)最完整的Redis新手入門指導(dǎo)教程
這篇文章主要給大家介紹了Redis新手入門的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11redis哈希和集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis哈希和集合的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Redis配置文件redis.conf詳細(xì)配置說(shuō)明
本文列出了Redis的配置文件redis.conf的各配置項(xiàng)的詳細(xì)說(shuō)明,簡(jiǎn)單易懂2018-03-03Redis5之后版本的高可用集群搭建的實(shí)現(xiàn)
這篇文章主要介紹了Redis5之后版本的高可用集群搭建的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04redis保存AtomicInteger對(duì)象踩坑及解決
這篇文章主要介紹了redis保存AtomicInteger對(duì)象踩坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Redis list 類型學(xué)習(xí)筆記與總結(jié)
這篇文章主要介紹了Redis list 類型學(xué)習(xí)筆記與總結(jié),本文著重講解了關(guān)于List的一些常用方法,比如lpush 方法、lrange 方法、rpush 方法、linsert 方法、 lset 方法等,需要的朋友可以參考下2015-06-0616個(gè)Redis的常見(jiàn)使用場(chǎng)景
這篇文章主要介紹了Redis 常見(jiàn)使用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下文2021-08-08kubernetes環(huán)境部署單節(jié)點(diǎn)redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了kubernetes環(huán)境部署單節(jié)點(diǎn)redis數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01