ipvsadm是Linux内核中IPVS模块的管理工具,用于配置四层负载均衡规则,是LVS(Linux Virtual Server)的核心组件,能在内核态直接转发数据包,性能远高于同场景下的用户态代理工具。
ipvsadm是什么:内核态负载均衡的核心工具
IPVS(IP Virtual Server)内置于Linux内核,工作在TCP/UDP协议栈层面,ipvsadm是它的命令行管理接口,负责增删改查虚拟服务器(VIP)、真实服务器(RS)以及调度策略,与Nginx、HAProxy等七层代理相比,ipvsadm不解析应用层协议,只做报文的转发和改写,因此吞吐量极高,响应延迟极低。
行业共识认为,在纯四层分发场景下,ipvsadm的转发性能远优于常规用户态软件,单机承载百万级并发连接是可行的,这也是为什么电商、直播、金融等对稳定性要求极高的业务,普遍采用“LVS(ipvsadm)+ Keepalived”作为入口负载均衡层。
ipvsadm命令详解与安装配置教程
安装与基础环境检查
大多数Linux发行版默认未安装ipvsadm,需要手动操作,以CentOS/RHEL系为例:
yum install -y ipvsadm
Debian/Ubuntu系使用:
apt install -y ipvsadm
安装完成后,先确认内核是否加载了IPVS相关模块:
lsmod | grep ip_vs
若没有输出,手动加载:
modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh
查看当前内核支持的调度算法:
cat /etc/haproxy/../ipvsadm -h
更直接的方式是执行ipvsadm不带参数,若显示空列表则说明运行正常。
核心命令参数速览
ipvsadm的参数体系不复杂,熟练后五分钟内即可完成一套完整的负载均衡配置,常用命令如下:
- 添加虚拟服务器:
ipvsadm -A -t 192.168.1.100:80 -s rr-A表示新增,-t指定TCP协议和VIP端口,-s指定调度算法(rr为轮询)。
- 添加真实服务器:
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g-a追加真实服务器,-r指定RS地址,-g使用DR模式,-m为NAT模式,-i为TUN模式。
- 删除规则:
ipvsadm -D -t 192.168.1.100:80删除整条虚拟服务器规则,ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.11:80仅移除某台RS。 - 查看当前配置:
ipvsadm -L -n以数字形式显示规则和连接状态,ipvsadm -L --stats查看流量统计,查看速率统计。ipvsadm -L --rate
- 清空所有规则:
ipvsadm -C - 保存规则:
ipvsadm-save > /etc/sysconfig/ipvsadm - 恢复规则:
ipvsadm-restore < /etc/sysconfig/ipvsadm
一段完整的配置流程示例如下:
# 定义一个VIP为192.168.1.100的HTTP虚拟服务,使用加权轮询 ipvsadm -A -t 192.168.1.100:80 -s wrr # 添加三台后端真实服务器,权重分别为1、2、3 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 1 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g -w 2 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.13:80 -g -w 3 # 查看结果 ipvsadm -L -n
注意,DR模式下需要确保真实服务器的lo接口绑定VIP并关闭ARP响应,否则回包会异常。
ipvsadm调度算法选型指南
静态与动态算法对比
ipvsadm内置十种调度算法,分为两大类,静态算法不关心后端实时负载,纯按预设规则分发;动态算法会参考当前连接数,如下表所示:
| 算法 | 类型 | 核心逻辑 | 适用场景 |
|---|---|---|---|
| rr | 静态 | 轮询,平均分配 | 后端性能一致时 |
| wrr | 静态 | 加权轮询 | 后端性能差异明显 |
| sh | 静态 | 源地址哈希 | 需要会话保持 |
| dh | 静态 | 目标地址哈希 | 缓存集群 |
| lc | 动态 | 最少连接 | 长连接服务 |
| wlc | 动态 | 加权最少连接 | 最常用,默认推荐 |
| lblc | 动态 | 基于最少连接+源地址 | 兼具会话保持 |
| lblcr | 动态 | 带复制的lblc | 缓存数据库场景 |
| sed | 动态 | 最少期望延迟 | 响应时间差异大 |
| nq | 动态 | 永不排队 | 快速响应场景 |
场景选择建议
HTTP短连接服务多数情况下使用wrr或wlc即可,如果后端服务器配置参差不齐,wrr配合合理的权重比rr效果更可控。
数据库读写分离或Redis集群这类长连接应用,建议使用lc或wlc,避免连接数堆积在某一台机器上。
需要会话保持的Web应用,若不想引入额外的Cookie机制,sh按源IP哈希是最直接的做法,但要注意,当某台RS宕机时,哈希到该机器的用户会全部受影响,此时可配合后端Session共享解决。
业内专家指出,调度算法本身没有绝对优劣,关键看业务模型,选错算法导致的连接倾斜,往往比流量突增更容易拖垮后端。
ipvsadm常见问题与实战排查
连接数查看与超时调整
有段时间线上反馈某些请求特别慢,排查后发现是ipvsadm的TCP超时设置过短,导致长连接被内核提前回收,查看超时参数:
ipvsadm -L --timeout
默认输出类似:
Timeout (tcp tcpfin udp): 900 120 300
意思是TCP空闲连接900秒回收,TCP FIN_WAIT状态120秒回收,UDP 300秒回收,若业务层有心跳保活,可适当调大:
ipvsadm --set 3600 120 300
持久连接配置
部分场景需要同一源IP在固定时间内始终分发到同一台RS,即使调度算法是rr,ipvsadm通过-p参数实现:
ipvsadm -A -t 192.168.1.100:80 -s rr -p 600
-p 600表示持久连接超时600秒,该参数在需要记录用户登录态、且后端未做Session共享时非常有用。
规则不生效的排查路径
配置完成后访问VIP不通,建议按以下顺序排查:
- 确认内核转发开关:
sysctl net.ipv4.ip_forward需为1。 - 确认防火墙放行:iptables/firewalld是否拦截了VIP的流量。
- 确认RS回包路由:DR模式下RS的lo是否绑定VIP,且ARP抑制是否配置正确。
- 确认RS端口健康:在后端本机执行
curl 127.0.0.1:端口验证服务正常。 - 查看ipvsadm连接表:
ipvsadm -L -n --stats,若连接数持续增长但RS无流量,大概率是转发模式配置错误。
ipvsadm与nginx在负载均衡场景下的区别
两者常被放在一起比较,但定位完全不同,ipvsadm是内核态四层转发,nginx是用户态七层代理,具体差异如下:
- 性能:ipvsadm直接在内核空间处理报文,避免了用户态与内核态之间的拷贝,单机吞吐量通常比nginx高一个数量级。
- 功能:nginx能基于URL、Header、Cookie做精细化路由,ipvsadm只能基于IP和端口。
- 健康检查:nginx自带丰富的后端健康检查机制,ipvsadm本身不具备该能力,需要依赖Keepalived或第三方脚本实现。
- 数据修改:nginx可以在转发时改写请求头、压缩响应,ipvsadm对报文内容不做任何修改。
实际架构中,两者通常不是替代关系而是配合关系,客户端流量先经过ipvsadm分发到多台nginx,再由nginx完成七层路由转发到后端应用集群,这种组合兼顾了四层的高性能和七层的灵活性。
ipvsadm的keepalived高可用配置要点
单台LVS调度器本身存在单点故障风险,生产环境必须搭配Keepalived实现主备切换,配置核心思路是:主备节点共享一个VIP,Keepalived通过VRRP协议检测对方存活,主节点故障时VIP自动漂移到备节点。
关键配置项包括:
virtual_ipaddress:指定VIP地址,需与ipvsadm中配置的VIP一致。virtual_server块内定义RS列表和调度算法,Keepalived会自动调用ipvsadm生成规则,无需手动执行ipvsadm -A。real_server块内可配置HTTP_GET或TCP_CHECK健康检查,这样后端RS宕机时,Keepalived会自动将其从ipvsadm规则中摘除。
一个简化的TCP健康检查配置示例:
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意,Keepalived接管后,不要再手动执行ipvsadm命令修改规则,否则主备切换时配置可能被覆盖。
关于ipvsadm调度算法和conntrack关联的常见问题解答
问题:ipvsadm如何查看当前活跃连接数?
执行ipvsadm -L -n --stats可以查看每台RS的活跃连接数(ActiveConn)和非活跃连接数(InactConn),活跃连接指当前正在传输数据的连接,非活跃连接指已建立但空闲的连接,若InactConn持续偏高,说明后端应用处理完请求后未及时关闭连接,需检查应用层的连接池设置。
问题:ipvsadm在华为云和简米云这类云环境上能用吗?
云厂商的负载均衡产品(如简米云SLB、华为云ELB)底层也基于类似LVS的技术实现,但普通云服务器默认禁用了IPVS模块的某些操作权限,若坚持自建,需确认云安全组是否放行VIP流量,且云服务器的网卡是否支持绑定辅助私网IP,多数情况下,云平台自带的负载均衡服务比自建ipvsadm更省心,因为其健康检查、弹性伸缩和DDoS防护能力是开箱即用的。
问题:ipvsadm规则重启后丢失怎么办?
使用ipvsadm-save > /etc/sysconfig/ipvsadm保存规则,并在系统服务中启用ipvsadm自启动,以systemd为例,执行systemctl enable ipvsadm即可,若分发规则完全由Keepalived管理,则无需手动保存,Keepalived启动时会自动重建虚拟服务器和RS列表。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/556841.html




