架构之LVS(Linux Virtual Server)
架构之LVS (Linux Virtual Server)
目录
简介
Linux Virtual Server (LVS) 是 Linux 系统上的高性能四层负载均衡解决方案。LVS 由章文嵩于 1998 年开发,自 Linux 2.4 版本起成为 Linux 内核的一部分,通过 IP 负载均衡技术提供可扩展的网络服务。
核心特性
- 四层负载均衡:在传输层(TCP/UDP)工作
- 内核级实现:高性能,开销极小
- 多种工作模式:NAT、隧道和直接路由
- 灵活的调度:多种负载分配算法
- 高可用性:支持 keepalived 故障转移
- 开源:免费且是 Linux 内核的一部分
为什么选择 LVS?
- 性能:每秒可处理数百万个连接
- 稳定性:在生产环境中已验证数十年
- 成本效益:无许可费用,可在普通硬件上运行
- 可扩展性:通过添加真实服务器实现水平扩展
架构概览
LVS 实现了三层架构:
┌─────────────────┐
│ 客户端 │
└────────┬────────┘
│
┌────────▼────────┐
│ LVS 调度器 │
│ (负载均衡器) │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ 真实 │ │ 真实 │ │ 真实 │
│ 服务器 1│ │ 服务器 2 │ │ 服务器 N │
└─────────┘ └─────────┘ └─────────┘
核心概念
调度器(负载均衡器)
- 接收入站流量的 LVS 服务器
- 将请求分发到后端真实服务器
- 可以是主备模式或双主模式
真实服务器
- 实际处理请求的后端服务器
- 可以是物理机或虚拟机
- 运行实际的应用服务
虚拟服务(VS)
- 向客户端暴露的服务
- 由 IP 地址、端口和协议(TCP/UDP)定义
虚拟服务器(VIP)
- 客户端连接的 IP 地址
- 可以是用于高可用的浮动 IP
LVS 组件
1. IPVS (IP Virtual Server)
IPVS 是实现负载均衡的核心内核模块。它在网络层工作,提供传输层负载均衡。
主要功能:
- 连接跟踪
- 数据包转发
- 调度决策
- 健康检查(通过用户空间工具)
2. ipvsadm
用于管理 IPVS 的用户空间命令行工具:
- 添加/删除虚拟服务
- 添加/删除真实服务器
- 配置调度算法
- 监控统计信息
3. keepalived
LVS 的高可用框架:
- VRRP(虚拟路由冗余协议)实现
- 真实服务器的健康检查
- 自动故障转移
- 邮件通知
工作模式
LVS 支持三种主要的转发模式,每种都有不同的特点:
1. NAT 模式(网络地址转换)
工作原理:
- 调度器同时修改源 IP 和目的 IP
- 响应流量通过调度器返回
- 真实服务器使用调度器作为默认网关
客户端 → VIP (调度器) → RIP (真实服务器) → VIP (调度器) → 客户端
[SNAT/DNAT] [默认网关] [反向 NAT]
特点:
- 优点:
- 真实服务器可以使用任何操作系统
- 配置简单
- 真实服务器不需要公网 IP
- 缺点:
- 调度器成为瓶颈
- 延迟较高(两次穿越)
- 可扩展性有限
适用场景:
- 中小型部署
- 异构服务器环境
- 当真实服务器在私有网络上时
2. TUN 模式(IP 隧道)
工作原理:
- 调度器使用 IP-in-IP 隧道封装数据包
- 真实服务器解封装并直接响应客户端
- 响应不经过调度器
客户端 → VIP (调度器) → [IP 隧道] → 真实服务器 → 客户端
[封装] [解封装]
特点:
- 优点:
- 高可扩展性
- 低延迟
- 调度器不在返回路径上
- 支持地理分布的服务器
- 缺点:
- 真实服务器需要支持 IP 隧道
- 配置较复杂
- 轻微的封装开销
适用场景:
- 大规模部署
- 分布式数据中心
- 当性能至关重要时
3. DR 模式(直接路由)
工作原理:
- 调度器重写数据包的 MAC 地址
- 真实服务器使用 VIP 直接响应
- 所有服务器必须在同一网段
客户端 → VIP (调度器) → [MAC 重写] → 真实服务器 → 客户端
[同一网络] [ARP 问题] [直接响应]
特点:
- 优点:
- 最高性能
- 最小开销
- 无封装
- 调度器不在返回路径上
- 缺点:
- 所有服务器必须在同一 L2 网络
- 需要 ARP 处理(VIP 必须配置在 lo:0 上)
- 配置较复杂
适用场景:
- 高性能要求
- 单数据中心部署
- 当所有服务器在同一机架/交换机时
对比表
| 特性 | NAT | TUN | DR |
|---|---|---|---|
| 性能 | 低 | 高 | 最高 |
| 可扩展性 | 有限 | 高 | 高 |
| 网络要求 | 任意 | 任意 | 同一 L2 |
| 服务器操作系统 | 任意 | Linux | Linux |
| 配置难度 | 简单 | 中等 | 复杂 |
| 返回路径 | 经过调度器 | 直接 | 直接 |
| 地理分布 | 否 | 是 | 否 |
调度算法
LVS 提供多种调度算法来分配流量:
静态算法
1. 轮询(rr)
- 按顺序分发请求
- 均匀分布,不考虑服务器容量
ipvsadm -A -t 192.168.1.100:80 -s rr
2. 加权轮询(wrr)
- 向容量更大的服务器分配更多连接
- 权重手动配置
ipvsadm -A -t 192.168.1.100:80 -s wrr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -m -w 3
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -m -w 1
3. 目标地址哈希(dh)
- 对目标 IP 进行哈希以选择服务器
- 确保相同目标访问同一服务器
- 适用于缓存服务器
4. 源地址哈希(sh)
- 对源 IP 进行哈希以选择服务器
- 确保相同客户端访问同一服务器
- 适用于会话保持
动态算法
5. 最少连接(lc)
- 路由到活动连接数最少的服务器
- 考虑当前负载
ipvsadm -A -t 192.168.1.100:80 -s lc
6. 加权最少连接(wlc)
- 同时考虑连接数和服务器权重
- 默认且最常用的算法
ipvsadm -A -t 192.168.1.100:80 -s wlc
7. 基于局部性的最少连接(lblc)
- 用于缓存服务器
- 路由到同一局部区域中连接数最少的服务器
8. 带复制的基于局部性的最少连接(lblcr)
- 类似于 lblc,但带有复制
- 更适合分布式缓存
9. 最短预期延迟(sed)
- 考虑活动连接和服务器权重
- 最小化预期响应时间
10. 从不排队(nq)
- sed 的变体
- 如果服务器空闲,立即分配,不考虑权重
算法选择指南
| 场景 | 推荐算法 |
|---|---|
| 相同容量的服务器 | rr 或 lc |
| 不同容量的服务器 | wrr 或 wlc |
| 需要会话保持 | sh |
| 缓存服务器 | dh 或 lblc |
| 通用用途 | wlc(默认) |
部署架构
单调度器部署
互联网
│
▼
┌─────────────┐
│ 防火墙 │
└──────┬──────┘
│
▼
┌─────────────┐
│ LVS 调度器 │ VIP: 203.0.113.10
└──────┬──────┘
│
┌───┴───┬───┬───┐
▼ ▼ ▼ ▼
RS1 RS2 RS3 RS4
高可用部署(主备模式)
互联网
│
▼
┌─────────────┐
│ 防火墙 │
└──────┬──────┘
│
▼
┌─────────────────────────┐
│ VRRP 组 │
│ ┌─────────┐ ┌─────────┐│
│ │ 主节点 │ │ 备节点 ││
│ │ LVS │ │ LVS ││
│ │VIP:活跃 │ │VIP:待机 ││
│ └────┬────┘ └────┬────┘│
│ │ │ │
│ └─────┬──────┘ │
└─────────────┼─────────────┘
│
┌────┴────┬────┬────┐
▼ ▼ ▼ ▼
RS1 RS2 RS3 RS4
双主部署
互联网
│
▼
┌─────────────┐
│ 防火墙 │
└──────┬──────┘
│
┌───┴────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ LVS-1 │ │ LVS-2 │
│VIP:203.0│ │VIP:203.0│
│.113.10 │ │.113.11 │
└────┬────┘ └────┬────┘
│ │
└─────┬──────┘
│
┌────┴────┬────┬────┐
▼ ▼ ▼ ▼
RS1 RS2 RS3 RS4
配置
NAT 模式基础配置
1. 在调度器上启用 IP 转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
2. 配置 IPVS:
# 安装 ipvsadm
yum install ipvsadm -y # RHEL/CentOS
# 或
apt-get install ipvsadm -y # Debian/Ubuntu
# 添加虚拟服务
ipvsadm -A -t 203.0.113.10:80 -s wlc
# 添加真实服务器
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.101:80 -m -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.102:80 -m -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.103:80 -m -w 1
# 保存配置
ipvsadm-save > /etc/sysconfig/ipvsadm # RHEL/CentOS
# 或
ipvsadm-save > /etc/ipvsadm.rules # Debian/Ubuntu
3. 配置真实服务器(设置默认网关为调度器):
route add default gw 192.168.1.100
DR 模式配置
1. 调度器配置:
# 将 VIP 添加到接口
ip addr add 203.0.113.10/32 dev eth0
# 配置 IPVS
ipvsadm -A -t 203.0.113.10:80 -s wlc
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.101:80 -g -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.102:80 -g -w 1
2. 真实服务器配置:
# 将 VIP 添加到回环接口
ip addr add 203.0.113.10/32 dev lo
# 抑制 ARP 响应
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
# 使更改持久化
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
Keepalived 配置
/etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global_defs {
notification_email {
admin@example.com
}
notification_email_from lvs@example.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DIRECTOR
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
203.0.113.10
}
}
virtual_server 203.0.113.10 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.101 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.102 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
高可用性
VRRP(虚拟路由冗余协议)
Keepalived 实现了 VRRP 用于自动故障转移:
核心概念:
- 虚拟路由器:具有 VIP 的逻辑路由器
- 主节点:处理流量的活动节点
- 备节点:备用节点
- 优先级:决定哪个节点成为主节点
- 通告间隔:VRRP 数据包发送频率
故障转移过程:
- 主节点停止发送通告
- 备节点检测到主节点故障(丢失 3 个通告)
- 优先级最高的备节点成为新的主节点
- VIP 移动到新的主节点
- 发送免费 ARP 以更新网络
健康检查
Keepalived 提供多种健康检查方法:
1. TCP_CHECK
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
2. HTTP_GET
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
3. SSL_GET
SSL_GET {
url {
path /health
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
4. MISC_CHECK
MISC_CHECK {
misc_path "/usr/local/bin/check_service.sh"
misc_timeout 5
}
脑裂预防
为防止脑裂场景:
- 使用奇数个节点
- 配置正确的认证
- 对于多节点设置使用单播而不是组播
- 使用外部工具进行监控
性能优化
内核调优
1. 增加连接跟踪表:
echo "net.netfilter.nf_conntrack_max = 1000000" >> /etc/sysctl.conf
2. 调整超时:
echo "net.netfilter.nf_conntrack_tcp_timeout_established = 1200" >> /etc/sysctl.conf
3. 启用连接跟踪优化:
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
硬件考虑
CPU:
- 多核用于处理大量连接
- 对于大型部署考虑 NUMA 感知
网络:
- 10GbE+ 用于高吞吐量
- 多网卡用于冗余
- 虚拟化使用 SR-IOV
内存:
- 连接跟踪需要内存
- 经验法则:每个连接约 350 字节
应用级优化
1. 启用 HTTP keep-alive:
- 减少连接开销
- 更适合长连接
2. 优化真实服务器性能:
- 调整 Web 服务器(Nginx/Apache)
- 启用缓存
- 使用连接池
3. 持久化超时:
- 平衡会话亲和性和负载分配
- 典型值:50-300 秒
最佳实践
1. 安全
网络安全:
- 将 LVS 放在防火墙后面
- 限制管理访问
- 对真实服务器使用私有网络
- 实施速率限制
系统安全:
- 保持内核更新
- 使用最小化安装
- 禁用不必要的服务
- 定期安全审计
2. 监控
需要监控的关键指标:
- 连接速率和数量
- 服务器健康状态
- CPU 和内存使用率
- 网络吞吐量
- 响应时间
工具:
ipvsadm -Ln --rate:实时统计ipvsadm -Lnc:连接表- Prometheus + Grafana 用于可视化
- ELK Stack 用于日志分析
3. 容量规划
计算需求:
- 每秒峰值连接数
- 平均连接持续时间
- 每个连接的带宽
- 所需真实服务器数量
公式:
所需连接数 = 峰值 CPS × 平均持续时间
所需带宽 = 峰值 CPS × 每连接平均字节数
4. 测试
负载测试:
- 使用 ApacheBench、wrk 或 JMeter 等工具
- 使用真实的流量模式进行测试
- 测试期间监控系统
- 验证故障转移是否正常工作
故障转移测试:
- 模拟调度器故障
- 验证 VIP 正确移动
- 使用活动连接进行测试
- 验证无数据包丢失
5. 文档
维护:
- 网络拓扑图
- 配置文件(版本控制)
- 常见问题操作手册
- 团队联系信息
使用场景
1. Web 服务器负载均衡
场景: 高流量网站,有多个 Web 服务器
配置:
- 模式:DR(为了性能)
- 算法:wlc
- 持久化:0(无状态应用)
- 健康检查:HTTP_GET /health
2. 数据库负载均衡
场景: 读密集型数据库,有多个读副本
配置:
- 模式:NAT(为了简单)
- 算法:wrr(主节点权重较低)
- 持久化:源地址哈希(用于连接池)
- 健康检查:TCP_CHECK 数据库端口
3. API 网关负载均衡
场景: 微服务 API,有多个实例
配置:
- 模式:DR
- 算法:最少连接
- 持久化:基于 API 密钥(通过应用)
- 健康检查:HTTP_GET /health
4. 内容分发网络
场景: 分布式缓存服务器
配置:
- 模式:TUN(用于地理分布)
- 算法:目标地址哈希
- 持久化:基于内容哈希
- 健康检查:HTTP_GET 带缓存验证
5. FTP 负载均衡
场景: FTP 服务,有多个服务器
配置:
- 模式:NAT(FTP 需要 NAT 进行数据连接)
- 算法:源地址哈希
- 持久化:长持续时间(用于 FTP 会话)
- 健康检查:TCP_CHECK 端口 21
与其他负载均衡器的对比
LVS vs Nginx
| 特性 | LVS | Nginx |
|---|---|---|
| 层级 | 4 | 4/7 |
| 性能 | 更高 | 高 |
| SSL 终止 | 否 | 是 |
| 内容交换 | 否 | 是 |
| 配置 | 复杂 | 简单 |
| 可扩展性 | 非常高 | 高 |
| 适用场景 | 高吞吐量 | Web 应用 |
LVS vs HAProxy
| 特性 | LVS | HAProxy |
|---|---|---|
| 层级 | 4 | 4/7 |
| 性能 | 更高 | 高 |
| SSL 终止 | 否 | 是 |
| 健康检查 | 外部 | 内置 |
| 统计信息 | 基础 | 高级 |
| 配置 | ipvsadm | 声明式 |
| 适用场景 | 网络负载均衡 | 应用负载均衡 |
LVS vs 硬件负载均衡器(F5、Citrix)
| 特性 | LVS | 硬件 LB |
|---|---|---|
| 成本 | 免费 | 昂贵 |
| 性能 | 高 | 非常高 |
| 功能 | 基础 | 全面 |
| 支持 | 社区 | 企业级 |
| 管理 | CLI | GUI/API |
| 适用场景 | 成本效益 | 关键任务 |
结论
LVS 仍然是 Linux 环境中强大且具有成本效益的负载均衡解决方案。其内核级实现提供了卓越的性能,使其适用于高流量场景。虽然较新的软件负载均衡器在七层提供更多功能,但 LVS 在纯四层场景中表现出色,其中性能至关重要。
何时使用 LVS
- 高性能要求
- 四层负载均衡足够
- 预算限制
- 仅 Linux 环境
- 需要内核级性能
何时考虑替代方案
- 需要七层功能(SSL 终止、内容路由)
- 需要高级健康检查
- 异构环境
- 更喜欢 GUI 管理
- 需要企业级支持
延伸阅读
- LVS 官方文档:http://www.linuxvirtualserver.org/
- Keepalived 文档:https://keepalived.org/
- IPVS 手册页:
man ipvsadm - Linux 内核文档:Documentation/networking/ipvs-sysctl.txt
附录
A. 常用命令
查看统计信息:
ipvsadm -Ln --rate
查看连接表:
ipvsadm -Lnc
清除所有规则:
ipvsadm -C
保存配置:
ipvsadm-save > /etc/ipvsadm.rules
恢复配置:
ipvsadm-restore < /etc/ipvsadm.rules
B. 故障排除
连接未被分发:
- 检查 ipvsadm 规则:
ipvsadm -Ln - 验证真实服务器可达
- 检查防火墙规则
- 验证 IP 转发已启用
VIP 无响应:
- 检查 VIP 是否配置:
ip addr show - 验证 VRRP 状态:
systemctl status keepalived - 检查网络连接
- 验证无 ARP 冲突
CPU 使用率过高:
- 检查连接数:
ipvsadm -Lnc | wc -l - 增加 nf_conntrack_max
- 考虑添加更多调度器
- 检查调度算法
C. 性能基准测试
现代硬件上的典型性能:
| 模式 | 连接/秒 | 吞吐量 |
|---|---|---|
| NAT | ~100K | ~10 Gbps |
| DR | ~1M+ | ~40 Gbps+ |
| TUN | ~800K | ~30 Gbps |
注意:实际性能取决于硬件、内核版本和配置
更多推荐



所有评论(0)