数据结构 - 解决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 @   李若盛开  阅读(575)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示