Hash取余

集群场景下,使用Hash(key)/N的方式将请求分配到某一个服务器上,N为服务器数量。存在的问题,当增加或者减少集群节点的时候,Hash(key)/N的结果将发生变化,导致数据大量读不到,进一步导致大量的请求同时打到DB上,增加DB压力。同时可能导致缓存雪崩的发生(大量缓存同时失效)。

一致性Hash算法

为了解决上述Hash取余方式的弊端,引入了一致性Hash算法。一致性hash算法本质上其实也是一种取模算法,不过,不同于上述按照服务器数量取模,而是对固定值2^32取模。
简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:
整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到232-1,也就是说0点左侧的第一个点代表232-1, 0和232-1在零点中方向重合,我们把这个由232个点组成的圆环称为Hash环。为什么hash环是对2^32取模?
因为IPV4的地址是由4组8位二进制数组成,所以用2^32可以保证每个IP地址会有唯一的映射

下一步将各个服务器使用Hash(ip)进行一次哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将有四台服务器使用IP地址哈希后在环空间的位置如下:

接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器!

例如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:

最终,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。

一致性Hash算法的容错性和可扩展性

现假设Node C不幸宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响,如下所示:

下面考虑另外一种情况,如果在系统中增加一台服务器Node X,如下图所示:

此时对象Object A、B、D不受影响,只有对象C需要重定位到新的Node X !一般的,在一致性Hash算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。
综上所述,一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

Hash环的数据倾斜问题

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器,其环分布如下:

此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性Hash算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。
例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算
“Node A#1”、
“Node A#2”、
“Node A#3”、
“Node B#1”、
“Node B#2”、
“Node B#3”的哈希值,于是形成六个虚拟节点:

同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。
如memche就使用的是一致性哈希算法做的分布式数据均衡策略。
原文链接:https://blog.csdn.net/bntX2jSQfEHy7/article/details/79549368

Hash槽

Redis Cluster在设计中使用数据分片引入哈希槽(hash slot);
一个 Redis Cluster包含16384(0~16383)个哈希槽,存储在Redis Cluster中的所有键都会被映射到这些slot中,集群中的每个键都属于这16384个哈希槽中的一个,集群使用公式slot=CRC16(key)/16384来计算key属于哪个槽。
集群的扩展
如当前集群有3个节点,槽默认是平均分的:
节点 A (6381)包含 0 到 5499号哈希槽.
节点 B (6382)包含5500 到 10999 号哈希槽.
节点 C (6383)包含11000 到 16383号哈希槽.
这种结构很容易添加或者删除节点, 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上, 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可,由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。

分布式路由策略(Hash取余,一致性Hash,Hash槽)相关推荐

  1. java hash取模,一致性hash算法及其java实现

    目录 背景 随着业务系统越来越大,我们需要对API的访问进行更多的缓存,使用Redis是一个很好的解决方案. 但是单台Redis性能不足够且迟早要走向集群的,那么怎么才能良好的利用Redis集群来进行 ...

  2. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

  3. java取余位运算_java学习--高效的除模取余运算(n-1)hash

    没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...

  4. 分布式缓存的路由策略

    分布式缓存的路由策略 为什么需要路由分发? 路由分发的策略 为什么需要路由分发? 在我们使用redis cluster集群的时候,由于其有多个主节点和多个从节点,不同于以往的一主多从,这多个主节点之间 ...

  5. java取余位运算_java位运算

    位移动运算符: < 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧 ...

  6. 分布式中hash取模算法

    hash算法 单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中.哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲 ...

  7. java hash 取模_Hash取模与一致性Hash

    取模最简单的hash算法 targetServer = serverList[hash(key) % serverList.size] 直接用key的hash值(计算key的hash值的方法可以自由选 ...

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

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

  9. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH

    转自:http://asyty.iteye.com/blog/1202072 一.Cassandra框架 二.Cassandra数据模型 Colum / Colum Family, SuperColu ...

最新文章

  1. markdown编辑器语法——背景色
  2. Dom查看数据库mysql_Linux中OS系统和MySQL数据库巡检生成html
  3. 美国将尝试区块链领域和加密货币相结合
  4. HM 内存池设计(2) HM6.0内存池设计
  5. 关于if...else语句的小注意
  6. 浅析javaIO的原理过程
  7. 算法的时间复杂度和空间复杂度-总结
  8. ueditor 图片水印 php,[UEditor]上传图片自动添加水印
  9. 小米平板2刷哪个系统更流畅_你想用什么系统的小米平板2,Win10还是MIUI7?
  10. 苹果服务器系统状态查询网站,mac电脑服务器地址怎么查看
  11. java webservice是什么_WebService的基本概念:java webservice,什么是webservice
  12. 计算机汉字录入试题,计算机等考试一级B上机试题——汉字录入题
  13. OA课程--word2013实用技巧大全-目录
  14. MFC实现窗口透明,并显示一张透明PNG图片
  15. 计算机上根号5怎么打,根号怎么打(5种快速输入√与×号的方法)
  16. 深入 javascript 之 原型和原型链!!!
  17. RGB565颜色表,附RGB888转RGB565工具,RGB24转RGB565工具
  18. SpringBoot实现导出Excel功能
  19. COLUMBIA电影公司片头的女人是谁
  20. 客户成功—以客户为中心,为客户创造价值

热门文章

  1. 2018年实现营收79.17亿元,科大讯飞能否决胜于人工智能时代?
  2. 【已解决】Activity MainActivity has leaked window PhoneWindow$DecorView@ that was originally added here
  3. 知乎客户端埋点流程、模型和平台技术
  4. 微信小程序的选择收货地址、新增地址、地址管理等模块的总结(1)
  5. Python 立体图形的画法(一)
  6. 计算机教学研修心得英语,研修心得体会(通用10篇)
  7. RabbitMQ消息队列详细教程
  8. darts-clone、RABIT交叉编译
  9. CAS配置数据库,实现数据库用户认证
  10. python批量打印pdf_通过Dynamo批量打印PDF图纸