前面講解了關(guān)于redis單機在大 數(shù)據(jù)量情況的所出現(xiàn)的瓶頸問題甜橱,并講解了通過redis 主從架構(gòu)和 哨兵集群結(jié)合葵腹,實現(xiàn)99.99% 高可用 咆畏、水平擴容支持更高QPS的解決方案燃异。
在大數(shù)據(jù)量面前,主從架構(gòu)結(jié)合哨兵集群的解決方案在復(fù)雜的配置下就顯得有些捉襟見肘了夯膀;數(shù)據(jù)量越大诗充,就愈明顯。所以本章從海量數(shù)據(jù)出發(fā)棍郎,redis cluster 集群架構(gòu)以更少的配置做更多的事其障。
redis cluster 集群架構(gòu) 的優(yōu)勢在哪呢?
支持水平擴容 N個redis master node涂佃,并且每個master node同樣可以掛載 N 個 slave node
讀寫分離的架構(gòu)(這個概念其實在redis cluster就沒有了,但是可以做蜈敢,因為redis cluster 更強調(diào)的是水平擴容)
高并發(fā)
高可用(無需sentinel 哨兵監(jiān)控辜荠,如果master 掛了,redis cluster 內(nèi)部自動 將slave 切換 master)
配置減少(相對 replication + sentinal 而已抓狭,就不需要手動搭建replication復(fù)制+主從架構(gòu)+讀寫分離+哨兵集群+高可用了)
redis cluster 和 replication + sentinal 比較伯病?
- 兩者都是解決redis 單機瓶頸問題(宕機不可用,低QPS,性能差等)
- 根據(jù)自身數(shù)據(jù)需求選擇合適解決方案
- 數(shù)據(jù)量很少(幾個G)午笛,redis 單機就可以解決
- 數(shù)據(jù)量大惭蟋, 一主多從(1 master N slave ,具體根據(jù)自身讀吞吐量而定) + 哨兵集群(sentinal 保證高可用)
-
海量數(shù)據(jù)药磺,redis cluster 集群(N master N slave 告组, 海量數(shù)據(jù) + 高并發(fā)+ 高可用)
redis cluster 數(shù)據(jù)分片
redis cluster 會對數(shù)據(jù)進(jìn)行自動分片,將數(shù)據(jù)分配到每個Master 上(自動的負(fù)載均衡)
redis cluster 所有節(jié)點直接都是相互連接的癌佩,它要求開放兩個端口木缝,一個端口負(fù)責(zé)對外數(shù)據(jù)交換(port:6379),另外一個端口用來內(nèi)部通信(port : 6379 + 10000 = 16379)围辙,也就是集群總線的通信(cluster bus)
- cluster bus 用來進(jìn)行故障檢測我碟,配置更新,故障轉(zhuǎn)移授權(quán)
- cluster bus 使用一種二進(jìn)制的協(xié)議姚建,主要用于節(jié)點間進(jìn)行高效的數(shù)據(jù)交換矫俺,占用更少的網(wǎng)絡(luò)帶寬和處理時間
redis cluster 使用什么樣的算法保證數(shù)據(jù)分片?
首先講下最原始的的 Hash 算法掸冤,如下圖所示:
其次講下一致性 Hash 算法(自動緩存遷移) + 虛擬節(jié)點(自動負(fù)載均衡)
一致性hash 算法 一定程度上解決了node宕機后的大部分?jǐn)?shù)據(jù)失效問題恳守,但是也會導(dǎo)致node 的熱點問題,降低性能贩虾,這個又該怎么解決呢催烘? 可以通過增加虛擬節(jié)點的方式 讓 hash 點散落更均勻 ,不光能解決熱點問題缎罢,還可以達(dá)到自動的負(fù)載均衡效果伊群。
redis cluster 采用的是 hash slot 算法
redis cluster 擁有固定的16384個slot (槽) ;這個槽是虛擬的策精,并不是真正存在舰始。slot 被 分布到 各個master 中,當(dāng) 某個key 映射到 某個master 負(fù)責(zé)的槽時咽袜,就由對應(yīng)的master 為key 提供服務(wù)
在redis cluster 中丸卷,只有master 才擁有對slot的所有權(quán),slave 只負(fù)責(zé)使用 slot询刹,并沒有所有權(quán)谜嫉。
那么 redis Cluster 又是如何知道哪些槽是由哪些節(jié)點負(fù)責(zé)的呢?Master 又是如何知道哪個槽是自己的呢凹联?
位序列結(jié)構(gòu)(節(jié)約存儲空間)
每個Master節(jié)點都維護(hù)著一個位序列沐兰,為16384 / 8 字節(jié);Master 節(jié)點 通過 bit 來標(biāo)識哪些槽自己是否擁有蔽挠。比如對于編號為1的槽住闯,Master只要判斷序列的第二位(索引從0開始)是不是為1即可。
集群同時維護(hù)著槽與集群節(jié)點的映射關(guān)系,由16384個長度的數(shù)組記錄比原,槽編號為數(shù)組的下標(biāo)插佛,數(shù)組內(nèi)容為集群節(jié)點,這樣就可以很快地通過槽編號找到負(fù)責(zé)這個槽的節(jié)點量窘。
鍵空間分布基本算法
下面看下redis cluster 是通過什么樣的方式進(jìn)行 分片存儲的
key 與 slot 的映射算法公式如下:
HASH_SLOT=CRC16(key) mod 16384
redis cluster 通過對每個key計算CRC16值雇寇,然后對16384取模,可以獲取key對應(yīng)的hash slot绑改,對于一批量數(shù)谢床,如果想讓批量數(shù)據(jù)都在同一個slot,可以通過hash tag來實現(xiàn)
redis cluster中每個master都會持有部分slot厘线,比如有3個master识腿,那么可能每個master持有5000多個hash slot
hash slot 讓 node 的增加和移除很簡單,增加一個master造壮,就將其他master的hash slot移動部分過去渡讼,減少一個master,就將它的hash slot移動到其他master上去
移動 hash slot 的成本是非常低的
由于 16384 是固定的耳璧,當(dāng)某個master 宕機時成箫,不會影響其他機器的數(shù)據(jù),因為key 找得是hash slot 旨枯,而不是機器
好了蹬昌,本章的 redis cluster 集群分析 就到這里。
以上就是本章內(nèi)容攀隔,如有不對的地方皂贩,請多多指教,謝謝昆汹!
為了方便有需要的人明刷,本系列全部軟件都在 https://pan.baidu.com/s/1qYsJZfY
下章預(yù)告:主要講解 redis cluster集群部署
作者:逐暗者 (轉(zhuǎn)載請注明出處)