作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:Squid,Haproxy,LVS,FRP(内网穿透)。
上一小节我们介绍了LVS的概念和部署,本小节来讲解LVS的工作模式和调度算法。本小节的内容都是理论知识,在很多地方其实都能搜索到大致相似的内容。
一、LVS 的 3 种工作模式
1. NAT 模式(Network Address Translation)
客户端请求:客户端发送请求到 VIP(Virtual IP),Director 接收请求后,修改目标 IP 为 Real Server 的 IP(DNAT),转发请求。
服务器响应:Real Server 处理请求后,将响应返回给 Director,Director 修改源 IP 为 VIP(SNAT),返回给客户端。
Real Server 的网关必须指向 Director 的 DIP(Director IP)。
Director 需开启 IP 转发(net.ipv4.ip_forward=1)。
2. DR 模式(Direct Routing)
客户端请求:Director 接收请求后,仅修改目标 MAC 地址为 Real Server 的 MAC,直接转发数据包。
服务器响应:Real Server 处理请求后,直接通过自己的网络接口(不经过 Director)返回响应给客户端。
Director 和 Real Server 必须在同一物理网络(同一广播域)。
Real Server 需配置 VIP 在 lo
接口,并抑制 ARP 响应。
3. TUN 模式(IP Tunneling)
客户端请求:Director 将请求封装在 IP 隧道(如 IPIP、GRE)中,发送给 Real Server。
服务器响应:Real Server 解封装请求后,直接响应客户端(不经过 Director)。
Real Server 需支持 IP 隧道协议。
Real Server 需配置 VIP 在隧道接口(如 tun0
)。
二、LVS 的 10 种调度算法
下面的调度算法实际上和我们前面讲的Nginx服务器差不多,只是他们工作的网络层不一样。
1. 轮询调度(Round Robin, rr)
描述:依次将请求分配给每个后端服务器,循环进行。
适用场景:当所有服务器的处理能力大致相同时,适合使用此算法。
特点:简单、公平,但不考虑服务器当前负载情况。
2. 加权轮询调度(Weighted Round Robin, wrr)
描述:基于服务器权重进行轮询调度。权重越大,分配到的请求越多。
适用场景:服务器性能差异较大时,可以通过设置不同权重来优化资源利用。
特点:在轮询的基础上增加了对服务器处理能力的考量。
3. 最少连接调度(Least Connections, lc)
描述:将请求分配给当前连接数最少的服务器。
适用场景:适用于请求处理时间较长或服务器负载不稳定的情况。
特点:有助于平衡服务器之间的负载,特别是当请求处理时间变化较大时。
4. 加权最少连接调度(Weighted Least Connections, wlc)
描述:结合了最少连接和服务器权重两个因素进行调度。计算公式为:(current connections / weight),值最小的服务器被选中。
适用场景:当服务器性能差异较大且需要更精确地控制负载分布时。
特点:相比 lc 更加灵活,能更好地适应不同性能的服务器集群。
5. 基于局部性的最少连接调度(Locality-Based Least Connections, lblc)
描述:针对源地址进行调度,尝试将来自同一客户端的请求分配给同一个服务器,并优先选择连接数较少的服务器。
适用场景:适用于会话保持需求较高的应用,如 Web 应用程序。
特点:提高缓存命中率,减少跨服务器的数据传输。
6. 基于局部性的最少连接复用调度(Locality-Based Least Connections with Replication, lblcr)
描述:类似于 lblc,但在找不到合适的本地服务器时,会选择一个远程服务器并将其加入到本地服务器列表中。
适用场景:适合于高可用性和高扩展性的应用场景。
特点:增强了 lblc 的灵活性,能够更好地处理动态变化的流量模式。
7. 目标地址哈希调度(Destination Hashing, dh)
描述:根据目标地址(通常是客户端的 IP 地址)进行哈希运算,结果决定分配给哪个服务器。
适用场景:适用于需要会话保持的应用,确保相同客户端的请求总是被发送到同一台服务器。
特点:提供了较好的会话一致性,但可能导致负载不平衡。
8. 源地址哈希调度(Source Hashing, sh)
描述:根据源地址(通常是客户端的 IP 地址)进行哈希运算,结果决定分配给哪个服务器。
适用场景:与 dh 类似,适用于需要会话保持的应用。
特点:确保相同客户端的请求始终被发送到同一台服务器,但同样可能导致负载不平衡。
9. 最短预期延迟调度(Shortest Expected Delay, sed)
描述:选择 (当前连接数 + 1) / 权重 最小的服务器,目的是最小化新连接的预期延迟。
适用场景:适用于希望快速响应新请求的场景。
特点:相比 wlc 更注重新连接的延迟,而非平均负载。
10. 从不排队调度(Never Queue, nq)
描述:如果有一台服务器空闲,则直接选择该服务器;如果没有空闲服务器,则采用加权最少连接调度。
适用场景:适用于希望尽可能避免队列等待的情况。
特点:保证至少一台服务器上的即时响应,其他情况下则依赖于 wlc 算法。