第4章:LVS实战:架构、工作模式与调度算法
各位同学,今天我们来聊聊LVS。说实话,负载均衡这块,LVS是个绕不开的老大哥。我最早接触它是在一个电商大促的项目里,那时候流量一上来,单台服务器根本扛不住。嗯,LVS就是那个站在最前面,帮你把流量分给后面一堆服务器的家伙。
4.1 LVS架构概览
LVS的全称是Linux Virtual Server,说白了就是Linux虚拟服务器。它的核心思想很简单:一个入口,多台后端。
整个架构分三层:
- 负载均衡器(Director):这是最前面那台机器,负责接收所有请求,然后按规则分发给后面的服务器。我习惯叫它“调度员”。
- 真实服务器(Real Server):真正干活儿的机器,跑着你的业务代码。它们可以是一台,也可以是一百台。
- 共享存储:可选组件。如果后端服务器需要访问同一份数据,比如图片、文件,那就得有个共享存储。
你想想看,用户访问的是VIP(虚拟IP),也就是Director的IP。Director收到请求后,根据调度算法,把请求转发给某台Real Server。整个过程对用户是透明的——用户根本不知道后面有几台机器在服务他。
核心要点:LVS工作在OSI模型的第4层(传输层),它只关心IP和端口,不关心HTTP协议内容。所以它比Nginx这类7层负载均衡器性能更高,但灵活性稍差。
下面这张图是我手绘的LVS核心架构,你看一眼就明白了:
4.2 三种工作模式详解
LVS有三种工作模式,每种模式都有自己的脾气。我一个个说。
4.2.1 VS/NAT模式
NAT模式,全称是Virtual Server via Network Address Translation。说白了就是Director当路由器,把请求的源IP和目标IP都改了。
工作流程:
- 用户请求到达Director,目标IP是VIP。
- Director把目标IP改成某台Real Server的IP,源IP改成自己的IP。
- Real Server处理完请求,把响应发回给Director。
- Director再把源IP改回VIP,发回给用户。
注意:NAT模式下,所有流量都经过Director。这意味着Director很容易成为瓶颈。我曾经在一个项目中看到Director网卡被打满,就是因为NAT模式下的流量翻倍了。
配置示例:
# 在Director上配置
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -m
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m
这里的-m就表示使用NAT模式。嗯,就这么简单。
4.2.2 VS/DR模式
DR模式,全称是Virtual Server via Direct Routing。这是我最喜欢用的模式,也是生产环境中最常见的。
核心思想:Director只处理入站请求,出站响应直接由Real Server返回给用户。这样一来,Director的压力就小多了。
怎么做到的?Director和Real Server都配置同一个VIP,但Real Server的VIP配置在loopback接口上,并且不响应ARP请求。这样只有Director会响应VIP的ARP请求,Real Server默默收包。
避坑指南:我曾经在配置DR模式时,忘了在Real Server上设置arp_ignore和arp_announce参数。结果网络上一堆机器都在抢VIP,整个网络都乱了。记住,Real Server上一定要配:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
配置示例:
# Director上配置
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g
# Real Server上配置VIP到lo接口
ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 up
这里的-g表示使用DR模式。注意Real Server的VIP子网掩码是255.255.255.255,不是常规的24位。
4.2.3 VS/TUN模式
TUN模式,全称是Virtual Server via IP Tunneling。这个模式我用的不多,但它在跨机房场景下特别好用。
Director把请求封装在一个IP隧道里,发给Real Server。Real Server解封装后处理请求,响应直接返回给用户。说白了,就是Director只负责“指路”,不负责“带路”。
适用场景:Real Server和Director不在同一个物理网络,比如跨机房、跨地域。
配置示例:
# Director上配置
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.10:80 -i
ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.11:80 -i
# Real Server上需要配置tunl接口
ifconfig tunl0 192.168.1.100 netmask 255.255.255.255 up
这里的-i表示使用TUN模式。注意Real Server的IP是192.168.2.x,和Director不在同一个网段。
4.3 三种模式对比
| 特性 | VS/NAT | VS/DR | VS/TUN |
|---|---|---|---|
| Real Server和Director网络关系 | 同一网络 | 同一网络 | 可跨网络 |
| Real Server是否需要修改 | 不需要 | 需要配置VIP和ARP | 需要配置tunl接口 |
| Director是否处理响应流量 | 是 | 否 | 否 |
| 性能瓶颈 | Director容易成为瓶颈 | 性能最好 | 性能较好,但隧道有开销 |
| 端口映射 | 支持 | 不支持 | 不支持 |
4.4 调度算法详解
调度算法,说白了就是Director怎么决定把请求发给哪台Real Server。LVS支持十几种算法,我挑几个最常用的说说。
4.4.1 RR(轮询)
最简单的算法。一个接一个地轮着来。第一请求给Server1,第二个给Server2,第三个给Server3,然后回到Server1。
适用场景:所有Real Server配置完全一样,性能也差不多。我一般在测试环境用这个。
4.4.2 WRR(加权轮询)
给每台Real Server配一个权重。权重高的,分到的请求就多。比如Server1权重3,Server2权重1,那每4个请求里,3个给Server1,1个给Server2。
配置示例:
ipvsadm -A -t 192.168.1.100:80 -s wrr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g -w 3
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 1
4.4.3 LC(最少连接)
把请求发给当前连接数最少的Real Server。这个算法比较智能,能自动适应后端负载的变化。
为什么会这样?因为连接数少,说明这台机器相对空闲。把请求发给它,能平衡负载。
注意:LC算法有个问题——如果某台Real Server突然处理完所有请求,连接数变成0,那所有新请求都会涌向它。这就是所谓的“惊群效应”。我遇到过这种情况,一台机器瞬间被打满。
4.4.4 WLC(加权最少连接)
LC的升级版。在最少连接的基础上,加上权重。公式是:(当前连接数 + 1) / 权重,值最小的那个被选中。
这是LVS的默认算法,也是我推荐大家在生产环境使用的。它兼顾了连接数和权重,比较均衡。
4.4.5 其他算法
- DH(目标地址哈希):根据目标IP做哈希,保证同一个目标IP的请求总是发给同一台Real Server。适合做缓存。
- SH(源地址哈希):根据源IP做哈希,实现会话保持。
- LBLC(基于局部性的最少连接):DH和LC的结合,适合缓存场景。
4.5 实战经验总结
说了这么多,我总结几条实战经验:
- 优先选DR模式:除非你的Real Server和Director不在同一个网络,否则DR模式是性能最好的选择。
- 调度算法用WLC:这是LVS的默认算法,也是经过大量实践验证的。除非你有特殊需求,否则别乱改。
- 注意ARP问题:DR模式下,Real Server的ARP配置一定要做对。我曾经因为这个坑,排查了整整一个下午。
- 监控Director的网卡:NAT模式下,Director的网卡流量是实际业务流量的两倍。别等网卡被打满了才发现。
小技巧:用ipvsadm -L -n可以查看当前的连接分布。如果发现某台Real Server的连接数异常高,赶紧去查查那台机器是不是出问题了。
好了,LVS的架构、三种工作模式和调度算法就讲到这里。这些东西看着简单,但真正用起来,坑还是挺多的。多动手,多踩坑,慢慢就熟练了。