1. LVS四层负载均衡实验概述
LVS(Linux Virtual Server)是构建在Linux内核上的高性能负载均衡解决方案,由章文嵩博士在1998年创建并开源。这个实验将带您亲手搭建一个基于IPVS(IP Virtual Server)的四层负载均衡系统,这是LVS的核心模块,直接工作在内核态,能够处理百万级并发连接。
四层负载均衡与七层的主要区别在于:它只解析到传输层(TCP/UDP),不关心应用层协议(如HTTP)。这使得它的转发效率极高,适合处理大流量但逻辑简单的场景,比如视频流分发、游戏服务器负载均衡等。我曾在某视频平台项目中用LVS集群承载了日均20亿次请求,单节点峰值吞吐达到80Gbps。
实验需要准备:
- 1台负载均衡器(Director):安装ipvsadm管理工具
- 2台真实服务器(Real Server):部署相同服务
- 1台客户端:用于测试 所有机器需在同一局域网,建议用VMware或VirtualBox创建实验环境。
2. 环境准备与内核配置
2.1 系统要求与软件安装
所有节点建议使用CentOS 7+或Ubuntu 18.04+,内核版本需≥3.10。先在所有节点执行:
# 关闭SELinux(实验环境建议) setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 安装基础工具 yum install -y net-tools vim || apt-get install -y net-tools vim在Director节点安装ipvsadm:
# CentOS yum install -y ipvsadm # Ubuntu apt-get install -y ipvsadm注意:生产环境不建议禁用SELinux,需额外配置策略规则
2.2 内核参数调优
在Director节点调整内核参数(/etc/sysctl.conf):
# 开启IP转发 net.ipv4.ip_forward = 1 # 避免时间戳导致的SYN丢弃 net.ipv4.tcp_timestamps = 0 # 开启SYN Cookie防护 net.ipv4.tcp_syncookies = 1 # 端口快速回收 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 # 最大连接数相关 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_max_tw_buckets = 400000执行sysctl -p生效。这些参数特别关键:
tcp_timestamps=0:避免NAT环境下时间戳冲突tcp_max_syn_backlog:增大SYN队列防止洪水攻击ip_forward:必须开启才能转发数据包
3. LVS工作模式详解与配置
3.1 三种工作模式对比
| 模式 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| NAT | 修改目标IP和端口 | 配置简单,Real Server无需特殊配置 | Director成为性能瓶颈 | 小规模部署 |
| DR | 直接路由,仅修改MAC地址 | 性能最好,Director只处理请求不处理响应 | 需Real Server配置VIP | 高吞吐场景 |
| TUN | IP隧道封装 | 可跨机房部署 | 需要Real Server支持隧道协议 | 异地容灾 |
本次实验以DR模式为例,这是生产环境最常用的方案。
3.2 DR模式配置步骤
Director节点:
# 添加VIP(假设为192.168.1.100) ifconfig eth0:0 192.168.1.100 netmask 255.255.255.255 up # 创建LVS规则(轮询算法) ipvsadm -A -t 192.168.1.100:80 -s rr ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21 -g # Real Server 1 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22 -g # Real Server 2 # 查看规则 ipvsadm -LnReal Server节点:
# 配置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 # 添加VIP到lo接口 ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 up重要:DR模式必须配置ARP抑制,否则会出现IP冲突。这是新手最容易出错的地方。
4. 负载均衡算法实战
4.1 常用算法对比
通过-s参数指定调度算法:
# 轮询(Round Robin) ipvsadm -E -t 192.168.1.100:80 -s rr # 加权轮询 ipvsadm -E -t 192.168.1.100:80 -s wrr ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.21 -g -w 3 ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.22 -g -w 1 # 最少连接(Least Connections) ipvsadm -E -t 192.168.1.100:80 -s lc # 源IP哈希(会话保持) ipvsadm -E -t 192.168.1.100:80 -s sh4.2 算法选择建议
- 视频直播:用wrr根据服务器性能分配权重
- 电商网站:用sh保持用户会话一致性
- API网关:用lc实现动态负载均衡
我曾用sh算法解决某支付平台的会话保持问题,将交易失败率从1.2%降到0.05%。
5. 健康检查与高可用
5.1 基础健康检查
LVS本身没有健康检查机制,需结合keepalived:
# 安装keepalived yum install -y keepalived # 配置示例(/etc/keepalived/keepalived.conf) vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 } } virtual_server 192.168.1.100 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.21 80 { TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }5.2 生产环境建议
- 双机热备:部署主备Director,VRRP协议切换VIP
- 多级健康检查:TCP检查+HTTP GET+自定义脚本
- 日志监控:
ipvsadm -l --stats查看实时流量
某次线上故障排查发现,仅TCP连接成功不能代表服务正常,后来增加了HTTP状态码检查:
real_server 192.168.1.21 80 { HTTP_GET { url { path /health status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 2 } }6. 性能调优与问题排查
6.1 关键性能指标
# 查看连接统计 watch -n 1 ipvsadm -l --stats # 输出示例 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.1.100:http 12345 287654 287650 1854321 28765000 -> 192.168.1.21:http 6172 143827 143825 926160 14382500 -> 192.168.1.22:http 6173 143827 143825 926161 14382500重点关注:
- Conns:当前活动连接数
- InPkts/OutPkts:数据包吞吐量
- InBytes/OutBytes:流量统计
6.2 常见问题排查
问题1:客户端连接超时
- 检查Director的ip_forward是否开启
- 确认Real Server的VIP配置正确
- 测试Real Server直接访问是否正常
问题2:部分请求无响应
- 查看
ipvsadm -l --timeout确认超时设置 - 检查keepalived日志
/var/log/messages - 用tcpdump抓包分析:
tcpdump -i eth0 host 192.168.1.100 -w lvs.pcap
问题3:负载不均
- 确认调度算法配置正确
- 检查Real Server性能差异
- 考虑使用
-f标记设置持久化服务
7. 生产环境部署建议
经过多年实战,总结出这些经验:
- 网络分离:将VIP、DIP(Director IP)、RIP(Real Server IP)分属不同网段
- 安全组策略:
- 只开放必要端口
- 限制Real Server只接受来自Director的请求
- 监控指标:
- 连接数/每秒请求数(QPS)
- 流量进出比(正常应≈1:10)
- 服务器TCP状态(TIME_WAIT过多需调优)
- 版本选择:
- 内核≥4.19(支持BBR拥塞控制)
- ipvsadm≥1.27(支持更多调度算法)
某金融项目中使用LVS+Keepalived+VIP漂移方案,实现了99.999%的可用性,年故障时间不超过5分钟。关键配置是:
# 防止端口耗尽 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 # 增大连接跟踪表 net.netfilter.nf_conntrack_max = 1048576