天天看點

CASSANDRA學習筆記 (十二)再複習一下partition

Cassandra 橫向擴充(Scale Out),即通過增加叢集中節點數量來獲得水準擴充的能力,依賴于分區将資料進行切分并配置設定到各個節點中去。

目前,主要的分區方式有兩種:範圍分區(Range Partition)和哈希分區(Hash Partition)。其中,HBase 使用的範圍分區,Cassandra 使用的哈希分區。

一緻性哈希

Cassandra 采用了一緻性哈希(Consistent Hashing)算法,使得存取資料非常得快速和高效。

一緻性雜湊演算法将哈希空間按大小首尾相接形成一個環。每個節點被配置設定到環上的一到多個區域形成一個 token。

哈希空間使用一個 64 位的整型 ID 來辨別每一個分區,範圍從 -2^63 到 2^63 - 1。每個節點記錄環上前驅 token 和後繼 token 的位置,進而形成了一個環:

CASSANDRA學習筆記 (十二)再複習一下partition

根據哈希函數

hash(partition key)=token

,partitoin key 經過哈希函數計算獲得 token,通過 token 映射到節點上的資料。

Cassandra 預設的

Murmur3Partitioner

分區器,使用 murmur3 哈希函數,其有着非常良好的随機分布特性。

虛拟節點

一緻性雜湊演算法存在兩個潛在的問題:

  • 節點映射的環的位置是随機的,由此可能導緻負載不均衡;
  • 叢集存在機器異構性,即存在高配置機器,又存在低配置機器,而一緻性雜湊演算法并不進行區分,由此可能導緻低配置機器高負載。

虛拟節點(Virtual Nodes 或者 Vnodes)解除了節點與資料分布函數的耦合。

原來 token 與節點之間是一對一的關系,将 token 拆分對多個更小範圍的 token 之後,節點與 token 就是一對多的關系:

CASSANDRA學習筆記 (十二)再複習一下partition