LVS - 安装配置 完全指南
发布时间:2026-04-30 18:02
LVS安装配置:Linux负载均衡集群快速部署实战指南,手把手带你从零搭建LVS+Keepalived高可用架构,解决单点故障与流量分发问题。
一、前言
搞过的人都知道,线上流量一上来,Nginx单节点扛不住,Keepalived配起来又像在读天书,想快速搭个企业级负载均衡,LVS是首选。官方文档写得跟考古文献似的,今天把这十年的经验掰碎了讲,从源码编译到生产配置,一条龙给你整明白。
二、操作步骤
步骤1:确认系统环境与依赖
先看看你手里这台机器能不能跑LVS,内核版本太低可不行。
# 查看内核版本(必须 >= 2.6)
uname -r
# CentOS/RHEL 查看系统版本
cat /etc/centos-release
# Ubuntu 查看系统版本
cat /etc/lsb-release
# 检查是否已安装IPVS内核模块
modprobe ip_vs
lsmod | grep ip_vs
预期输出:
3.10.0-1160.el7.x86_64
CentOS Linux release 7.9.2009 (Core)
ip_vs 134544 0
libcrc32c 12695 1 ip_vs
如果 lsmod | grep ip_vs 没有输出,别慌,执行 modprobe ip_vs 加载模块即可。
步骤2:安装编译工具与依赖包
编译LVS需要趁手的工具,缺哪个装哪个。
# CentOS/RHEL 安装依赖
yum install -y gcc gcc-c++ make libtool libnfnetlink-devel openssl-devel
# Ubuntu 安装依赖
apt-get update && apt-get install -y build-essential libtool libssl-dev libnl-3-dev libnl-genl-3-dev
预期输出(CentOS/RHEL):
已加载插件: fastestmirror, langpacks
正在安装:
gcc x86_64 4.8.5-44.el7 @base
gcc-c++ x86_64 4.8.5-44.el7 @base
make x86_64 3.82-24.el7 @base
libtool x86_64 2.4.2-12.el7 @base
已安装完毕!
预期输出(Ubuntu):
正在设置软件包 build-essential ... 完成
正在设置软件包 libssl-dev ... 完成
正在设置软件包 libnl-3-dev ... 完成
步骤3:下载并编译安装ipvsadm
ipvsadm是LVS的管理工具,没它你只能对着内核干瞪眼。
# 下载稳定版源码包
cd /tmp
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.31.tar.gz
# 解压编译
tar zxvf ipvsadm-1.31.tar.gz
cd ipvsadm-1.31
# 编译安装
make && make install
# 验证安装
ipvsadm --version
预期输出:
IP Virtual Server version 1.2.1 (size=4096)
# 如果看到 version 1.2.1,说明安装成功
⚠️ 警告:如果编译报错"kernel source not found",你需要先安装内核开发包:
# CentOS/RHEL
yum install -y kernel-devel
# Ubuntu
apt-get install -y linux-headers-$(uname -r)
步骤4:配置LVS负载均衡器(Director)
现在来配置LVS Director,这是整个架构的核心。
# 开启IP转发(必须,否则数据包只能进不能出)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 清除现有规则
ipvsadm -C
# 添加VIP(虚拟IP)
ipvsadm -A -t 192.168.1.100:80 -s wrr
# 添加RealServer(真实服务器)
# -m 表示NAT模式,-g 表示DR模式(直接路由),-i 表示TUN模式(隧道)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -m -w 1
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -m -w 2
# 查看配置结果
ipvsadm -Ln
预期输出:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:80 wrr
-> 192.168.1.101:80 Masq 1 0 0
-> 192.168.1.102:80 Masq 2 0 0
可以看到 192.168.1.100 是VIP,192.168.1.101 和 192.168.1.102 是后端RealServer。
步骤5:安装配置Keepalived实现高可用
单Director会挂,高可用才是正经方案。
# 安装Keepalived
# CentOS/RHEL
yum install -y keepalived
# Ubuntu
apt-get install -y keepalived
# 备份默认配置
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 编辑Keepalived配置(MASTER节点)
cat > /etc/keepalived/keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
script_user root
}
vrrp_script chk_lvs {
script "/etc/keepalived/check_lvs.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass YOUR_AUTH_PASSWORD
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_lvs
}
}
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr
lb_kind NAT
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 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
EOF
预期输出:
# 配置写入成功,无报错
⚠️ 警告:将 YOUR_AUTH_PASSWORD 替换为强密码,且BACKUP节点的 priority 要低于100。
步骤6:创建健康检查脚本
cat > /etc/keepalived/check_lvs.sh << 'EOF'
#!/bin/bash
LVS_NUM=$(ipvsadm -L -n | wc -l)
if [ $LVS_NUM -le 3 ]; then
logger "LVS rule lost, restart keepalived"
systemctl stop keepalived
systemctl start keepalived
exit 1
fi
exit 0
EOF
chmod +x /etc/keepalived/check_lvs.sh
预期输出:
# 脚本创建完成,权限已设置
步骤7:启动服务并验证
# 启动Keepalived
systemctl enable keepalived
systemctl start keepalived
# 检查VIP是否绑定成功
ip addr show eth0 | grep 192.168.1.100
# 查看LVS连接状态
ipvsadm -Ln --stats
# 模拟访问测试
curl -H "Host: www.example.com" http://192.168.1.100/
curl -H "Host: www.example.com" http://192.168.1.100/
预期输出:
inet 192.168.1.100/24 scope global secondary eth0
# VIP绑定成功
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.1.100:80 5 30 20 3600 2400
-> 192.168.1.101:80 3 18 12 2160 1440
-> 192.168.1.102:80 2 12 8 1440 960
# 可以看到请求已经分发到两个RealServer
Response from RS01
Response from RS02
# 两次请求返回不同后端,证明负载均衡生效
步骤8:持久化连接与故障切换测试
# 查看持久化连接
ipvsadm -Ln --persistent-conn
# 模拟RealServer故障
# 在一台RealServer上停止nginx/apache
systemctl stop nginx
# 查看LVS自动剔除故障节点
ipvsadm -Ln
# 在MASTER上停止Keepalived测试VIP漂移
systemctl stop keepalived
# 在BACKUP上检查VIP是否接管
ip addr show eth0 | grep 192.168.1.100
预期输出:
# RealServer故障后
TCP 192.168.1.100:80 wrr persistent 50
-> 192.168.1.102:80 Masq 2 0 0
# 可以看到192.168.1.101已被自动移除
# VIP漂移后
inet 192.168.1.100/24 scope global secondary eth0
# BACKUP节点成功接管VIP
三、常见问题FAQ
Q1: LVS三种工作模式(NAT/DR/TUN)到底该选哪个?
这问题被问了八百遍了。NAT模式最简单,但Director容易成瓶颈,所有流量都过它;DR模式性能最强,只改MAC地址,但要求在同一网段;TUN模式能跨网段,但兼容性差。生产环境90%用DR模式,记住这个结论就行。
Q2: VIP绑定了但访问不通,什么情况?
先查三样东西:① RealServer的网关有没有指向LVS内网IP;② iptables/firewalld有没有放行VIP流量;③ 后端服务有没有监听在正确的IP上。很多人栽在第一条上,后端RealServer的网关必须指向LVS的DIP。
Q3: Keepalived VIP漂移正常,但LVS规则丢失了怎么办?
这是新手常踩的坑。Keepalived只管VIP漂移,不会帮你维护ipvsadm规则。你需要自己写脚本或者用Keepalived的notify机制,在VIP切换时执行 ipvsadm -C 清空再重新添加。建议把完整的LVS规则写成脚本,通过notify_master调用。
Q4: 连接数一高就丢包,性能上不去怎么调?
LVS本身是无状态的,瓶颈一般在这几个地方:① net.core.somaxconn 太小,调到65535;② ip_vs连接表太小,看 /proc/net/ip_vs_conn_max,可以调大;③ 网卡软中断瓶颈,试过irqbalance;④ 内核参数 net.ipv4.vs.conntrack 最好关掉,那玩意儿巨慢。
四、总结
LVS装起来不难,配起来才是真功夫。核心就几点:内核IPVS模块加载、ipvsadm规则编写、Keepalived高可用绑定。生产环境记住三个原则:DR模式优先、健康检查必须做、持久化时间按业务调。性能调优方向就那几个内核参数,somaxconn、conntrack、能关的都关掉。
延伸阅读:
- LVS官方文档:http://www.linuxvirtualserver.org/
- Keepalived配置详解:man keepalived.conf
- 内核参数调优参考:/proc/sys/net/ipv4/vs/
- LVS与Nginx组合方案:前端LVS做四层负载,后端Nginx做七层处理