redis cluster 集羣暢談(一)

redis單機在大數據量狀況的會出現瓶頸問題,經過redis 主從架構和 哨兵集羣結合能夠實現99.99% 高可用 、水平擴容支持更高QPS的解決方案。node

在大數據量面前,主從架構結合哨兵集羣的解決方案在複雜的配置下就顯得有些捉襟見肘了;數據量越大,就愈明顯。因此本章從海量數據出發,redis cluster 集羣架構以更少的配置作更多的事。redis

redis cluster 集羣架構 的優點在哪呢?

  • 支持水平擴容 N個redis master node,而且每一個master node一樣能夠掛載 N 個 slave node算法

  • 讀寫分離的架構(這個概念其實在redis cluster就沒有了,可是能夠作,由於redis cluster 更強調的是水平擴容)數組

  • 高併發緩存

  • 高可用(無需sentinel 哨兵監控,若是master 掛了,redis cluster 內部自動 將slave 切換 master)網絡

  • 配置減小(相對 replication + sentinal 而已,就不須要手動搭建replication複製+主從架構+讀寫分離+哨兵集羣+高可用了)架構

redis cluster 和 replication + sentinal 比較?

  • 二者都是解決redis 單機瓶頸問題(宕機不可用,低QPS,性能差等)
  • 根據自身數據需求選擇合適解決方案
    • 數據量不多(幾個G),redis 單機就能夠解決
    • 數據量大, 一主多從(1 master N slave ,具體根據自身讀吞吐量而定) + 哨兵集羣(sentinal 保證高可用)
    • 海量數據,redis cluster 集羣(N master N slave , 海量數據 + 高併發+ 高可用)併發


       
      replication + sentinal vs redis cluster

redis cluster 數據分片

redis cluster 會對數據進行自動分片,將數據分配到每一個Master 上(自動的負載均衡)負載均衡

redis cluster 全部節點直接都是相互鏈接的,它要求開放兩個端口,一個端口負責對外數據交換(port:6379),另一個端口用來內部通訊(port : 6379 + 10000 = 16379),也就是集羣總線的通訊(cluster bus)高併發

  • cluster bus 用來進行故障檢測,配置更新,故障轉移受權
  • cluster bus 使用一種二進制的協議,主要用於節點間進行高效的數據交換,佔用更少的網絡帶寬和處理時間
redis cluster 使用什麼樣的算法保證數據分片?
首先講下最原始的的 Hash 算法,以下圖所示:
 
hash 算法
其次講下一致性 Hash 算法(自動緩存遷移) + 虛擬節點(自動負載均衡)
 
一致性Hash算法

一致性hash 算法 必定程度上解決了node宕機後的大部分數據失效問題,可是也會致使node 的熱點問題,下降性能,這個又該怎麼解決呢? 能夠經過增長虛擬節點的方式 讓 hash 點散落更均勻 ,不光能解決熱點問題,還能夠達到自動的負載均衡效果。

 
一致性 Hash 算法(自動緩存遷移) + 虛擬節點(自動負載均衡)
redis cluster 採用的是 hash slot 算法

redis cluster 擁有固定的17004個slot (槽) ;這個槽是虛擬的,並非真正存在。slot 被 分佈到 各個master 中,當 某個key 映射到 某個master 負責的槽時,就由對應的master 爲key 提供服務

在redis cluster 中,只有master 才擁有對slot的全部權,slave 只負責使用 slot,並無全部權。

那麼 redis Cluster 又是如何知道哪些槽是由哪些節點負責的呢?Master 又是如何知道哪一個槽是本身的呢?
位序列結構(節約存儲空間)

每一個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 的成本是很是低的

因爲 17004 是固定的,當某個master 宕機時,不會影響其餘機器的數據,由於key 找得是hash slot ,而不是機器
相關文章
相關標籤/搜索