一致性Hash算法原理

前言

当在需要将数据分发到多个数据库/缓存,或将请求分发给多个服务节点时,不可避免的会遇到以下问题:
如何将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少。

选择节点的方法

随机放置

从多个节点中,随机挑选一个,实现简单但不能做到数据均匀分布到每个节点

Hash

将数据的key按 index = hash(key) % N选择节点。N代表有N个节点。此方法能将数据均匀的分发给每个节点,但在添加或修改节点时,即N发生变换时,所有数据都需要重新计算,扩展性差

一致性Hash

一致性Hash算法通过一个叫一致性Hash环的数据结构实现KEY到节点的映射。

将节点的唯一标识(ip, hostname)计算节点的hash值,并根据hash值将节点放置到放置到Hash环上。
在这里插入图片描述

随后用同样的hash函数计算key(数据)的hash值,将数据放置到Hash环,顺时针找到离数据最近的节点,此节点即为数据的接受节点。如图:key1所属节点为Node2
在这里插入图片描述

容错性

假设Node1宕机,key3的所属节点变为Node2,其他数据无需修改。当节点足够多时,某个节点宕机只会影响小部分的数据,保证了较好的容错性
在这里插入图片描述

扩展性

当加入新的节点Node4时,key3的所属节点变为Node4,其他数据无需修改。同样保证了只修改小部分数据,有较好的扩展性
在这里插入图片描述

虚拟节点

上述描述的算法仍然存在问题,当节点较少时会出现数据分布不均匀的情况:
多数key都在Node1,只有少部分在Node2
在这里插入图片描述

计算机领域有句话:计算机的任何问题都可以通过增加一个虚拟层来解决

解决上述一致性Hash算法带来的负载不均衡问题,可以通过虚拟层的手段:
将每个真实节点虚拟为一组虚拟节点,将虚拟节点放入Hash环,key在换上先找到虚拟节点,再得到真实节点信息。
如图,将每个节点虚拟为两个虚拟节点:

  • Node1: VNode10,VNode11
  • Node2: VNode20,VNode21

在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值