负载均衡
负载均衡是将请求分发到多个服务实例,避免单个实例过载,提高系统的吞吐量和可用性。
负载均衡层级
DNS 负载均衡
DNS 返回多个 IP 地址,客户端选择一个 IP 连接。DNS 负载均衡的问题:DNS 缓存导致客户端可能连接到故障 IP、DNS 不感知后端健康、负载不均衡(客户端选择 IP 的策略不同)。
DNS 负载均衡适合多地域部署,不同地域返回不同的 IP。
四层负载均衡(L4)
四层负载均衡工作在传输层(TCP/UDP),根据 IP 和端口分发请求。四层负载均衡的性能高(只解析 TCP/UDP 头),但不感知应用层协议(HTTP)。
四层负载均衡的算法:轮询(Round Robin)、最小连接(Least Connections)、源地址哈希(Source Hash)、一致性哈希(Consistent Hash)。
LVS(Linux Virtual Server)是开源的四层负载均衡器,工作在内核空间,性能极高。LVS 模式:NAT(Network Address Translation,修改目的 IP)、DR(Direct Routing,修改 MAC 地址)、TUN(Tunneling,IP 隧道)。
七层负载均衡(L7)
七层负载均衡工作在应用层(HTTP),可以根据 URL、Header、Cookie 分发请求。七层负载均衡的性能低(解析 HTTP 头),但可以做到会话保持、灰度发布、A/B 测试。
七层负载均衡的算法:轮询、加权轮询、最小连接、IP 哈希、URL 哈希。
Nginx、HAProxy 是常见的七层负载均衡器。Nginx 的 upstream 模块配置后端服务器,支持负载均衡、健康检查、会话保持。
负载均衡算法
轮询(Round Robin)
轮询按顺序依次分发请求到每个后端。轮询简单、公平,但不考虑后端负载和性能差异。加权轮询(Weighted Round Robin)根据后端的性能分配权重,性能高的分配更多请求。
最小连接(Least Connections)
最小连接分发请求到当前连接数最少的后端。最小连接适合请求处理时间差异大的场景(如长连接)。加权最小连接(Weighted Least Connections)考虑后端的性能和当前连接数。
源地址哈希(Source Hash)
源地址哈希根据客户端 IP 计算哈希值,同一 IP 的请求总是分发到同一后端。源地址哈希可以实现会话保持(Session Affinity),但可能导致负载不均衡。
一致性哈希(Consistent Hash)
一致性哈希将请求和后端都映射到哈希环,请求分发到环上顺时针最近的後端。一致性哈希的好处:新增或删除后端时,只影响部分请求的映射关系,不会导致所有请求重新映射。
一致性哈希用于缓存分片、分布式哈希表(DHT)、CDN。
最少响应时间(Least Response Time)
最少响应时间分发请求到响应时间最短的后端。最少响应时间需要记录每个后端的响应时间,适合动态变化的负载。
会话保持
会话保持的需求
HTTP 是无状态的,但应用可能有状态(如购物车、登录信息)。如果请求分发到不同的后端,后端无法访问之前的会话,需要会话保持。
会话保持的方式
源地址哈希:同一 IP 的请求总是分发到同一后端。优点是简单,缺点是 NAT 后的多个客户端可能被识别为同一 IP。
Cookie 插入:负载均衡器插入 Cookie 标识后端,后续请求根据 Cookie 分发。优点是精确,缺点是依赖 Cookie。
会话复制:后端之间复制会话,请求可以分发到任意后端。优点是灵活,缺点是复制开销大。
会话共享:将会话存储到 Redis 等共享存储,后端从共享存储读取会话。优点是可扩展,缺点是依赖共享存储。
健康检查
健康检查的方式
TCP 检查:连接成功则健康,适合所有服务。HTTP 检查:请求健康检查端点(/health),返回 200 则健康,适合 HTTP 服务。命令检查:执行命令,返回 0 则健康,适合复杂检查。
健康检查的配置
检查间隔:太短增加负载,太长检测延迟。建议 5-10 秒。超时时间:太短误判,太长雪崩。建议 2-5 秒。失败阈值:连续 N 次失败后,后端被剔除。建议 3 次。
主动与被动健康检查
主动健康检查:负载均衡器定期检查后端健康。被动健康检查:负载均衡器根据请求失败判断后端健康(如连续 5 次超时,则认为后端不健康)。
高可用负载均衡
负载均衡器的高可用
负载均衡器是单点故障,需要冗余。主备模式(Active-Standby):主负载均衡器处理请求,备负载均衡器待命。主故障时,备接管。双主模式(Active-Active):两个负载均衡器都处理请求,通过 VRRP(Virtual Router Redundancy Protocol)共享虚拟 IP。
Keepalived
Keepalived 是 VRRP 的实现,可以实现主备和双主模式。主节点定期发送 VRRP 广播,备节点监听广播。如果备节点在超时时间内未收到广播,则认为主节点故障,备节点接管虚拟 IP。
负载均衡器的性能
负载均衡器可能成为瓶颈(CPU、网络、连接数)。优化方式:四层负载均衡(性能高)、会话保持(减少连接建立)、连接复用(HTTP/2)、增加负载均衡器(水平扩展)。