1. 程式人生 > >redis cluster 集群暢談(一)

redis cluster 集群暢談(一)

比較 互連 下標 view bus 單機 strip 瓶頸 由於

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

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

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 擁有固定的16384個slot (槽) ;這個槽是虛擬的,並不是真正存在。slot 被 分布到 各個master 中,當 某個key 映射到 某個master 負責的槽時,就由對應的master 為key 提供服務

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

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

每個Master節點都維護著一個位序列,為16384 / 8 字節;Master 節點 通過 bit 來標識哪些槽自己是否擁有。比如對於編號為1的槽,Master只要判斷序列的第二位(索引從0開始)是不是為1即可。

集群同時維護著槽與集群節點的映射關系,由16384個長度的數組記錄,槽編號為數組的下標,數組內容為集群節點,這樣就可以很快地通過槽編號找到負責這個槽的節點。

鍵空間分布基本算法
下面看下redis cluster 是通過什麽樣的方式進行 分片存儲的

key 與 slot 的映射算法公式如下:

HASH_SLOT=CRC16(key) mod 16384

redis cluster 通過對每個key計算CRC16值,然後對16384取模,可以獲取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 的成本是非常低的

由於 16384 是固定的,當某個master 宕機時,不會影響其他機器的數據,因為key 找得是hash slot ,而不是機器

redis cluster 集群暢談(一)