【一天一個知識點系列】- Redis Cluser之數據分佈

數據分佈

簡述

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

分區及限制

分區規則

  • 常見的分區規則
    • 順序分區
    • 哈希分區,Redis Cluser使用此種分區規則
  • 哈希分區和順序分區對比
  • 分佈式存儲數據分區圖

① 哈希分區類型

    1. 節點取餘分區
    • 規則:使用特定的數據,如Redis的鍵或用戶ID,再根據節點數量N使用公式:hash(key)%N計算出哈希值,用來決定數據映射到哪個節點上
    • 優勢:簡單性
    • 缺點: 當節點數量變化時,如擴容或收縮節點,數據節點映射關係須要從新計算,會致使數據的從新遷移
    • 使用場景:數據庫的分庫分表規則,通常採用預分區的方式,提早根據數據量規劃好分區數,好比劃分爲512或1024張表,保證可支撐將來一段時間的數據量,再根據負載狀況將表遷移到其餘數據庫中,擴容時一般採用翻倍擴容,避免數據映射所有被打亂致使全量遷移的狀況
    • 翻倍擴容遷移約50%數據
    1. 一致性哈希分區
    • 規則:爲系統中每一個節點分配一個token,範圍通常在0~232,這些token構成一個哈希環。數據讀寫執行節點查找操做時,先根據key計算hash值,而後順時針找到第一個大於等於該哈希值的token節點
    • 優勢:加入和刪除節點隻影響哈希環中相鄰的節點,對其餘節點無影響
    • 缺點:
      • 加減節點會形成哈希環中部分數據沒法命中,須要手動處理或者忽略這部分數據
      • 當使用少許節點時,節點變化將大範圍影響哈希環中數據映射
      • 普通的一致性哈希分區在增減節點時須要增長一倍或減去一半節點才能保證數據和負載的均衡
    • 使用場景:
      • 緩存
      • 大量數據節點的分佈式方案
    • 一致性哈希數據分佈
    1. 虛擬槽分區,Redis Cluser使用此種分區類型
    • 規則:虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把全部數據映射到一個固定範圍的整數集合中,整數定義爲槽(slot),這個範圍通常遠遠大於節點數,好比Redis Cluster槽範圍是0~16383。槽是集羣內數據管理和遷移的基本單位。採用大範圍槽的主要目的是爲了方便數據拆分和集羣擴展
      • 槽集合與節點關係

Redis數據分區

  • Redis Cluser採用虛擬槽分區, 全部的鍵根據哈希函數映射到0~16383整數槽內, 計算公式: slot=CRC16(key) &16383。 每個節點負責維護一部分槽以及槽所映射的鍵值數據
    • 特色
      • 解耦數據和節點之間的關係, 簡化了節點擴容和收縮難度
      • 節點自身維護槽的映射關係, 不須要客戶端或者代理服務維護槽分區元數據
      • 支持節點、 槽、 鍵之間的映射查詢, 用於數據路由、 在線伸縮等場景
    • 使用CRC16(key) &16383將鍵映射到槽上

Redis集羣功能限制

  • Redis集羣相對單機在功能上存在一些限制
    • key批量操做支持有限。如msetmget, 目前只支持具備相同slot值的key執行批量操做。 對於映射爲不一樣slot值的key因爲執行mgetmget等操做可能存在於多個節點上所以不被支持
    • key事務操做支持有限,只支持多key在同一節點上的事務操做,當多個key分佈在不一樣的節點上時沒法使用事務功能
    • key做爲數據分區的最小粒度, 所以不能將一個大的鍵值對象如hashlist等映射到不一樣的節點
    • 不支持多數據庫空間,單機下的Redis能夠支持16個數據庫, 集羣模式下只能使用一個數據庫空間, 即db0
    • 複製結構只支持一層, 從節點只能複製主節點, 不支持嵌套樹狀複製結構

總結

  • 數據分區是分佈式存儲的核心, 理解和靈活運用數據分區規則對於掌握Redis Cluster很是有幫助
相關文章
相關標籤/搜索