OpenEuler 24.03 LVS+Keepalived 超详细实战教程
本文档基于OpenEuler 24.03 LTS编写,完整覆盖 LVS 三种核心模式(NAT/DR/TUN)+ Keepalived 高可用集群部署,所有命令和配置均经过实测,可直接用于生产环境。
一、基础概念与架构规划
1.1 核心组件说明
- LVS (Linux Virtual Server):Linux 内核级负载均衡器,工作在 OSI 第 4 层(传输层),性能远超 Nginx 等 7 层负载
- Keepalived:实现 LVS 节点高可用(主备切换)+ 后端 RS 健康检查,基于 VRRP 协议
- 三种工作模式对比
表格
| 模式 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| NAT | 进出流量都经过 LVS,LVS 做地址转换 | 配置简单,支持跨网段 RS | 性能瓶颈(LVS 成为单点) | 小规模集群,RS 数量 < 10 |
| DR (直接路由) | 入流量经 LVS,出流量直接回客户端 | 性能极高(LVS 只处理入流量) | LVS 和 RS 必须在同一网段 | 生产环境首选,大规模集群 |
| TUN (隧道) | 封装 IP 隧道转发,出流量直接回客户端 | 支持跨网段 RS,性能好 | 配置复杂,需内核支持隧道 | 跨机房部署 |
1.2 实验环境规划(DR 模式为主)
表格
| 主机名 | IP 地址 | 角色 | 操作系统 |
|---|---|---|---|
| lvs-master | 192.168.122.10 | LVS 主节点 + Keepalived 主 | OpenEuler 24.03 |
| lvs-backup | 192.168.122.11 | LVS 备节点 + Keepalived 备 | OpenEuler 24.03 |
| rs1 | 192.168.122.20 | 后端真实服务器 1 | OpenEuler 24.03 |
| rs2 | 192.168.122.21 | 后端真实服务器 2 | OpenEuler 24.03 |
| VIP | 192.168.122.100 | 虚拟 IP(对外提供服务) | - |
二、所有节点基础配置(必做)
2.1 关闭防火墙和 SELinux
bash
# 关闭并禁用firewalld
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.2 配置主机名和 hosts 解析
bash
# 对应节点修改主机名
hostnamectl set-hostname lvs-master
# hostnamectl set-hostname lvs-backup
# hostnamectl set-hostname rs1
# hostnamectl set-hostname rs2
# 所有节点配置hosts
cat >> /etc/hosts << EOF
192.168.122.10 lvs-master
192.168.122.11 lvs-backup
192.168.122.20 rs1
192.168.122.21 rs2
EOF
2.3 配置时间同步
bash
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources
2.4 开启内核转发(LVS 节点)
bash
# 仅在lvs-master和lvs-backup执行
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens3.send_redirects=0 # 替换为你的网卡名
EOF
# 生效配置
sysctl -p
三、LVS-DR 模式部署(生产首选)
3.1 LVS 节点安装 ipvsadm
bash
# lvs-master和lvs-backup都执行
dnf install -y ipvsadm
systemctl enable ipvsadm
3.2 后端 RS 节点配置(关键)
rs1 和 rs2 都执行以下操作:
bash
# 1. 在lo接口绑定VIP
cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF
DEVICE=lo:0
IPADDR=192.168.122.100
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback:0
EOF
# 2. 启动lo:0接口
ifup lo:0
ip addr show lo
# 3. 配置ARP抑制(核心!防止RS响应ARP请求)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
EOF
# 4. 生效配置
sysctl -p
# 5. 安装并启动httpd作为测试服务
dnf install -y httpd
echo "<h1>RS1: 192.168.122.20</h1>" > /var/www/html/index.html
systemctl enable --now httpd
rs2 节点注意 :将 index.html 内容改为<h1>RS2: 192.168.122.21</h1>
3.3 LVS 主节点手动配置测试
bash
# 1. 在ens3接口绑定VIP
ip addr add 192.168.122.100/24 dev ens3
ip addr show ens3
# 2. 添加虚拟服务
ipvsadm -A -t 192.168.122.100:80 -s rr
# 3. 添加后端真实服务器(DR模式)
ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.20:80 -g
ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.21:80 -g
# 4. 查看配置
ipvsadm -Ln
# 5. 测试负载均衡
# 在客户端执行多次:curl 192.168.122.100
# 应该交替看到RS1和RS2的页面
# 6. 清空测试配置(重要!后面用Keepalived管理)
ipvsadm -C
ip addr del 192.168.122.100/24 dev ens3
四、Keepalived 高可用配置
4.1 安装 Keepalived(LVS 节点)
bash
# lvs-master和lvs-backup都执行
dnf install -y keepalived
4.2 主节点配置(lvs-master)
bash
# 备份原配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 编辑新配置
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER # 主节点标识
script_user root
enable_script_security
}
# 定义健康检查脚本(可选,检查LVS服务是否正常)
vrrp_script chk_lvs {
script "/bin/bash -c 'ipvsadm -Ln | grep -q 192.168.122.100:80'"
interval 2 # 每2秒检查一次
weight -20 # 检查失败,优先级减20
fall 3 # 连续3次失败认为服务异常
rise 2 # 连续2次成功认为服务恢复
}
vrrp_instance VI_1 {
state MASTER # 主节点为MASTER,备节点为BACKUP
interface ens3 # 绑定VIP的网卡
virtual_router_id 51 # 虚拟路由ID,主备必须相同
priority 100 # 优先级,主节点高于备节点
advert_int 1 # 心跳间隔1秒
authentication {
auth_type PASS
auth_pass 1111 # 认证密码,主备必须相同
}
virtual_ipaddress {
192.168.122.100/24 dev ens3 label ens3:0 # VIP
}
track_script {
chk_lvs # 调用健康检查脚本
}
}
# 虚拟服务器配置
virtual_server 192.168.122.100 80 {
delay_loop 6 # 健康检查间隔6秒
lb_algo rr # 调度算法:轮询
lb_kind DR # 工作模式:DR
nat_mask 255.255.255.0
persistence_timeout 0 # 会话保持时间,0表示关闭
protocol TCP
# 后端真实服务器1
real_server 192.168.122.20 80 {
weight 1 # 权重
TCP_CHECK {
connect_timeout 3 # 连接超时3秒
nb_get_retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
connect_port 80 # 检查端口
}
}
# 后端真实服务器2
real_server 192.168.122.21 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
EOF
4.3 备节点配置(lvs-backup)
bash
# 备份原配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 编辑新配置(与主节点只有3处不同)
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
router_id LVS_BACKUP # 1. 备节点标识
script_user root
enable_script_security
}
vrrp_script chk_lvs {
script "/bin/bash -c 'ipvsadm -Ln | grep -q 192.168.122.100:80'"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 2. 备节点为BACKUP
interface ens3
virtual_router_id 51
priority 90 # 3. 优先级低于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.122.100/24 dev ens3 label ens3:0
}
track_script {
chk_lvs
}
}
virtual_server 192.168.122.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.122.20 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.122.21 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
EOF
4.4 启动服务并设置开机自启
bash
# 先启动主节点,再启动备节点
systemctl enable --now keepalived
# 查看服务状态
systemctl status keepalived
# 查看VIP是否绑定成功
ip addr show ens3
# 查看LVS规则
ipvsadm -Ln
五、功能测试与验证
5.1 负载均衡测试
bash
# 在客户端执行多次curl命令
for i in {1..10}; do curl 192.168.122.100; echo ""; done
# 预期结果:交替显示RS1和RS2的页面
5.2 后端 RS 故障测试
bash
# 1. 停止rs1的httpd服务
systemctl stop httpd
# 2. 再次执行负载测试
for i in {1..10}; do curl 192.168.122.100; echo ""; done
# 预期结果:所有请求都转发到RS2
# 查看LVS规则,rs1已被自动移除
ipvsadm -Ln
# 3. 恢复rs1的httpd服务
systemctl start httpd
# 预期结果:rs1会被自动重新加入集群
5.3 LVS 主节点故障测试
bash
# 1. 查看当前VIP所在节点(应该在lvs-master)
# 在lvs-master执行:ip addr show ens3 | grep 192.168.122.100
# 2. 停止lvs-master的keepalived服务
systemctl stop keepalived
# 3. 在lvs-backup查看VIP是否漂移过来
ip addr show ens3 | grep 192.168.122.100
# 4. 再次执行负载测试,服务应该正常
for i in {1..10}; do curl 192.168.122.100; echo ""; done
# 5. 恢复lvs-master的keepalived服务,VIP会自动切回主节点
systemctl start keepalived
六、LVS-NAT 模式快速配置(可选)
如果需要使用 NAT 模式,只需修改以下部分:
6.1 LVS 节点配置
bash
# 1. 开启内核转发(已在基础配置中完成)
# 2. Keepalived配置修改
lb_kind NAT # 将DR改为NAT
# 3. 配置SNAT(如果LVS作为网关)
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
6.2 后端 RS 节点配置
bash
# 1. 将默认网关指向LVS的VIP
route add default gw 192.168.122.100
# 2. 不需要配置lo:0和ARP抑制
七、常见问题与故障排查
7.1 无法访问 VIP
- 检查防火墙和 SELinux 是否完全关闭
- 检查 RS 节点的 ARP 抑制配置是否正确
- 检查 LVS 和 RS 是否在同一网段(DR 模式)
- 使用
tcpdump抓包分析:tcpdump -i ens3 host 192.168.122.100
7.2 VIP 无法漂移
- 检查主备节点的
virtual_router_id和auth_pass是否一致 - 检查主备节点的优先级是否正确
- 查看 Keepalived 日志:
journalctl -u keepalived -f
7.3 负载均衡不生效
- 检查 LVS 规则是否正确:
ipvsadm -Ln - 检查 RS 节点的 httpd 服务是否正常
- 检查 RS 节点是否绑定了 VIP:
ip addr show lo
7.4 会话保持问题
- 如果需要会话保持,修改
persistence_timeout参数(单位:秒) - 例如:
persistence_timeout 300表示 5 分钟内同一客户端的请求转发到同一 RS
八、生产环境优化建议
-
调度算法选择:根据业务特点选择合适的算法(rr/wrr/lc/wlc)
-
健康检查优化:根据业务调整检查间隔和超时时间
-
性能优化 :
bash
# 优化内核参数 cat >> /etc/sysctl.conf << EOF net.core.netdev_max_backlog=5000 net.core.rmem_max=16777216 net.core.wmem_max=16777216 net.ipv4.tcp_rmem=4096 87380 16777216 net.ipv4.tcp_wmem=4096 65536 16777216 EOF sysctl -p -
监控告警:使用 Prometheus+Grafana 监控 LVS 连接数、RS 状态、VIP 漂移等
-
安全加固 :
- 限制 VRRP 协议只在内部网络传播
- 使用复杂的认证密码
- 定期更新系统和软件包
