概述
负载均衡,英文名称为 Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。
分类
硬件负载均衡:比如 F5、Array。
软件负载均衡:比如 LVS、Nginx。
服务端负载均衡:比如 Nginx。
客户端负载均衡:比如 Ribbon、Spring Cloud LoadBalancer。
服务端负载均衡
我们所说的负载均衡通常都是指服务端负载均衡,服务端负载均衡又分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。
硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,常见的如 F5。
软件负载均衡则主要是在服务器上安装一些具有负载均衡功能的软件来完成请求分发进而实现负载均衡,常见的就是 Nginx。
无论是硬件负载均衡还是软件负载均衡,它的工作原理都不外乎下面这张图:
常用的服务端负载均有以下几种:
DNS域名解析负载均衡
假设我们的域名指向了多个 IP 地址,当一个域名请求来时,DNS 服务器机进行域名解析将域名转换为 IP 地址是,在 1:N 的映射转换中实现负载均衡。DNS 服务器提供简单的负载均衡算法,但当其中某台服务器出现故障时,通知 DNS 服务器移除当前故障 IP。反向代理负载均衡
反向代理只值对服务器的代理,代理服务器接受请求,通过负载均衡算法,将请求转发给后端服务器,后端服务返回给代理服务器然后代理服务器返回到客户端。反向代理服务器的优点是隔离后端服务器和客户端,使用双网卡屏蔽真实服务器网络,安全性更好,相比较于 DNS 域名解决负载均衡,反向代理在故障处理方面更灵活,支持负载均衡算法的横向扩展。目前使用非常广泛。当然反向代理也需要考虑很多问题,比如单点故障,集群部署等。IP负载均衡
我们都知道反向代理工作到 HTTP 层,本身开销相对大一些,对性能有一定影响,LVS-NAT 是一种卫浴传输层的负载均衡,它通过修改接受的数据包目标地址的方式实现负载均衡。Linux2.6.x以后版本内置了 IPVS,专注用于实现 IP 负载均衡,故而在 Linux 上 IP 负载均衡使用非常广泛。
LVS-DR 工作在数据链路层,比 LVS-NAT 更霸道的时候它直接修改数据包的 MAC 地址。LVS-TUN 基于 IP 隧道的请求转发机制,将调度器收到的 IP 数据包进行封装,转交给服务器,然后服务器返回数据,通过调度器实现负载均衡。这种方式支持跨网段调度。
总结一下,LVS-DR 和 LVS-TUN 都适合响应和请求不对称的 Web 服务器,如何从它们中做出选择,取决于你的网络部署需要,因为 LVS-TUN 可具有跨地域性,有类似这种需求的,就应该选择 LVS-TUN。
客户端负载均衡
客户端负载均衡是在 Spring Cloud 分布式框架组件 Ribbon 中定义的。我们在使用 Spring Cloud 分布式框架时,同一个 service 大概率同时启动多个,当一个请求到来时,Ribbon 通过策略决定本次请求使用哪个 service 的方式就是客户端负载均衡。
负载均衡:服务端 VS 客户端
无论是硬件负载均衡还是软件负载均衡都会维护一个可用的服务端清单,然后通过心跳机制来删除故障的服务端节点以保证清单中都是可以正常访问的服务端节点,此时当客户端的请求到达负载均衡服务器时,负载均衡服务器按照某种配置好的规则从可用服务端清单中选出一台服务器去处理客户端的请求。
客户端负载均衡和服务器负载均衡的核心差异在服务列表本身,客户端负载均衡服务列表在通过客户端维护,服务器负载均衡服务列表由中间服务单独维护。
常见负载均衡算法
- 轮询:轮流访问。
- 加权轮询:在轮流访问的基础上,可以给每台服务器配置加权值。
- 随机:就是随机访问。
- 最小连接数:把请求发送给当前连接最少的服务器上。
- IP 哈希算法:根据客户端的 IP 计算,可保证一个客户端总访问到一个服务器上,避免了 session 不同步的问题。
- URL 散列:可保证同一 URL 总访问同一个服务器。