频道栏目
IT货架 > > 正文
一致性哈希Java源码分析 memcached全面剖析–4. memcached的分布式算法 大型网站技术架构:核心原理与案例分析
网友分享于:Jun 12, 2018 11:40:40 PM    来源: IT货架   

  首次接触一致性哈希是在学习memcached的时候,为了解决分布式服务器的负载均衡或者说选路的问题,一致性哈希算法不仅能够使memcached服务器被选中的概率(数据分布)更加均匀,而且使得服务器的增加和减少对整个分布式存储的影响也较小,也就是说不会引起大范围的数据迁移。

  关于一致性哈希算法的原理和应用我就不多说了,网上一抓一大把,可以看这里这里、或者这里等等。直接上代码:

  KetamaNodeLocator类是实现一致性哈希环的类,记录了所有的服务器节点(虚拟服务器)在环上的位置,以及服务器节点本身的信息(存放在Node中),同时还提供了一个根据key值在Hash环上顺时针寻找一个最近的虚拟服务器节点的方法。
  在多数博客上都有对虚拟服务器节点的使用做出解释,一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。就是说在物理服务器很少的时候,可能出现服务器节点通过Hash算法集中映射在环的某一部分,导致数据在映射的时候都分布到某一台或几台服务器上,无法达到负载均衡的目的,这也是违背我们使用分布式系统的初衷的。通过将一个物理节点虚拟成多个虚拟节点的方法,能够使得服务器(虚拟的)在Hash环上分布很均匀,避免出现以上的情况。在这里我还要补充一点使用虚拟服务器节点的作用,当一个分布式的集群在正常负载均衡的情况下所有服务器都饱和工作、达到极限值时,我们需要通过增加物理机器的方法来扩展整个分布式系统的性能,让新加入的服务器分担整个分布式系统上的数据压力。假如不使用虚拟节点,新加入的服务器经过Hash算法映射到环上的某一点,它只对顺时针方向上的下一个服务器产生影响,也就是说它只能分担一个服务器上的数据压力,对于其他的服务器,情况仍不容乐观。而使用虚拟节点,我们就能很好的解决这个问题。
  以上hash映射是通过MD5算法实现,MD5算法会产生一个16字节的数组,通过将其切成4段,每一段作为一个hash值生成唯一的标识。下面是hash算法的源码:

测试:

==========================神奇的分割线=========================

                           源码请猛戳{ 这里

===========================================================

 

参考资料:

一致性哈希算法及其在分布式系统中的应用

memcached全面剖析–4. memcached的分布式算法

大型网站技术架构:核心原理与案例分析

 


广告服务联系QQ:1134687142 | 网站地图

版权所有: IT货架- 内容来自互联网,仅供用于技术学习,请遵循相关法律法规. 京ICP备11030978号-1