【一天一個知識點系列】- Redis Cluser之資料分佈
阿新 • • 發佈:2021-01-20
# 資料分佈
## 簡述
+ 分散式資料庫首先要解決把整個資料集按照分割槽規則對映到多個節點的問題,即把資料集劃分到多個節點上,每個節點負責整體資料的一個子集
## 分割槽及限制
### 分割槽規則
+ 常見的分割槽規則
+ 順序分割槽
+ 雜湊分割槽,`Redis Cluser`使用此種分割槽規則
> + 雜湊分割槽和順序分割槽對比 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/751c79e85c3f438db8669a3baeda5dbe~tplv-k3u1fbpfcp-watermark.image)
> + 分散式儲存資料分割槽圖 ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2f9d2d1a18aa489e8618ee34ea444b73~tplv-k3u1fbpfcp-watermark.image)
### ① 雜湊分割槽型別
+ 1) 節點取餘分割槽
+ 規則:使用特定的資料,如`Redis`的鍵或使用者`ID`,再根據節點數量`N`使用公式:`hash(key)%N`計算出雜湊值,用來決定資料對映到哪一個節點上
+ 優點:簡單性
+ 缺點: 當節點數量變化時,如擴容或收縮節點,資料節點對映關係需要重新計算,會導致資料的重新遷移
+ 使用場景:資料庫的分庫分表規則,一般採用預分割槽的方式,提前根據資料量規劃好分割槽數,比如劃分為512或1024張表,保證可支撐未來一段時間的資料量,再根據負載情況將表遷移到其他資料庫中,擴容時通常採用翻倍擴容,避免資料對映全部被打亂導致全量遷移的情況
> + 翻倍擴容遷移約50%資料 ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1506fa97b7844d2c8e29d7d5a9985a16~tplv-k3u1fbpfcp-watermark.image)
+ 2) 一致性雜湊分割槽
+ 規則:為系統中每個節點分配一個`token`,範圍一般在0~232,這些`token`構成一個雜湊環。資料讀寫執行節點查詢操作時,先根據`key`計算`hash`值,然後順時針找到第一個大於等於該雜湊值的`token`節點
+ 優點:加入和刪除節點隻影響雜湊環中相鄰的節點,對其他節點無影響
+ 缺點:
+ 加減節點會造成雜湊環中部分資料無法命中,需要手動處理或者忽略這部分資料
+ 當使用少量節點時,節點變化將大範圍影響雜湊環中資料對映
+ 普通的一致性雜湊分割槽在增減節點時需要增加一倍或減去一半節點才能保證資料和負載的均衡
+ 使用場景:
+ 快取
+ 大量資料節點的分散式方案
> + 一致性雜湊資料分佈 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6eb2339d57dc4cd7844f82f78e396898~tplv-k3u1fbpfcp-watermark.image)
+ 3) 虛擬槽分割槽,`Redis Cluser`使用此種分割槽型別
+ 規則:虛擬槽分割槽巧妙地使用了雜湊空間,使用分散度良好的雜湊函式把所有資料對映到一個固定範圍的整數集合中,整數定義為槽(slot),這個範圍一般遠遠大於節點數,比如`Redis Cluster`槽範圍是0~16383。槽是叢集內資料管理和遷移的基本單位。採用大範圍槽的主要目的是為了方便資料拆分和叢集擴充套件
> + 槽集合與節點關係 ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ddf45d7f904a4ce4bf94a0ae9796326b~tplv-k3u1fbpfcp-watermark.image)
### ② `Redis`資料分割槽
+ `Redis Cluser`採用虛擬槽分割槽, 所有的鍵根據雜湊函式對映到`0~16383`整數槽內, 計算公式: `slot=CRC16(key) &16383`。 每一個節點負責維護一部分槽以及槽所對映的鍵值資料
+ 特點
+ 解耦資料和節點之間的關係, 簡化了節點擴容和收縮難度
+ 節點自身維護槽的對映關係, 不需要客戶端或者代理服務維護槽分割槽元資料
+ 支援節點、 槽、 鍵之間的對映查詢, 用於資料路由、 線上伸縮等場景
> + 使用CRC16(key) &16383將鍵對映到槽上 ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0414a61e6cf049a8b063e452bccc8e5f~tplv-k3u1fbpfcp-watermark.image)
### ③ `Redis`叢集功能限制
+ `Redis`叢集相對單機在功能上存在一些限制
+ `key`批量操作支援有限。如`mset`、 `mget`, 目前只支援具有相同`slot`值的`key`執行批量操作。 對於對映為不同`slot`值的`key`由於執行`mget`、 `mget`等操作可能存在於多個節點上因此不被支援
+ `key`事務操作支援有限,只支援多`key`在同一節點上的事務操作,當多個`key`分佈在不同的節點上時無法使用事務功能
+ `key`作為資料分割槽的最小粒度, 因此不能將一個大的鍵值物件如`hash`、 `list`等對映到不同的節點
+ 不支援多資料庫空間,單機下的`Redis`可以支援`16`個數據庫, 叢集模式下只能使用一個數據庫空間, 即`db0`
+ 複製結構只支援一層, 從節點只能複製主節點, 不支援巢狀樹狀複製結構
## 總結
+ 資料分割槽是分散式儲存的核心, 理解和靈活運用資料分割槽規則對於掌握`Redis Cluster`非常