分布式系统中的一致性hash初探

  在分布式式系统中,为了分散访问压力,每一个模块须要由多个节点组成集群,共同来提供服务,客户端根据必定的负载均衡策略来访问集群的各个节点,由此引入了一些问题,如在访问压力增大的状况须要要增长节点,或是集群其中的一个节点忽然挂掉,如何将原有节点上的请求压力从新负载到新的节点集群上。算法

  咱们经常使用的负载均衡策略有随机(加权)、轮询,最小链接数、最短响应时间,哈希,以及咱们今天要说的一致性hash。后端

1、一致性hash与其余负载均衡策略的对比缓存

  首先咱们来分析下一致性hash相对前面几种负载均衡策略的优点,服务器

  轮询:各个服务器的性能可能不一致,该策略将节点视为等同,与实际中复杂的环境不符。加权轮询为轮询的一个改进策略,每一个节点会有权重属性,可是由于权重的设置难以作到随实际状况变化,仍有必定的不足并发

  随机:与轮询相似,根据不一样的随机算法随机访问各个节点,可经过加权作必定扩展。负载均衡

  最小响应时间:经过记录每次请求所需的时间,得出平均的响应时间,而后根据响应时间选择最小的响应时间。该策略能较好地反应服务器的状态,可是因为是平均响应时间的关系,时间上有些滞后,没法知足快速响应的要求。所以在此基础之上,会有一些改进版本的策略,如只计算最近若干次的平均时间的策略等分布式

  最小链接数:把请求分配给活动链接数最小的后端服务器。它经过活动来估计服务器的负载。比较智能,但须要维护后端服务器的链接列表。性能

  最小并发数:客户端的每一次请求服务在服务器停留的时间可能会有较大的差别,随着工做时间加长,若是采用简单的轮循或随机均衡算法,每一台服务器上的链接进程可能会产生较大的不一样,并无达到真正的负载均衡。最小并发数的策略则是记录了当前时刻,每一个备选节点正在处理的事务数,而后选择并发数最小的节点。该策略可以快速地反应服务器的当前情况,较为合理地将负责分配均匀,适用于对当前系统负载较为敏感的场景。设计

  哈希:上面几种负载均衡方式在对于后端来讲,有个重要的问题是如果一系列业务的多个请求,会被负载到几个节点上,不利于统一处理,而相同业务都负载到同一节点还有利于提升缓存命中率,便于维护长链接等,常见的hash有hash取模根据业务的须要,将对应属性取得hash值,而后除以节点个数,取余数分布到不一样对应编号的节点上。可是有个缺点是在增减节点的时候,需将全部的请求从新计算负载节点,较为耗费资源。进程

  

2、一致性hash的背景

  一致性哈希算法(Consistent Hashing)在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题。

3、一致性hash的算法实现概要

  先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,而后根据数据的Key值计算获得其Hash值(其分布也为[0, 232-1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。

相关文章
相关标签/搜索