一、前言

在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用。

但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进。

二、一致性Hash概述

为了能直观的理解一致性hash原理,这里结合一个简单的例子来讲解,假设有4台服务器,地址为ip1,ip2,ip3,ip4。

  • 一致性hash是首先计算四个ip地址对应的hash值
    hash(ip1),hash(ip2),hash(ip3),hash(ip3),计算出来的hash值是0~最大正整数直接的一个值,这四个值在一致性hash环上呈现如下图:

image.png

  • hash环上顺时针从整数0开始,一直到最大正整数,我们根据四个ip计算的hash值肯定会落到这个hash环上的某一个点,至此我们把服务器的四个ip映射到了一致性hash环
  • 当用户在客户端进行请求时候,首先根据hash(用户id)计算路由规则(hash值),然后看hash值落到了hash环的那个地方,根据hash值在hash环上的位置顺时针找距离最近的ip作为路由ip.

image.png

如上图可知user1,user2的请求会落到服务器ip2进行处理,User3的请求会落到服务器ip3进行处理,user4的请求会落到服务器ip4进行处理,user5,user6的请求会落到服务器ip1进行处理。

下面考虑当ip2的服务器挂了的时候会出现什么情况?
当ip2的服务器挂了的时候,一致性hash环大致如下图:

image.png

根据顺时针规则可知user1,user2的请求会被服务器ip3进行处理,而其它用户的请求对应的处理服务器不变,也就是只有之前被ip2处理的一部分用户的映射关系被破坏了,并且其负责处理的请求被顺时针下一个节点委托处理。

下面考虑当新增机器的时候会出现什么情况?
当新增一个ip5的服务器后,一致性hash环大致如下图:

image.png

根据顺时针规则可知之前user1的请求应该被ip1服务器处理,现在被新增的ip5服务器处理,其他用户的请求处理服务器不变,也就是新增的服务器顺时针最近的服务器的一部分请求会被新增的服务器所替代。

三、一致性hash的特性

  • 单调性(Monotonicity),单调性是指如果已经有一些请求通过哈希分派到了相应的服务器进行处理,又有新的服务器加入到系统中时候,应保证原有的请求可以被映射到原有的或者新的服务器中去,而不会被映射到原来的其它服务器上去。 这个通过上面新增服务器ip5可以证明,新增ip5后,原来被ip1处理的user6现在还是被ip1处理,原来被ip1处理的user5现在被新增的ip5处理。
  • 分散性(Spread):分布式环境中,客户端请求时候可能不知道所有服务器的存在,可能只知道其中一部分服务器,在客户端看来他看到的部分服务器会形成一个完整的hash环。如果多个客户端都把部分服务器作为一个完整hash环,那么可能会导致,同一个用户的请求被路由到不同的服务器进行处理。这种情况显然是应该避免的,因为它不能保证同一个用户的请求落到同一个服务器。所谓分散性是指上述情况发生的严重程度。好的哈希算法应尽量避免尽量降低分散性。 一致性hash具有很低的分散性
  • 平衡性(Balance):平衡性也就是说负载均衡,是指客户端hash后的请求应该能够分散到不同的服务器上去。一致性hash可以做到每个服务器都进行处理请求,但是不能保证每个服务器处理的请求的数量大致相同,如下图

服务器ip1,ip2,ip3经过hash后落到了一致性hash环上,从图中hash值分布可知ip1会负责处理大概80%的请求,而ip2和ip3则只会负责处理大概20%的请求,虽然三个机器都在处理请求,但是明显每个机器的负载不均衡,这样称为一致性hash的倾斜,虚拟节点的出现就是为了解决这个问题。

五、虚拟节点

当服务器节点比较少的时候会出现上节所说的一致性hash倾斜的问题,一个解决方法是多加机器,但是加机器是有成本的,那么就加虚拟节点,比如上面三个机器,每个机器引入1个虚拟节点后的一致性hash环的图如下:

image.png

其中ip1-1是ip1的虚拟节点,ip2-1是ip2的虚拟节点,ip3-1是ip3的虚拟节点。
可知当物理机器数目为M,虚拟节点为N的时候,实际hash环上节点个数为M*N。比如当客户端计算的hash值处于ip2和ip3或者处于ip2-1和ip3-1之间时候使用ip3服务器进行处理。

六、均匀一致性hash

上节我们使用虚拟节点后的图看起来比较均衡,但是如果生成虚拟节点的算法不够好很可能会得到下面的环:

image.png

可知每个服务节点引入1个虚拟节点后,情况相比没有引入前均衡性有所改善,但是并不均衡。

均衡的一致性hash应该是如下图:

image.png

均匀一致性hash的目标是如果服务器有N台,客户端的hash值有M个,那么每个服务器应该处理大概M/N个用户的。也就是每台服务器负载尽量均衡

七、总结

在分布式系统中一致性hash起着不可忽略的地位,无论是分布式缓存,还是分布式Rpc框架的负载均衡策略都有所使用。

hash地址_深入浅出一致性Hash原理相关推荐

  1. hash地址_一致性Hash在负载均衡中的应用

    作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...

  2. hash地址_到底什么是Hash?

    到底什么是hash hash算法的概念 Hash: 一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通 ...

  3. 分布式路由策略(Hash取余,一致性Hash,Hash槽)

    Hash取余 集群场景下,使用Hash(key)/N的方式将请求分配到某一个服务器上,N为服务器数量.存在的问题,当增加或者减少集群节点的时候,Hash(key)/N的结果将发生变化,导致数据大量读不 ...

  4. hash地址_redis中的hash扩容、渐进式rehash过程

    背景: redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash 对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度 ...

  5. mysql 字符串的hash函数_经典字符串Hash函数介绍 - yanjun_1982的专栏 - CSDNBlog

    作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数. 2.1 PHP中出现的字符串Hash函数 static unsigned long hashpjw(char *ar ...

  6. mysql 密码hash算法_如何用hash创建一个mySQL用户(‘sha256’,$salt.$password)?

    我肯定错过了什么. 我想为select-only事务设置数据库用户帐户,但mysql不允许我在创建用户帐户时选择密码的哈希方法. 这失败了: GRANT SELECT ON myDB.* TO 'se ...

  7. socket不能bind请求的地址_深入浅出讲解:php的socket通信

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...

  8. 简述冯诺依曼工作原理_深入浅出讲解计算机原理

    当前最先进的计算机都采用的是冯诺依曼体系结构,所以冯诺依曼是当之无愧的数字计算机之父. 冯诺依曼体系结构特点: (1)计算机处理的数据和指令一律用二进制数表示 (2)顺序执行程序 计算机运行过程中,把 ...

  9. 给面试官讲明白:一致性Hash的原理和实践

    戳蓝字"CSDN云计算"关注我们哦! 来源 | 靳刚同学 作者 | 靳刚 "一致性hash的设计初衷是解决分布式缓存问题,它不仅能起到hash作用,还可以在服务器宕机时, ...

最新文章

  1. php中const和static的区别和联系
  2. 中高德地图只显示某一城市_干货 | 如何快速制作数据地图?让你的可视化逼格再高一级!...
  3. ehcache常用API整理
  4. Linix中Dockerfile部署Spring Boot项目
  5. numpy功能快速查找
  6. java 零配置_Spring零配置之@Configuration注解详解
  7. Android NFC 标签 读写
  8. 目标检测:Object Detection in 20 Years: A Survey
  9. 手工制作夜光星星的方法
  10. 2018年迎春杯复赛入围名单(五年级)
  11. 【LeetCode】图解 904. 水果成篮
  12. Network: unavailable
  13. 几何均数怎样用计算机算,算术均数与几何均数的意义及计算方法
  14. canvas自定义多边形
  15. Jeg lurer p? om vi skulle v?re ? parajumpers jakke tenke p? hva som kan
  16. 计算机顶级会议Rankings
  17. 【附源码】计算机毕业设计java综合众筹网站设计与实现
  18. luogu2947向右看齐【栈】
  19. 2008世界旅游大使中国赛区总决赛在正定华丽落幕
  20. 中国大陆银行业金融机构法人名单(截至2020年末)

热门文章

  1. 全球知名大学课件下载地址汇总
  2. 设置DIV半透明CSS代码:
  3. 03_linux 常用命令(上)
  4. linux基础知识——创建进程
  5. 计算机网络概述(一)
  6. Leetcode--319. 灯泡开关
  7. bzoj5108 数据_成都day3t3
  8. windows查看dll库接口函数
  9. meanshift算法 java_Meanshift,聚类算法
  10. [matlab]斜阶梯式长条引起的重力异常计算