在分布式式系统中,为了分散访问压力,每个模块需要由多个节点组成集群,共同来提供服务,客户端根据一定的负载均衡策略来访问集群的各个节点,由此引入了一些问题,如在访问压力增大的情况需要要增加节点,或是集群其中的一个节点突然挂掉,如何将原有节点上的请求压力重新负载到新的节点集群上。
我们常用的负载均衡策略有随机(加权)、轮询,最小连接数、最短响应时间,哈希,以及我们今天要说的一致性hash。
一、一致性hash与其他负载均衡策略的对比
首先我们来分析下一致性hash相对前面几种负载均衡策略的优势,
轮询:各个服务器的性能可能不一致,该策略将节点视为等同,与实际中复杂的环境不符。加权轮询为轮询的一个改进策略,每个节点会有权重属性,但是因为权重的设置难以做到随实际情况变化,仍有一定的不足
随机:与轮询类似,根据不同的随机算法随机访问各个节点,可通过加权做一定扩展。
最小响应时间:通过记录每次请求所需的时间,得出平均的响应时间,然后根据响应时间选择最小的响应时间。该策略能较好地反应服务器的状态,但是由于是平均响应时间的关系,时间上有些滞后,无法满足快速响应的要求。因此在此基础之上,会有一些改进版本的策略,如只计算最近若干次的平均时间的策略等
最小连接数:把请求分配给活动连接数最小的后端服务器。它通过活动来估计服务器的负载。比较智能,但需要维护后端服务器的连接列表。
最小并发数:客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生较大的不同,并没有达到真正的负载均衡?最小并发数的策略则是记录了当前时刻,每个备选节点正在处理的事务数,然后选择并发数最小的节点。该策略能够快速地反应服务器的当前状况,较为合理地将负责分配均匀,适用于对当前系统负载较为敏感的场景。
哈希:上面几种负载均衡方式在对于后端来说,有个重要的问题是若是一系列业务的多个请求,会被负载到几个节点上,不利于统一处理,而相同业务都负载到同一节点还有利于提高缓存命中率,便于维护长连接等,常见的hash有hash取模根据业务的需要,将对应属性取得hash值,然后除以节点个数,取余数分布到不同对应编号的节点上。但是有个缺点是在增减节点的时候,需将所有的请求重新计算负载节点,较为耗费资源。
二、一致性hash的背景
一致性哈希算法(Consistent Hashing)在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题。
三、一致性hash的算法实现概要
先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。
原文地址:https://www.cnblogs.com/Lliuyao/p/10094248.html