负载均衡建立在现有的网络结构之上,用来扩展网络设备和服务器的带宽,增加了吞吐量,加强了数据处理能力,提高了网络灵活性和可用性。
四层负载均衡与七层负载均衡
四层负载均衡基于 IP 和端口的方式实现网络的负载均衡
实现:对外提供一个虚拟的 IP 地址和端口接收所有用户请求,根据负载均衡配置和策略将请求发送到真实的服务器。
七层负载均衡基于 URL 等资源来实现应用层基于内容的负载均衡
实现:通过虚拟的 URL 或主机名接收所有用户请求,然后将请求发送给真实的服务器
通常使用 LVS 等技术实现基于 socket 的四层负载均衡,使用 Nginx 等技术实现基于内容分发的七层负载均衡,比如将 /user/ 开头的 URL 请求负载到单点登录服务器,将以 /business/ 开头的 URL 请求负载到具体的业务服务器。
四层负载均衡
四层负载均衡主要通过修改报文中的目标地址和端口来实现报文的分发和负载均衡。
以 TCP 为例,负载均衡设备在接收到第一个来自客户端的 SYN 请求后,会更具负载均衡配置和策略选择一个最佳服务器,并将报文中的目标 IP 地址修改为该服务器的 IP 地址直接转发给该服务器。连接建立(三次握手)是在客户端和服务器端之间完成,负载均衡设备只起到路由转发的功能。
常用软硬件:
- F5:硬件负载均衡器,功能完备,价格昂贵。
- LVS: 基于 IP+端口 实现四层负载的软件,常和 Keepalive 配合使用。
- Nginx:同时实现四层和七层负载均衡,带缓存功能,可基于正则表达式灵活转发。
七层负载均衡
七层负载均衡又叫做『内容负载均衡』,主要通过解析报文中的应用层内容,并根据负载均衡和负载均衡策略选择一个最佳的服务器响应用户的请求。
七层负载均衡根据不同的数据类型将数据存储在不同的服务器上来提高网络整体的负载能力。
比如将客户端的基本信息存储在内存较大的缓存服务器上,将文件存储在磁盘空间较大的文件服务器上,将图片音视频存储在网络 I/O 能力较强的流媒体服务器上。
常用软件:
- HAProxy:支持七层代理、会话保持、标记、路径转移等。
- Nginx:同时实现四层和七层负载均衡,功能强大,性能与 HAProxy 相当。
- Apache:使用简单,性能较差。
负载均衡算法
轮询均衡(Round Robin)
将客户端请求轮流分配,服务器被均等地分配客户端请求。
用于所有服务器都有相同能力的情况下。权重轮询均衡(Weighted Round Robin)
根据每台服务器不同能力,设置不同的权重值,根据权重值分配请求。
用于服务器能力不均等的情况。随机均衡(Random)
将网络请求随机分配,不考虑服务器的配置和负载情况。权重随机均衡(Weighted Random)
类似权重轮询,只是在分配请求时不再轮询发送,而是随机选择某个权重的服务器发送。响应速度均衡(Response Time)
根据服务器响应速度的不同,将请求发送到响应速度最快的服务器上。
获取响应速度是通过负载均衡设备定时为每台服务都发送一个探测请求实现。
这里的响应速度是负载均衡设备到各个服务器之间的响应速度,并不完全代表客户端到服务器的响应速度,因此存在偏差。最少连接数均衡(Least Connection)
记录当前每台服务器正在处理的连接数量,把新请求分配给连接数最少的服务器。
适用于网络连接和带宽有限、CPU 处理任务简单的请求服务,例如 FTP。处理能力均衡
将服务请求分配给负荷最轻的服务器,负荷是根据服务器的 CPU 型号、CPU数量、内存大小及当前连接数等换算而成的。
综合考虑了处理能力与网络状况,相对精确。DNS 响应均衡(Flash DNS)
分布在不同中心机房的负载均衡设备都收到同一个客户端的域名解析请求时,所有负载均衡设备均解析此域名并将解析后的 IP 地址返回给客户端,客户端向收到的第一个 IP 地址发起请求,忽略其他负载均衡设备的响应。
适用于全局负载均衡的场景。散列算法均衡
通过一致性散列算法和虚拟节点技术将相同参数的请求总是发送到同一台服务器,该服务器长期、稳定地为某些客户端提供服务。
在某个服务器被移除或宕机后,该服务器的请求基于虚拟节点技术分摊到其他服务器,不会影响集群整体的稳定性。IP 地址散列
在负载均衡器内部维护了不同链接上客户端和服务器的 IP 对应关系表,将来自同一客户端的请求统一转发给相同的服务器。该算法能够以会话为单位,保证同一客户端的请求能够一直在同一台服务器上处理。
适用于保持长连接的情景。URL 散列
管理客户端请求 URL 信息的散列表,将相同 UR的请求转发给同一台服务器 。
适用于七层负载中根据用户请求类型的不同将其转发给不同类型的应用服务器。