引言
前几天在面试的时候被问到了负载均衡,因为只是简单的用过,所以就只说出了常见的负载均衡算法,以及SpringCloud的负载均衡组件,并没有深入进行了解,因此总结了下负载均衡。
什么是负载均衡
负载均衡是指将用户请求分摊到不同的服务器上去处理,以提高系统整体的并发处理能力以及可靠性,负载均衡由专门的软件或者硬件来完成,一般情况下,硬件的性能越好,软件的更便宜。
服务端负载均衡
服务端负载均衡主要应用在系统外部请求和网管之间,可以使用硬件和软件去实现。
硬件负载
如F5,A10,Array实现负载均衡 硬件的负载均衡的优势是性能很强且稳定,缺点是费钱。
软件负载均衡
常见的就是Nginx。 原理: 客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理"代理"的是目标服务器,这一个过程对于客户端而言是透明的。Nginx 就是最常用的反向代理服务器,它可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上。
客户端负载均衡
客户端负载均衡主要应用于系统内部不同服务之间,可以使用现成的负载均衡组件实现。 在客户端负载均衡中,客户端自己维护一份服务器的地址列表,或者请求对应的注册中心,获取在线的服务列表,然后根据相应的负载均衡算法处理请求。 常见的负载均衡组件如Ribbon 、Spring Cloud Load Balancer。
负载均衡算法
-
随机法
如果没有配置权重的额话,所有服务器被访问到的概率都是相同的,如果配置权重的话,权重越高的服务器被访问的概率越高。未加权重的随机算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权随机算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。不过,随机算法有一个比较明显的缺陷:部分机器在一段时间之内无法被随机到,毕竟是概率算法,就算是大家权重一样, 也可能会出现这种情况
-
轮询法
是挨个轮询服务器处理,也可以设置权重。如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。如果配置权重的话,权重越高的服务器被访问的次数就越多。未加权重的轮询算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。
-
一致性Hash法
相同参数的请求总是发到同一台服务器处理,比如同个 IP 的请求。
-
最小连接法
当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。活动连接数可以理解为当前正在处理的请求数。最小连接法可以尽可能最大地使请求分配更加合理化,提高服务器的利用率。不过,这种方法实现起来也最复杂,需要监控每一台服务器处理的请求连接数。
其他方法实现负载均衡
-
DNS解析
DNS解析实现负载均衡的原理:在DNS服务器中同一个主机记录配置多个IP地址,这些IP地址对应不同的服务器,当用户请求域名时,DNS服务器采用轮询的方式返回IP地址。