Cassandra 橫向擴充(Scale Out),即通過增加叢集中節點數量來獲得水準擴充的能力,依賴于分區将資料進行切分并配置設定到各個節點中去。
目前,主要的分區方式有兩種:範圍分區(Range Partition)和哈希分區(Hash Partition)。其中,HBase 使用的範圍分區,Cassandra 使用的哈希分區。
一緻性哈希
Cassandra 采用了一緻性哈希(Consistent Hashing)算法,使得存取資料非常得快速和高效。
一緻性雜湊演算法将哈希空間按大小首尾相接形成一個環。每個節點被配置設定到環上的一到多個區域形成一個 token。
哈希空間使用一個 64 位的整型 ID 來辨別每一個分區,範圍從 -2^63 到 2^63 - 1。每個節點記錄環上前驅 token 和後繼 token 的位置,進而形成了一個環:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBHL0FWby9mZvwVZnFWbp1zczV2YvJHctM3cv1Ce-EkWolzRiVHZzI2a5kGVw4UbatkV6NFbkRkTzoEbTZnWywke5M0YvJkbMRjVHpVdsJDT0ljMZVHNXp1bOdFZ1wWblFTMtx0aWNjYz5kMMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
根據哈希函數
hash(partition key)=token
,partitoin key 經過哈希函數計算獲得 token,通過 token 映射到節點上的資料。
Cassandra 預設的
Murmur3Partitioner
分區器,使用 murmur3 哈希函數,其有着非常良好的随機分布特性。
虛拟節點
一緻性雜湊演算法存在兩個潛在的問題:
- 節點映射的環的位置是随機的,由此可能導緻負載不均衡;
- 叢集存在機器異構性,即存在高配置機器,又存在低配置機器,而一緻性雜湊演算法并不進行區分,由此可能導緻低配置機器高負載。
虛拟節點(Virtual Nodes 或者 Vnodes)解除了節點與資料分布函數的耦合。
原來 token 與節點之間是一對一的關系,将 token 拆分對多個更小範圍的 token 之後,節點與 token 就是一對多的關系: