分布式算法 Consistent Hashing

对于水平划分的分布式应用中,我们需要一个一致性的算法把业务需求均衡的分发到后台机器上。

hash取余
根据 id%machine_count 来获取机器号,id可以是用户id,crc算的某段数据或名等(要求散列性好即可)


增删集群节点对数据的影响
      10W个数据,节点从100改成101
      则命中率只有100/10W=0.1%
      这样将导致大量的数据迁移或缓存失效。而且影响随着数据量的增加,比例还会提升

 

 

基于range数据的hash取余
它对上者进行了扩展,对id进行分组,以500为一个区间,(id/500)% machine_count来获取机器号。


增删集群节点对数据的影响
10W个数据中,节点100改成101
命中率 100/(10W/500)=50%
这种情况比上者好一些,但是依旧不可接受,而且同时存在对数据量的依赖问题

 

 

Consistent Hashing
预先分配足够多的节点比如1K。然后把实际的节点分配到这些虚拟节点上,比如1~5和100~105对应node1,11~15和200~205对应node2。id%virture_count来获取虚拟节点号,接着根据map表得到实际节点号。

(也有二次hash去映射虚拟节点和物理节点)


增删集群节点对数据的影响
修改映射表中 1/node_count+1的数据,使之对应新增节点,同时这些虚拟节点上的数据也是需要迁移或者失效的数据。 对数据的影响就是 1/node_count。如果之前是100个节点,影响度就是1%,而且不会因为数据量的增大而有所波动


 

 

总结

本次介绍了consistent hash算法,目前有memcached,swift等使用了。后期随着海量服务,云服务等业务发展,该算法将会更广泛应用。


你可能感兴趣的:(分布式算法 Consistent Hashing)