mycat 分片算法之一致性哈希算法
原理:
为将数据均匀分布在各个节点中。
对其进行哈希,取值在 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中。
以上。
优点:
一致性哈希算法在扩容,负载,平滑,分散,平衡,容灾表现良好。