数据结构 - 解决hash倾斜的方法

在日常工作中,经常有这样的情况,我们需要做hash散列分发数据到不同的区或节点。目标是结果要均匀散列,避免某个节点积累大量的数据,出现倾斜情况。

比如目前有N台机器,有数据key,需要做散列key%N分发到对应的节点上。如果节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题。

一致性哈希算法原理

为了解决hash倾斜难题,一致性算法是这样处理的,节点和节点形成一个环。

比如A->B->C->A这样一个环。数字hash后落在环上,而不是落到某个node。如果落在a~b node之间,通过顺时针转,这个数字归b节点管。但是如果节点很少,同样容易出现倾斜,负载不均衡问题。

所以一致性哈希算法引入了虚拟节点,在整个环上均衡增加若干个节点,一个实际节点将会映射多个虚拟节点,这样Hash环上的空间分割就会变得均匀。比如有虚拟节点a1,a2,b1,b2,c1,c2,其中a1和a2都是属于实际节点A。

 

同时,引入虚拟节点还会使得节点在Hash环上的顺序随机化,这意味着当一个真实节点失效退出后,它原来所承载的压力将会均匀地分散到其他节点上去。

                                     

通过让闭环上的节点增加,来平衡各个节点散列的值。因此即使很少的服务节点也能做到相对均匀的数据分布。

posted @ 2022-04-19 11:02  李若盛开  阅读(623)  评论(0)    收藏  举报