11-负载均衡和代理
负载均衡与代理技术
- LB,也可以写成SLB,Service load balance
- 一般来说四层LB,说的是按照ip进行负载均衡,六层SLB是按照URL进行负载均衡
- 职责:服务发现,健康检查,负载均衡
- 好处
- 命名抽象:客户端通过统一的访问机制(如 DNS 或内置库)连接到负载均衡器,无需关心后端服务器的拓扑结构或配置细节。
- 容错能力:通过健康检查和负载均衡算法,将请求分配至正常运行的后端服务器。故障服务器会被自动移出负载均衡池,为运维人员提供足够的修复窗口。
- 成本和性能收益:后端服务器通常分布在多个网络区域(Zone/Region),负载均衡器根据策略将请求保持在同一网络区域内,从而提高服务性能(减少延迟)并降低资源成本(减少跨区域带宽费用)。
负载均衡的划分
- 从网络层次的角度来看,所有负载均衡器可以分为两类:四层负载均衡和七层负载均衡,分别对应 OSI 模型的第四层(传输层)和第七层(应用层)
- 从种类上看
- DNS负载均衡
- 要是使用DNS解析出IP的方式,来进行业务流量的分发,并发无上限
- DNS负载均衡主要适用于的场景是多地集群的方式,也就是可能北京有一个数据中心,在其中部署了一整套的集群提供服务,在上海有一个数据中心,也部署了同样的一套的集群来提供服务,用于预防地震,水灾,整个机房断电的故障,这种可以将请求发送给不同的数据中心,从而可以使用户更加快速的访问到服务,数据中心级别的负载均衡
- 硬件负载均衡
- 例如那些贵的离谱的硬件设备,F5,A10,并发百万级别
- 硬件厂商一般能提供强力的服务,稳定性较高,性能较好,能支持百万级别的并发量,缺点就是太贵了,在一个数据中心,一般买俩就够了,做成主备的形式,提供高可靠,高可用,集群之间的负载均衡
- 软件负载均衡
- 我们常见的负载均衡软件,例如nginx,lvs,并发几万到百万级别
- 一般就是在前端创建一个SLB,然后在后端挂上真正的物理服务器,成为多个应用服务器的控制器,可以用各种调度算法来进行调度服务器之间的负载均衡
- DNS负载均衡
四层负载均衡
- 四层负载均衡并非严格限定于OSI 模型的第四层(传输层),实际涉及多个网络层次
- 第二层(数据链路层):通过修改帧头中的 MAC 地址,将请求从一个物理网络节点转发到另一个节点。这种方式通常用于同一广播域内的转发,例如交换机或桥接设备完成的二层转发操作。
- 第三层(网络层):通过修改 IP 地址,实现跨子网的请求路由和转发。这是路由器的核心功能,通过修改数据包的源或目的 IP 地址,实现子网之间的通信和流量转发。
- 第四层(传输层):通过修改 TCP/UDP 端口号或连接的目标地址,利用网络地址转换(NAT)技术隐藏内部网络结构,将请求从一个入口转发至多个后端服务。
- 典型情况下,四层负载均衡器处理的是 TCP、UDP 等连接协议,它并不关心传输字节所代表的具体应用内容,这些字节可能来自 Web 应用、数据库服务或其他网络服务。因此,四层负载均衡器具有广泛的应用范围,能够适应各种不同类型的网络服务。
- 由于建立连接的开销较大(例如 TCP 三次握手,尤其在启用 TLS 加密时),许多网络协议(如 TCP、HTTP/2、QUIC 和 WebSockets)在演进过程中逐步引入了“多路复用”(multiplexing)和“连接保持”(connection keep-alive)等特性,也就是将同一连接或会话的流量始终转发到相同的后端服务器,从而避免频繁的连接建立过程。
- 阻抗不匹配现象
- Client A 和 Client B 两个 HTTP/2 客户端通过四层负载均衡器和后端服务器建立持久连接。。
- Client A 的 TCP 连接每分钟发送 40 个 HTTP 请求,而 Client B 的 TCP 连接每秒发送 1 个 HTTP 请求。
- 四层负载均衡器将 Client A 的所有 TCP 请求转发至同一台服务器,导致该服务器过载,而其他服务器则处于闲置状态。这种资源利用不均的问题在电气工程领域被称为“阻抗不匹配”现象。
七层负载均衡
七层负载均衡器工作在应用层,这意味着负载均衡器必须与后端服务器建立新的传输层连接,并将客户端的请求代理到后端服务器。
负载均衡算法
- 轮询均衡算法(Round-Robin):按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点是实现简单。轮询算法假设所有的服务器处理请求的能力都一样,调度器会将所有的请求平均分配给每个真实服务器。
- 最小连接均衡算法(Least-Connection):该算法中调度器需要记录各个服务器已建立连接的数量,然后把新的连接请求分配到当前连接数最小的服务器。
- 最小连接均衡算法特别适合于服务器处理时间不一致的场景。例如,当某些请求可能占用较长时间,而另一些请求很快就会完成时,最小连接算法可以有效避免某些服务器因处理大量复杂请求而过载。
- 一致性哈希均衡算法(Consistency Hash):将请求中的某些特征数据(例如 IP、MAC 或者更上层应用的某些信息)作为特征值来计算需要落在的节点。一致性哈希算法会保证同一个特征值的请求每一次都会落在相同的服务器上。
- 随机均衡算法(Random):此种负载均衡算法类似于轮询调度,不过在分配处理请求时是随机的过程。由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果。
负载均衡拓扑
中间代理型
优点:配置简便,用户只需通过 DNS 连接到负载均衡器,无需关心后端细节,使用体验简单直观;
缺点:存在单点故障的风险,负载均衡器一旦出现故障,会导致整个系统无法访问。
边缘代理型
边缘代理型实际上是中间代理型拓扑的一个变种。
在全球多个数据中心部署边缘节点,这些节点具备代理功能,用户请求会被路由至最近的节点。收到请求后,边缘节点会执行安全检查(如 DDoS 防护),根据缓存策略决定是返回缓存内容(CDN 技术),或者将请求转发至源服务器(请求加速技术)
优点:通过将负载均衡、缓存和安全策略集中在网络边缘,边缘代理显著降低延迟、提高响应速度,并增强安全性(如 DDoS 防护);
缺点:虽然边缘代理减少了单点故障的风险,但若某个边缘节点发生故障,仍会影响到该节点服务的用户。
客户端内嵌
为解决中间代理型拓扑的单点故障问题,出现了更复杂的解决方案,其中之一是将负载均衡器以 SDK 库形式嵌入客户端这些 SDK 库如 Finagle、Eureka、Ribbon 和 Hystrix 等,它们优缺点是:
优点:将负载均衡器功能“转移”至客户端,避免了单点故障问题;
缺点:需要为每种编程语言实现相应的 SDK,且在项目复杂时,处理版本依赖和兼容性问题变得棘手
边车代理型
边车代理型拓扑近年来在微服务架构中得到广泛应用,并发展成为一种被称为“服务网格”(Service Mesh)的架构模式。边车代理的基本原理是在应用容器或服务旁边部署一个独立的代理容器,用于实现请求的负载均衡和流量管理。目前,像 Envoy 和 Linkerd 等网络型边车代理已被广泛应用
LVS
四层负载均衡器的典型代表是 LVS(Linux Virtual Server,Linux 虚拟服务器),由中国程序员章文嵩于 1998 年开发。
LVS 的基本原理可以用一句话概述,通过修改 MAC 层、IP 层、TCP 层的数据包,实现一部分交换机和网关的功能,将流量转发至真正的服务器上。这三种数据包修改方式分别对应 LVS 提供的三种工作模式
LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储层。
LVS的三种模式
- 基本概念
- DS:Director Server,前端负载均衡节点服务器。
- RS:Real Server,后端真实服务器。
- CIP:Client IP,客户端 IP 地址。
- VIP:Virtual IP,负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
- RIP:RealServer IP,负载均衡后端的真实服务器 IP 地址。
- DIP:Director IP,负载均衡与后端服务器通信的 IP 地址。
- CMAC: 客户端 MAC 地址,LVS 连接的路由器的 MAC 地址。呕
- VMAC: 负载均衡 LVS 的 VIP 对应的 MAC 地址。
- DMAC: 负载均衡 LVS 的 DIP 对应的 MAC 地址。
- RMAC: 后端真实服务器的 RIP 地址对应的 MAC 地址。
直接路由模式
在直接路由模式中,请求通过负载均衡器转发至后端服务器,而后端服务器的响应无需再经过负载均衡器,请求、转发和响应之间形成“三角关系”,因此该模式也被称为“三角传输模式”。
需要注意的是,后端服务器接收到的数据包中,IP 层的目标地址(即 VIP)并不属于后端服务器的物理网络接口,这些数据包会被丢弃。因此,必须将 VIP 地址绑定到本地回环接口(lo 接口)
当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器,这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。
数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。
数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务,如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。
数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。
数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。
优缺点
- 它特别适合响应流量远大于请求流量的场景。例如,在典型的 HTTP 请求/响应模式中,请求流量可能仅占总流量的 10%,而响应流量占 90%。通过三角传输模式,负载均衡器只需处理 1/10 的总流量。这种设计不仅显著降低了带宽成本,还提升了负载均衡器的可靠性(流量越少、负载越轻、越不容易出现问题)。
- 监控功能受限:由于响应流量直接返回客户端,负载均衡器无法监控完整的 TCP 连接状态,这可能影响防火墙策略的实施。例如,负载均衡器只能捕获 TCP 连接的 SYN 包,而无法跟踪后续的 ACK 包。
- 网络架构要求高:负载均衡器与后端服务器之间通过链路层通信,因此要求两者位于同一子网内,这对网络拓扑设计提出了较高的要求。
隧道模式
隧道模式的基本原理是,LVS 创建一个新的 IP 数据包,将原始 IP 数据包作为“负载”(payload)嵌入其中。新数据包随后被三层交换机路由到后端服务器,后者通过拆包机制移除额外的头部,恢复原始 IP 数据包并进行处理。
客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。
进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。
到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。
数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。
后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。
优点
- 单臂模式,LVS负载压力小
- 数据包修改小,信息完整性高
- 可跨机房
缺点
- 不支持端口映射
- 需在RS后端服务器安装模块及配置VIP
- 隧道头部IP地址固定,RS后端服务器网卡可能会不均匀
- 隧道头部的加入可能会导致分片,最终会影响服务器性能
使用场景
- 如对转发要求较高且具有跨机房需求的,可选择TUN模式。
网络地址转换模式
直接修改原始 IP 数据包的目标地址,将其替换为后端服务器的地址。这种方式被称为“网络地址转换”(NAT)模式
客户端发出的请求数据包经过网络到达 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。
然后进入 PREROUTING 链中,根据目的 IP 查找路由,确定是否为本机 IP 地址,随后将数据包转发至 INPUT 链中,源 IP 和 目的 IP 不变。
到达 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 来作为后端服务器,数据包的目的 IP 地址将会修改为 RIP,这时并以 RIP 为目的 IP 去查找路由,确定下一跳及 PORT 信息后,数据包将会转发至 OUTPUT 链中。
被修改过的数据包经过 POSTROUTING 链后,到达 RS 服务器,数据包源 IP 为 CIP,目的 IP 为 RIP。
RS 服务器经过处理后,将会把数据包发送至用户空间的应用程序,待处理完成后,发送响应数据包,RS 服务器的默认网关为 LVS 的 IP,应用程序将会把数据包转发至下一跳 LVS 服务器,数据包源 IP 为 RIP,目的 IP 为 CIP。
LVS 服务器收到 RS 服务器响应的数据包后,查找路由,目的 IP 不是本机 IP 并且 LVS 服务器开启了 FORWARD 模式,会将数据包转发给它,数据包不变。
LVS 服务器收到响应数据包后,根据目的 IP 和 目的 PORT 查找相应的服务,这时,源 IP 为 VIP,通过查找路由,确定下一跳信息并将数据包发送至网关,最终回应给客户端用户。
优点
- 支持端口映射,如 RS 服务器 PORT 与 VPORT 不一致的话,LVS 会修改目的 IP 地址和 DPORT 以支持端口映射;
缺点
- 双向流量对 LVS 会产生较大的负载压力;
主备模式
缺陷
- 在正常运行时,50% 的资源处于闲置状态,备用服务器始终处于空转状态,导致资源利用率低下。
- 现代分布式系统更加注重高容错性。理想情况下,即使多个实例同时发生故障,服务仍应能持续运行。然而,在主备模式下,一旦主节点和备用节点同时发生故障,服务将完全中断
GSLB
- 全局负载均衡
- GSLB其实是DNS轮询方式的一种改进,因为DNS轮询的时候比较傻,它不能对后端的服务进行健康检查,没准有一个机房挂了,但是它依旧把请求发送给那个机房,从而就有了GSLB。
- DNS还有一个缺点就是在DNS解析的时候,一般会先向本地的DNS服务器进行解析,但是这并不是客户端的真实的IP地址,从而有可能分配的时候,并不是距离上最近的或者是性能最好的,从而也就有GSLB。
- DNS的轮询其实是GSLB的一种实现方式,所以这种也能称之为GSLB,而DNS轮询这种说法比较少,而GSLB的实现方式中,还有一种方式就是HTTP 302跳转,将GSLB的IP地址作为域名的A记录,然后访问GSLB的时候,会将请求返回给客户端,然后给一个302响应,让客户端跳转到真正的地址(此种方式GSLB能看到客户端的真实的IP地址,从而给出距离跟进的服务器ip地址)。