分布式存储和一致性哈希

1、什么是一致性哈希

在动态变化的cache环境中,哈希算法应满足4个适应条件:

均衡性:哈希的结果能够尽可能分布到所有的缓存中去

单调性:当缓冲区大小变化时一致性哈希尽量保护已分配的内容不会被重新映射到新缓冲区

分散性:在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。

负载:另一个维度的分散性问题,对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。


一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中。


2、为什么要一致性哈希

如果哈希函数的散列特性很好,哈希方式可以将数据比较均匀的分不到集群中去。而且哈希方式需要记录的元信息很简单,每个节点只需要知道哈希函数的计算方式以及模的服务器个数就可以计算出处理的数据应该属于哪台机器。然而,找出一个散列特性和那后的哈希函数非常困难。

因为:一,如果按照主键散列,同一个用户ID下的数据可能被分散到多台服务器,使得一次操作同一个用户ID下的多条记录变得困难;

二,按照用户ID散列,用户数据量的大小会导致数据倾斜问题,造成某一台服务器负载过大,需要拆分到多台服务器上。


再者,当服务器上下线的时候,N值发生变化,数据映射关系被打乱,需要重新分布,带来大量的数据迁移。

因此,引入DHT算法。


3、一致性哈希原理

首先,求出每个服务器的hash值,将其配置到一个 0~2^n 的圆环上(n通常取32)

其次,用同样的方法求出待存储对象的主键 hash值,也将其配置到这个圆环上

再次,从数据映射到的位置开始顺时针查找,将数据分布到找到的第一个服务器节点上


一致性hash的优点在于加入和删除节点时只会影响到在哈希还种相邻的节点,而对其他节点没有影响。

加入节点如下图所示:


新增服务器5,某些原来分布到服务器4的数据需要迁移到服务器5,其他数据保持不变。避免了数据迁移。

删除节点如下图所示:


删除服务器3,原来分布在服务器3上的数据迁移到服务器4上去。


这样就没有问题了吗?不是

在增加节点5时,虽然只影响到节点4的数据分布,但当节点4需要迁移的数据过多时,整个集群的负载不均衡。

想法:将需要迁移的数据分散到整个集群,没太服务器只需迁移 1/N 的数据量即可。这就引入了虚拟节点的概念。


考虑到节点的异构性,不同节点的处理能力差别可能很大,每个物理节点根据其性能的差异分配多个 token, 每个 token 对应一个“虚拟节点”,每个虚拟节点的处理能力基本相当,并随机分配在哈希空间中。存储时,数据安装哈希值落到某个虚拟节点负责的区域,然后被存储在该虚拟节点对应的物理节点中。

例:4服务器为例,引入虚拟节点,假设每台服务器处理能力一样,且分配2个token,共有8个“虚拟节点”分部在环形区域上,缓解了映射不均的情况。如下图所示:



引入了“虚拟节点”后,映射关系发生了变化;【对象--->服务器】……>【对象--->虚拟节点---> 服务器】

查询对象所在服务器的映射关系如下图所示:




4、怎样实现的

// TODO: 


声明:图片来源于网络,画的比较生动,就省得自己画了。看到很多平台都使用该图,故无法注明具体出处,侵删

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值