负载均衡组件
一、什么是负载均衡
负载均衡建立在现有的网络结构之上,它提供了一种廉价、有效、透明的方法,扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个运算量较大的操作分担到多台设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力可以得到大幅提高
二、负载均衡分类
- 二层负载均衡(mac),一般采用虚拟 mac 地址方式,外部对虚拟 mac 地址请求,负载均衡接收后分配后端实际的 mac 地址响应
- 三层负载均衡(ip),一般采用虚拟 IP 地址方式,外部对虚拟 IP 地址请求,负载均衡收到后分配后端实际的 IP 地址响应
- 四层负载均衡(ip+port),使用 ip+port 接收请求,再转发到对应的机器
- 七层负载均衡(http),根据虚拟的 url 或 ip,主机名接收请求,再转向相应的处理服务器
三、四层和七层负载均衡的区别
- 四层负载均衡:主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。它处理消息的传递,但不考虑消息的内容。只会通过检查 TCP 流中的前几个包来作出有限的路由决策
以常见的 TCP 为例,负载均衡设备在接收到第一个来自客户端的 SYN 请求时,即通过一些策略选择一个最佳的服务器,并对报文中目标 IP 地址进行修改(改为后端服务器 IP),直接转发给该服务器。TCP 三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署场景下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改 - 七层负载均衡:通过报文中真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终的内部服务器。他在应用层执行,处理每个消息的实际内容,可以根据消息内容(如 URL 或 cookie)作出负载均衡决策
以常见的 TCP 为例,负载均衡设备先和客户端建立 TCP 连接之后,接收到客户端发送的应用层报文,然后再根据报文中的特定字段,加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡会和前端的客户端以及后端的服务器分别建立 TCP 连接。因此七层负载均衡明显对负载均衡设备的要求更高。
区别和应用场景:
- 七层负载均衡基本都是基于 HTTP 协议的,适用于 Web 服务器的负载均衡(nginx)
- 四层负载均衡基于 TCP 协议报文,可以做任何基于 tcp/ip 协议的软件的负载均衡(haproxy、LVS)
- 七层负载均衡可以使得整个网络更加“智能化”,例如访问一个网站的用户流量,可以通过七层的方式,将对图片类的请求转发到特定的图片服务器并可以使用缓存技术;将对文字类的请求可以转发到特定的文字服务器并可以使用压缩技术。也就是说,可以对客户端的请求和服务器的响应进行任何意义上的修改,极大的提升了应用系统在网络层的灵活性。
- 从性能上,四层负载均衡性能较高,无需解析报文应用层内容,在网络吞吐量以及处理能力上相对高。七层负载均衡需要算法识别URL,Cookie 或 HTTP Head 等信息,性能相对较差
- 从安全性上,四层负载均衡与服务器直接建立 TCP 连接,安全性低,无法识别 DDos 等攻击,很容易将垃圾流量流转至后台服务器。七层负载均衡安全性较高,具有 OSI 模型的全部功能,能更容易抵御来自网络的攻击,也可以过滤恶意流量并清洗这些流量,但要求设备本身具备很强的抗 DDos 流量的能力
- 从复杂度上,四层负载均衡架构比较简单,容易管理,容易定位问题;七层架构复杂,出现问题定位困难
常见的四层负载均衡:LVS 之类。七层:nginx、apache 等
四、负载均衡策略
在实际应用中,我们可能不想仅仅是把客户端的服务请求平均地分配给内部服务器。而是想使性能更好的服务器能接受更多的服务请求,一台处理服务请求较少的服务器能分配到更多的服务请求,出现故障的服务器将不再接受服务请求直至故障恢复等等。选择合适的负载均衡策略,使多个设备能很好的共同完成任务,消除或避免现有网络负载分布不均、数据流量拥挤反应时间长的瓶颈。在各负载均衡方式中,针对不同的应用需求,在OSI参考模型的第二、三、四、七层的负载均衡都有相应的负载均衡策略。
负载均衡策略的优劣及其实现的难易程度有两个关键因素:负载均衡算法;对网络系统状况的检测方式和能力。
负载均衡算法:
- 轮循均衡(Round Robin):每一次来自网络的请求轮流分配给内部中的服务器,从1至N然后重新开始。此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。
- 权重轮循均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是 3,C的权值是6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。
- 随机均衡(Random):把来自网络的请求随机分配给内部中的多个服务器。
- 权重随机均衡(Weighted Random):此种均衡算法类似于权重轮循算法,不过在处理请求分担时是个随机选择的过程。
- 响应速度均衡(Response Time):负载均衡设备对内部各服务器发出一个探测请求(例如Ping),然后根据内部中各服务器对探测请求的最快响应时间来决定哪一台服务器来响应客户端的服务请求。此种均衡算法能较好的反映服务器的当前运行状态,但这最快响应时间仅仅指的是负载均衡设备与服务器间的最快响应时间,而不是客户端与服务器间的最快响应时间。
- 最少连接数均衡(Least Connection):客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡。此种均衡算法适合长时处理的请求服务,如FTP。
- 处理能力均衡:此种均衡算法将把服务请求分配给内部中处理负荷(根据服务器CPU型号、CPU数量、内存大小及当前连接数等换算而成)最轻的服务器,由于考虑到了内部服务器的处理能力及当前网络运行状况,所以此种均衡算法相对来说更加精确,尤其适合运用到第七层(应用层)负载均衡的情况下。
- DNS响应均衡(Flash DNS):在Internet上,无论是HTTP、FTP或是其它的服务请求,客户端一般都是通过域名解析来找到服务器确切的IP地址的。在此均衡算法下,分处在不同地理位置的负载均衡设备收到同一个客户端的域名解析请求,并在同一时间内把此域名解析成各自相对应服务器的IP地址(即与此负载均衡设备在同一位地理位置的服务器的IP地址)并返回给客户端,则客户端将以最先收到的域名解析IP地址来继续请求服务,而忽略其它的IP地址响应。在种均衡策略适合应用在全局负载均衡的情况下,对本地负载均衡是没有意义的。