Redis(開發與運維):46---集羣之(數據分佈理論、Redis數據分區方法(槽)、Redis集羣功能限制)

一、Redis集羣功能的發展

  • Redis Cluster是Redis的分佈式解決方案,在3.0版本正式推出,有效地解決了Redis分佈式方面的需求。當遇到單機內存、併發、流量等瓶頸時,可以採用Cluster架構方案達到負載均衡的目的
  • 在Redis 3.0之前,Redis分佈式方案一般有兩種:
    • 客戶端分區方案,優點是分區邏輯可控,缺點是需要自己處理數據路 由、高可用、故障轉移等問題
    • 代理方案,優點是簡化客戶端分佈式邏輯和升級維護便利,缺點是加 重架構部署複雜度和性能損耗

二、數據分佈理論

  • 分佈式數據庫首先要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每個節點負責整體數據的一個子集。 如下圖所示:

  • 需要重點關注的是數據分區規則。常見的分區規則有哈希分區和順序分區兩種,下圖對這兩種分區規則進行了對比:

  • 由於Redis Cluster採用哈希分區規則,這裏我們重點討論哈希分區,常見的哈希分區規則有幾種,下面分別介紹

①節點取餘分區

  • 使用特定的數據,如Redis的鍵或用戶ID,再根據節點數量N使用公式: hash(key)%N計算出哈希值,用來決定數據映射到哪一個節點上
  • 這種方案存在一個問題:當節點數量變化時,如擴容或收縮節點,數據節點映射關 系需要重新計算,會導致數據的重新遷移
  • 這種方式的突出優點是:簡單性,常用於數據庫的分庫分表規則,一般採用預分區的方式,提前根據數據量規劃好分區數,比如劃分爲512或1024張表,保證可支撐未來一段時間的數據量,再根據負載情況將表遷移到其他數 據庫中。擴容時通常採用翻倍擴容,避免數據映射全部被打亂導致全量遷移的情況,如下圖所示

②一致性哈希分區

  • 一致性哈希分區(Distributed Hash Table)實現思路是:爲系統中每個節點分配一個token,範圍一般在0~2^{32},這些token構成一個哈希環。數據讀寫執行節點查找操作時,先根據key計算hash值,然後順時針找到第一個大於等於該哈希值的token節點,如下圖所示

  • 這種方式相比節點取餘最大的好處在於加入和刪除節點隻影響哈希環中相鄰的節點,對其他節點無影響
  • 但一致性哈希分區存在幾個問題:
    • 加減節點會造成哈希環中部分數據無法命中,需要手動處理或者忽略這部分數據,因此一致性哈希常用於緩存場景
    • 當使用少量節點時,節點變化將大範圍影響哈希環中數據映射,因此 這種方式不適合少量數據節點的分佈式方案
    • 普通的一致性哈希分區在增減節點時需要增加一倍或減去一半節點才 能保證數據和負載的均衡
  • 正因爲一致性哈希分區的這些缺點,一些分佈式系統採用虛擬槽對一致比如Dynamo系統

③虛擬槽分區

  • 實現思路爲:
    • 虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有數據映射到一個固定範圍的整數集合中,整數定義爲槽(slot)。這個範圍 一般遠遠大於節點數,比如Redis Cluster槽範圍是0~16383
    • 槽是集羣內數據管理和遷移的基本單位。採用大範圍槽的主要目的是爲了方便數據拆分和集羣擴展。每個節點會負責一定數量的槽
  • 如下圖所示:當前集羣有5個節點,每個節點平均大約負責3276個槽

  • 由於採用高質 量的哈希算法,每個槽所映射的數據通常比較均勻,將數據平均劃分到5個節點進行數據分區
  • Redis Cluster就是採用虛擬槽分區,下面就介紹Redis數據分區方法

三、Redis數據分區(槽分區)

  • Redis Cluser採用虛擬槽分區,所有的鍵根據哈希函數映射到0~16383整數槽內,計算公式:slot=CRC16(key)&16383。每一個節點負責維護一部 分槽以及槽所映射的鍵值數據,如下圖所示

 

  • Redis虛擬槽分區的特點:
    • 解耦數據和節點之間的關係,簡化了節點擴容和收縮難度
    • 節點自身維護槽的映射關係,不需要客戶端或者代理服務維護槽分區 元數據
    • 支持節點、槽、鍵之間的映射查詢,用於數據路由、在線伸縮等場景
  • 數據分區是分佈式存儲的核心,理解和靈活運用數據分區規則對於掌握 Redis Cluster非常有幫助

四、Redis集羣功能限制

  • Redis集羣相對單機在功能上存在一些限制,需要開發人員提前瞭解, 在使用時做好規避。限制如下:
    • 1)key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的 key執行批量操作。對於映射爲不同slot值的key由於執行mget、mget等操作可 能存在於多個節點上因此不被支持
    • 2)key事務操作支持有限。同理只支持多key在同一節點上的事務操 作,當多個key分佈在不同的節點上時無法使用事務功能
    • 3)key作爲數據分區的最小粒度,因此不能將一個大的鍵值對象如 hash、list等映射到不同的節點
    • 4)不支持多數據庫空間。單機下的Redis可以支持16個數據庫,集羣模 式下只能使用一個數據庫空間,即db0
    • 5)複製結構只支持一層,從節點只能複製主節點,不支持嵌套樹狀復 制結構
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章