前言

一致性哈希算法的设计目标是为了解决因特网中的热点问题,现在也被广泛应用在分布式系统中。

比如针对负载均衡问题,对hash值取模的算法扩展性差,当增加或者减少服务器时,映射关系可能会出现问题,采用一致性hash算法,就能较好的解决该问题。

Hash值取模算法存在的问题

比如,我们有海量的图片存储在服务器上,假如,现在有4台服务器,我们可以根据图片名称,采用hash算法,决定图片存储在哪台服务器。

如果现在需要增加服务器,那么存取图片的服务器的算法就会发生改变,比如增加一台服务器后,算法变为hash(a.jpg)/5,这时候计算结果不一定还是2,那么图片的位置就要发生改变。同理,减少服务器的话,也会存在相同问题。而且,所有的服务器都会受到影响。

一致性Hash算法

一致性Hash算法将哈希值映射的空间表示成一个虚拟圆环,一般可以设置映射值的范围是0----232-1,也就是说,我们得到的hash值要对232取模。该hash环可表示如下:

假如我们有四台服务器,我们可以选择服务器的ip或主机名作为关键字进行哈希,然后取模,每台机器就能在hash环上确定固定位置。如下图所示:

例如有Object A、Object B、Object C、Object D四个数据,经过哈希运算及取模后,在环空间上的位置如下图所示:

从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。也就是说Object A定位到Node A,Object B定位到Node B,Object C定位到Node C,Object D定位到Node D。

如果Node C这台服务器出现问题宕机,那么Objcet C定位到Node D这台服务器,所以当某台服务器出问题时,只会对顺时针方向的前一台机器产生影响,本例中,只会对Node D有影响。

同理,如果增加一台服务器Node X,计算后,定位到如下图所示位置:

那么Object C就会定位到Node X,这种情况,只会对顺时针方向的Node C产生影响,不会影响其他服务器。

一致性Hash的缺点

当服务器节点比较少的时候会出现一致性hash算法倾斜的问题(大部分数据存在一台服务器上)。在不改变服务器节点个数的前提下,一般解决方案是增加虚拟节点(即对每一个服务器根据一致性hash算法计算多个值,每个计算结果在环上定位一个服务节点),在定位数据时,就可以根据虚拟节点,定位到实际服务器。

总结

一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

本文来自千锋教育,转载请注明出处。

Java教程分享:五分钟了解一致性hash算法相关推荐

  1. 算法:五分钟了解一致性hash算法

    五分钟了解一致性hash算法 前言 一致性哈希算法的设计目标是为了解决因特网中的热点问题,现在也被广泛应用在分布式系统中. 比如针对负载均衡问题,对hash值取模的算法扩展性差,当增加或者减少服务器时 ...

  2. 五分钟了解一致性hash算法!

    前言 一致性哈希算法的设计目标是为了解决因特网中的热点问题,现在也被广泛应用在分布式系统中. 比如针对负载均衡问题,对hash值取模的算法扩展性差,当增加或者减少服务器时,映射关系可能会出现问题,采用 ...

  3. 10分钟了解一致性hash算法

    应用场景 当我们的数据表超过500万条或更多时,我们就会考虑到采用分库分表:当我们的系统使用了一台缓存服务器还是不能满足的时候,我们会使用多台缓存服务器,那我们如何去访问背后的库表或缓存服务器呢,我们 ...

  4. hibernate savealiasentity 保存后id为空_好程序员Java教程分享Java面试题之Hibernate

    好程序员Java教程分享Java面试题之Hibernate 1.简书一下Hibernated的开发流程 第一步:加载Hibernate的配置文件,读取配置文件的参数, 第二步:创建SessionFac ...

  5. java中forward和redirect_好程序员Java教程分享:Forward和Redirect的区别

    Java教程分享:Forward和Redirect的区别,用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉 ...

  6. PS新手教程!五分钟绘制一张半调效果的耐克体育海报

    编者按:今天@ATOM设计 来一个超容易上手的教程,五分钟可以绘制出耐克风格的运动海报,过程特别详细,零基础也可以快速搞定,适合没经验+临时要加急做海报的同学,素材和模版也都准备好了,来学一个! 原图 ...

  7. 好程序员Java教程分享之jvm篇

    好程序员java教程分享之jvm篇,在前面的文章中,介绍了JVM内存模型分为:堆区.虚拟机栈.方法区.本地方法区和程序计数器,其中堆区是JVM中最大的一块内存区域,在Java中的所有对象实例都保存在此 ...

  8. 好程序员Java教程分享JavaScript面试问题及答案(一)

    好程序员Java教程分享JavaScript面试问题及答案(一) 1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个 ...

  9. java static关键字_好程序员Java教程分享static关键字的理解

    好程序员Java教程分享static关键字的理解,static关键字含义可以理解为静态的. 1. 当其修饰属性时,该属性为整个类公有,所有的对象操作的都是同一个静态属性.所以调用时应该使用类名去调用, ...

最新文章

  1. ubuntu16.04 安装以及要做的事情
  2. CentOS6.4_X86_64 安装Drupal-7.31必须成功版!
  3. android 7.0 裁剪,Android 7.0中拍照和图片裁剪适配的问题详解
  4. C语言实现类似QQ聊天界面抖动功能
  5. matlab 泡泡图,使用matlab绘制2维、3维气泡图
  6. Postman使用小教程--基础入门篇
  7. android sdk 64 linux下载,64位Linux机器上的Android SDK
  8. Android M(6.0) 权限相关
  9. Hello Rails
  10. Mastering The Mix Total Bundle 2021 Mac - 混音插件合集
  11. android+图标自动排列,Android用RecyclerView实现图标拖拽排序以及增删管理
  12. 3D建模与处理软件简介 刘利刚 中国科技大学
  13. 卸载ie8的一些方法
  14. debian 5常用软件包名称,及安装方法
  15. C# 网上收集的一些所谓的开源项目
  16. 【092】韦达定理在一元n次方程中的推广
  17. CTF杂项小结--沙窝李的王
  18. Android App开发实战之实现微信记账本(附源码 超详细必看)
  19. Flying Saucer生成pdf报表
  20. 面部表情识别---学习笔记

热门文章

  1. HDU 1325 Is It A Tree? 并查集
  2. Numpy-浅拷贝和深拷贝
  3. 【SQL编程】Greenplum 实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
  4. mysql 安装只有一半_记一次MySQL安装出现的坑爹问题。。。
  5. spring配置数据源(加载properties文件)
  6. Typora——恢复未保存文件解决方案
  7. Spring Boot 内置Tomcat——集成JSP解决方案
  8. Substring Removal
  9. 问到ConcurrentHashMap不要再提Segment了
  10. 【CentOS Linux 7】实验5【Samba服务器管理】