原理:
為將數據均勻分布在各個節點中。
對其進行哈希,取值在 0 ~ 232-1 閉環中定位到順時針第一個節點,將此數據分配其中。
由於節點有限,可能取哈希分布不均。
設置虛擬節點比如160,先將哈希分布在160節點上,然后把對應的節點聚合到真實節點中。
舉例:
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默認是0 -->
<property name="count">3</property><!-- 要分片的數據庫節點數量,必須指定,否則沒法分片 -->
<property name="virtualBucketTimes">6</property><!-- 一個實際的數據庫節點被映射為這么多虛擬節點,默認是6倍,也就是虛擬節點數是物理節點數的6倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用於測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 -->
</function>
容災,擴容:
真實節點3個,比如:a,b,c;b宕機,原來要分配到b節點上的會分配到c上;加節點x到ac中間,原來分配到c節點的數據分配到x節點上。
虛擬節點:
虛擬節點6個,哈希:a1,a2; b1,b2; c1,c2
哈希到這6個中,然后將a1,a2中的合並到a中;b1,b2合並到b中。
以上。
優點:
一致性哈希算法在擴容,負載,平滑,分散,平衡,容災表現良好。
