1. LVS负载均衡核心原理剖析
LVS(Linux Virtual Server)作为Linux内核原生支持的负载均衡解决方案,其设计哲学可以用"极简主义"来概括。与Nginx等应用层负载均衡器不同,LVS工作在网络协议栈的传输层(L4),这种架构选择带来了显著的性能优势。在内核态直接处理数据包转发,避免了用户态与内核态之间的上下文切换开销,实测单机可轻松支撑数十万并发连接。
1.1 关键网络角色解析
理解LVS必须掌握四个核心IP的概念:
-
VIP(Virtual IP):192.168.0.200 这个浮动IP是整个系统的门面,客户端始终只与这个IP通信。它的精妙之处在于:所有真实服务器(RS)也都配置了这个IP在本地回环接口上,但通过ARP抑制机制确保只有调度器会响应VIP的ARP请求。
-
DIP(Director IP):192.168.0.50 是调度器的真实物理IP,负责与后端RS通信。在DR模式下,DIP仅用于健康检查等管理流量,不参与实际数据转发。
-
RIP(Real Server IP):192.168.0.10/20 是后端业务服务器的真实IP。特别注意:这些服务器虽然配置了VIP,但通过内核参数
arp_ignore=1和arp_announce=2确保它们不会对外宣告VIP的ARP响应。 -
CIP(Client IP):172.25.254.99 代表终端用户IP。在DR模式下,RS会直接将响应包返回给CIP,形成"三角传输"模式(CIP→VIP→RIP→CIP),这显著减轻了调度器的带宽压力。
1.2 DR模式流量路径拆解
DR(Direct Routing)模式的工作流程堪称精妙:
- 请求阶段:客户端发送SYN包到VIP,调度器通过IPVS模块修改目标MAC地址(不修改IP!)将包转发给选中的RS。
- 响应阶段:RS处理完请求后,利用配置在lo接口上的VIP直接构造响应包,通过默认路由(192.168.0.100)返回给客户端。
这种设计的巧妙之处在于:
- 入站流量经过调度器实现负载均衡
- 出站流量绕过调度器直接返回,避免带宽瓶颈
- 全程只有调度器需要修改数据链路层信息(MAC地址),IP层完全透明
关键验证技巧:通过
tcpdump -i eth0 -nn host 192.168.0.200在调度器和RS上抓包,可以清晰观察到请求包的MAC地址变化,而IP头始终保持不变。
2. 实验环境深度配置指南
2.1 网络拓扑规划
实验环境采用三层架构:
code复制[Client(172.25.254.99)]
│
↓ (通过VIP访问)
[Router(172.25.254.100↔192.168.0.100)]
│
↓
[LVS Director(192.168.0.50)]
├─ [RS1(192.168.0.10)]
└─ [RS2(192.168.0.20)]
2.1.1 路由器关键配置
bash复制# 启用IP转发功能(必须)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p
# 配置SNAT实现跨网段访问
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
2.1.2 调度器VIP配置
采用NetworkManager持久化配置VIP(优于ifconfig临时配置):
ini复制# /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.200/32 # VIP配置为32位掩码
2.2 真实服务器特殊配置
2.2.1 ARP抑制机制
DR模式最关键的配置就是防止RS响应VIP的ARP请求:
bash复制# 配置ARP忽略规则
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# 配置ARP宣告策略
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
这些参数的实际作用:
arp_ignore=1:只响应目标IP是本机接收网卡IP的ARP请求arp_announce=2:始终使用最佳本地地址进行ARP宣告(即物理网卡IP)
2.2.2 回环接口VIP配置
同样使用NetworkManager持久化配置:
ini复制# /etc/NetworkManager/system-connections/lo.nmconnection
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32 # 必须与调度器VIP相同
常见坑点:如果RS上VIP配置的掩码不是32位,可能导致路由异常。通过
ip a show lo确认VIP配置正确性。
3. LVS核心操作实战
3.1 负载均衡规则配置
使用ipvsadm配置DR模式集群:
bash复制# 清空现有规则
ipvsadm -C
# 添加虚拟服务(-g表示DR模式)
ipvsadm -A -t 192.168.0.200:80 -s rr
# 添加真实服务器(-r指定RIP,-g保持DR模式)
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
# 查看配置结果
ipvsadm -Ln
关键参数解析:
-s rr:指定轮询(Round Robin)调度算法,生产环境常用wlc(加权最小连接)-g:表示DR模式,等同于--gatewaying-m:表示NAT模式,DR模式中绝对不要使用
3.2 持久化与服务管理
保存当前规则并设置开机自启:
bash复制# 保存规则(RHEL/CentOS特有方式)
ipvsadm-save -n > /etc/sysconfig/ipvsadm
# 启用服务(注意:部分系统需要手动安装服务单元)
systemctl enable --now ipvsadm
验证技巧:
bash复制# 实时查看连接分发情况
watch -n 1 ipvsadm -lnc
# 检查持久化文件内容
cat /etc/sysconfig/ipvsadm
4. 深度排错与性能调优
4.1 常见故障排查表
| 故障现象 | 排查命令 | 可能原因 | 解决方案 |
|---|---|---|---|
| 客户端连接超时 | telnet VIP 80 |
路由器未开启转发 | 检查/proc/sys/net/ipv4/ip_forward |
| RS无法返回数据 | tcpdump -i eth0 host CIP |
默认路由错误 | 检查RS的ip route show |
| VIP无法ping通 | `arp -an | grep VIP` | ARP抑制失效 |
| 流量不均衡 | ipvsadm -lnc |
调度算法不当 | 更换为wlc算法 |
4.2 内核参数调优建议
bash复制# 提高LVS连接哈希表大小
echo 2097152 > /proc/sys/net/ipv4/vs/conn_tab_bits
# 调整TIME_WAIT回收(适用于NAT模式)
echo 1 > /proc/sys/net/ipv4/vs/expire_nodest_conn
# 开启SYN Cookie防护
echo 1 > /proc/sys/net/ipv4/vs/syncookies
4.3 高可用方案设计
生产环境推荐采用Keepalived实现LVS高可用:
bash复制# Keepalived配置示例
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.0.200/32 dev eth0
}
}
实测数据:在双机热备配置下,故障切换时间可控制在3秒以内,结合健康检查可实现真正的业务无损切换。