负载均衡指把用户请求分摊到不同服务器处理,提高系统的并发性和可靠性。
可由专门的软件(更便宜)和硬件(性能好)实现。
负载均衡分为服务端负载均衡和客户端负载均衡。
服务端负载均衡 主要应用在 系统外部请求 和 网关层 之间,可以使用 软件 或者 硬件 实现。
客户端负载均衡 应用于系统内部的不同的服务之间。客户端自己维护服务器地址列表,发送请求前,根据负载均衡算法选择某一台服务器处理请求。
客户端负载均衡器和服务运行在同一个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 Ribbon 和 Spring 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
(默认):轮询策略