分布式系统设计之负载均衡算法 |
概述 在分布式系统设计当中,一般会对服务进行集群部署,集群中的多个节点提供相同的服务,所以可以将对该服务的请求分发给集群的任意一个节点来处理。为了将请求合理分发给集群的节点进行处理,即既要保证集群的每个节点都能够分配到请求,又能够实现不会给某个节点分配过多请求,导致超过节点处理能力,所以需要基于一定的规则来进行请求分发,这个规则也称为负载均衡算法。以下详细分析几种常见的负载均衡算法的工作原理。 1.轮询 轮询算法主要是将客户端发送到负载均衡器的请求依次轮流地转发给服务集群的某个节点,而不需要考虑每个集群节点当前的连接数和工作负载以及该节点的机器性能。该算法的好处是实现简单,每个集群节点平均分担所有的请求,缺点是当集群节点对应的机器存在性能差异时,可能会出现性能低的机器节点处理请求慢,而性能好的机器节点则存在空闲的系统资源没有充分利用,所以一般用作集群所有节点的机器性能接近的情况。 2.随机 随机算法主要是随机选取集群中的某个节点来处理该请求,由概率论的知识可知,随着请求量的变大,随机算法会逐渐演变为轮询算法,即集群各个节点会处理差不多数量的请求。所以优缺点也是与轮询算法类似。 3.加权轮询与加权随机 加权算法主要是根据集群的节点对应机器的性能的差异,给每个节点设置一个权重值,其中性能好的机器节点设置一个较大的权重值,而性能差的机器节点则设置一个较小的权重值。然后可以继续基于轮询或者随机的算法来选取一个节点来处理请求,只是权重大的节点能够被更多的选中。实现原理类似于在一个数组中选择一个元素,而权重值就是对应机器节点在数组中重复出现的次数,如两个节点{ a,b },其中a节点的权重值为3,b节点的权重值为1,则数组的组成为:[a, a, a, b],所以不管是轮询还是随机选取都是a选择的次数更多。 4. 哈希与一致性哈希 哈希算法主要将对请求的IP地址或者URL计算一个哈希值,然后与集群节点的数量进行取模来决定将请求分发给哪个集群节点。这种哈希算法实现简单并且在集群节点数量不变的情况下,能够将相同IP地址的请求分发给相同的机器处理。但是如果集群节点发生变化,则会对集群的所有节点进行影响,如可能导致某个机器性能较低的节点突然接收到大量请求,从而影响集群的整体稳定性。 一致性哈希算法主要是基于一致性哈希函数来实现,一致性哈希函数会将给定的参数映射到由2的32次方个点组成的环形槽的某个槽点上。 在使用一致性哈希函数来进行负载均衡时,首先将集群的多个节点哈希到该环形槽的对应的某个槽点上,然后当负载均衡器接收到请求时,使用该请求的IP地址或者URL来作为一致性哈希函数的参数,生成该请求对应环形槽的某个槽点,最后从顺时针方向找到第一个位于该环形槽的集群节点,则将该请求转发给这个集群节点处理。 由一致性哈希算法的实现原理可知,如果集群节点的个数不变,则相同IP地址或者相同URL的请求都会转发到相同的集群节点来处理;如果集群节点数量发生变化,则只会影响该增加或者删除的节点按顺时针方向的后一个节点,所以能够很方便的实现集群的拓容和缩容。 5.最少连接数 最少连接数负载均衡算法是一种智能、动态的负载均衡算法,主要是根据集群的每个节点的当前连接数来决定将请求转发给哪个节点,即每次都将请求转发给当前存在最少并发连接的节点。 这种负载均衡算法的好处是可以根据集群节点的负载情况来进行请求的动态分发,即机器性能好,处理请求快,积压请求少的节点分配更多的请求,反之则分配更少的请求,从而实现集群的整体稳定性和将请求合理分发到每一个节点,避免某个节点因为处理超过自身所能承受的请求量而导致宕机或者响应过慢。 6.最快响应时间 最快响应时间负载均衡算法也是一种智能、动态的负载均衡算法,与最少连接数类似,也是根据集群节点的负载情况来将请求合理分发到各个节点,实现集群的整体稳定性和机器资源的重复利用。与最少连接数不同的是,最快响应时间是基于请求与响应的时间延迟来衡量机器的负载情况的,即将请求分发给当前处理请求最快,负载均衡器从该节点获取响应延迟最小的节点,而响应时间慢的节点则分配更少的请求。 |