redis單機在大數據量狀況的會出現瓶頸問題,經過redis 主從架構和 哨兵集羣結合能夠實現99.99% 高可用 、水平擴容支持更高QPS的解決方案。node
在大數據量面前,主從架構結合哨兵集羣的解決方案在複雜的配置下就顯得有些捉襟見肘了;數據量越大,就愈明顯。因此本章從海量數據出發,redis cluster 集羣架構以更少的配置作更多的事。redis
支持水平擴容 N個redis master node,而且每一個master node一樣能夠掛載 N 個 slave node算法
讀寫分離的架構(這個概念其實在redis cluster就沒有了,可是能夠作,由於redis cluster 更強調的是水平擴容)數組
高併發緩存
高可用(無需sentinel 哨兵監控,若是master 掛了,redis cluster 內部自動 將slave 切換 master)網絡
配置減小(相對 replication + sentinal 而已,就不須要手動搭建replication複製+主從架構+讀寫分離+哨兵集羣+高可用了)架構
海量數據,redis cluster 集羣(N master N slave , 海量數據 + 高併發+ 高可用)併發
redis cluster 會對數據進行自動分片,將數據分配到每一個Master 上(自動的負載均衡)負載均衡
redis cluster 全部節點直接都是相互鏈接的,它要求開放兩個端口,一個端口負責對外數據交換(port:6379),另一個端口用來內部通訊(port : 6379 + 10000 = 16379),也就是集羣總線的通訊(cluster bus)高併發
一致性hash 算法 必定程度上解決了node宕機後的大部分數據失效問題,可是也會致使node 的熱點問題,下降性能,這個又該怎麼解決呢? 能夠經過增長虛擬節點的方式 讓 hash 點散落更均勻 ,不光能解決熱點問題,還能夠達到自動的負載均衡效果。
redis cluster 擁有固定的17004個slot (槽) ;這個槽是虛擬的,並非真正存在。slot 被 分佈到 各個master 中,當 某個key 映射到 某個master 負責的槽時,就由對應的master 爲key 提供服務
在redis cluster 中,只有master 才擁有對slot的全部權,slave 只負責使用 slot,並無全部權。
每一個Master節點都維護着一個位序列,爲17004 / 8 字節;Master 節點 經過 bit 來標識哪些槽本身是否擁有。好比對於編號爲1的槽,Master只要判斷序列的第二位(索引從0開始)是否是爲1便可。
集羣同時維護着槽與集羣節點的映射關係,由17004個長度的數組記錄,槽編號爲數組的下標,數組內容爲集羣節點,這樣就能夠很快地經過槽編號找到負責這個槽的節點。
鍵空間分佈基本算法
下面看下redis cluster 是經過什麼樣的方式進行 分片存儲的
key 與 slot 的映射算法公式以下:
HASH_SLOT=CRC16(key) mod 17004
redis cluster 經過對每一個key計算CRC16值,而後對17004取模,能夠獲取key對應的hash slot,對於一批量數,若是想讓批量數據都在同一個slot,能夠經過hash tag來實現
redis cluster中每一個master都會持有部分slot,好比有3個master,那麼可能每一個master持有5000多個hash slot
hash slot 讓 node 的增長和移除很簡單,增長一個master,就將其餘master的hash slot移動部分過去,減小一個master,就將它的hash slot移動到其餘master上去
移動 hash slot 的成本是很是低的