负载均衡指把用户请求分摊到不同服务器处理,提高系统的并发性和可靠性。

可由专门的软件(更便宜)和硬件(性能好)实现。

负载均衡分为服务端负载均衡和客户端负载均衡。

服务端负载均衡 主要应用在 系统外部请求网关层 之间,可以使用 软件 或者 硬件 实现。

客户端负载均衡 应用于系统内部的不同的服务之间。客户端自己维护服务器地址列表,发送请求前,根据负载均衡算法选择某一台服务器处理请求。

客户端负载均衡器和服务运行在同一个Java 程序里,无需额外的网络开销。但其实现受到编程语言的限制,如 Spring Cloud Load Balancer 只能用于 Java 语言。

 Dubbo、Spring Cloud 均内置开箱即用的客户端负载均衡实现。Dubbo:默认自带,Spring Cloud: 通过组件实现,属于可选项,较常用的是 Spring Cloud Load Balancer(官方,推荐) 和 Ribbon(Netflix,已被启用)。

负载均衡常见算法

随机法:

未配置权重,所有的服务器被访问的概率相同。配置权重,权重越高被访问概率越大。

未加权重的随机算法适合服务器性能相近的集群,每个服务器承载相同的负载。加权随机算法适合服务器性能不等的集群,权重使请求分配更合理。

缺陷:部分机器在一段时间之内无法被随机到。

轮询法

挨个轮询服务器处理,也可设置权重。

未配置权重,每个请求按时间顺序逐一分配到不同的服务器处理。配置权重,权重越高的服务器被访问的次数就越多。

平滑的加权轮训算法:

平滑的加权轮训算法最早是在 Nginx 中被实现,可以参考这个 commit:Upstream: smooth weighted round-robin balancing. · phusion/nginx@27e9498 · GitHub

两次随机:

两次随机法:随机法的基础上多加一次随机,多选一个服务器。根据两台服务器的负载情况,选出最合适的服务器。

好处:可动态地调节后端节点的负载,使其更加均衡。如只使用一次随机,可能会导致某些服务器过载,而某些服务器空闲

哈希法:

将请求的参数信息通过哈希函数转换成哈希值,根据哈希值决定使用哪一台服务器。

服务器数量不变时,相同参数的请求总被同一台服务器处理,如同个 IP 的请求、同一个用户的请求。

一致哈希法:

服务器数量变化时,常规哈希的哈希值会重新落在不同的服务器。而一致性哈希是将数据和节点映射到一个哈希环上,然后根据哈希值的顺序来确定数据属于哪个节点。当服务器增加或删除时,只影响该服务器的哈希,不会导致整个服务集群的哈希值重排。

最小链接法:

遍历服务器列表,选连接数最小的服务器来响应当前请求。相同连接时,可进行加权随机。

最少活跃法:

最少活跃法以活动连接数(可理解为当前正在处理的请求数)为标准。活跃数越低,说明处理能力越强,使处理能力强的服务器处理更多请求。相同活跃数时,进行加权随机

最快相应时间法:

客户端维持每个服务器的响应时间,每次请求挑响应时间最短的。

常用负载均衡解决方案

DNS 解析:在 DNS 服务器中为同一个主机配置多个 服务器IP 地址。用户请求域名时,DNS 服务器采用轮询返回 IP 地址。现在的 DNS 解析几乎都支持 IP 地址的权重配置,使性能不等的服务器处理请求更合理。如:阿里云 DNS 支持权重配置

反向代理:客户端将请求发到反向代理服务器,由其选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 。

最常用的反向代理服务器:Nginx 。

客户端负载均衡组件

Netflix RibbonSpring Cloud Load Balancer 是目前 Java 最流行的两个负载均衡组件。

Ribbon :老牌负载均衡组件,由Netflix 开发,功能比较全面,支持负载均衡策略多。 Spring Cloud Load Balancer:  Spring 官方为取代 Ribbon 开发,功能相对更简单一些,支持的负载均衡少。

Ribbon 支持的 7 种负载均衡策略:

  • RandomRule:随机策略。
  • RoundRobinRule(默认):轮询策略
  • WeightedResponseTimeRule:权重(根据响应时间决定权重)策略
  • BestAvailableRule:最小连接数策略
  • RetryRule:重试策略(按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null)
  • AvailabilityFilteringRule:可用敏感性策略(先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例)
  • ZoneAvoidanceRule:区域敏感性策略(根据服务所在区域的性能和服务的可用性来选择服务实例)

Spring Cloud Load Balancer 支持的 2 种负载均衡策略:

  • RandomLoadBalancer:随机策略
  • RoundRobinLoadBalancer(默认):轮询策略

 

03-20 06:27