分享一个VIP 漂移 + IPVS 调度:基于 Keepalived 的 LVS-DR 高可用负载均衡架构
客户端 → VIP(192.168.10.100) → 主调度器(71) / 备调度器(70) → Real Server(72/73)
环境准备:
- Director Server1(主LVS 调度器):192.168.10.71(核心,配置 VIP+IPVS 规则)
- Director Server2(备LVS 调度器):192.168.10.70(不配置规则,同步主节点规则)
- Real Server 1:192.168.10.72(部署 HTTPD,提供自定义页面)
- Real Server 2:192.168.10.73(部署 HTTPD,提供自定义页面)
- VIP:192.168.10.100(客户端访问的统一入口)
- 模式:LVS-DR(性能最优,适合 HTTP 服务)
LVS+Keepalived 的核心原理
1. 核心组件分工
|------------|--------------------------------------------------------------------|
| 组件 | 作用 |
| LVS | 核心流量调度(DR 模式),负责把 VIP 的请求分发到 72/73; |
| Keepalived | 基于 VRRP 协议实现:① 主备调度器的 VIP 漂移;② 健康检查(LVS/Real Server);③ 自动同步 LVS 规则 |
部署
完整部署步骤(分角色执行)
一、所有节点基础准备(71/70/72/73)
# 安装keepalived、lvs组件及依赖
yum install -y keepalived ipvsadm httpd net-tools sysstat
# 关闭防火墙/SELinux(生产可精细化配置,测试先关闭)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
二、Director Server(71)配置(核心)
2.1 绑定 VIP 到网卡(ens33:0)
# 临时绑定(重启失效)
ifconfig ens33:0 192.168.10.100 netmask 255.255.255.0 up
# 永久绑定(写入网卡配置文件)
cat > /etc/sysconfig/network-scripts/ifcfg-ens33:0 << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.100
NETMASK=255.255.255.0
EOF
# 重启网卡别名生效
ifdown ens33:0 && ifup ens33:0
#如果报IPV6的报错先禁用IPv6
sysctl -w net.ipv6.conf.ens33.disable_ipv6=1
2.2 配置 DR 模式内核参数(关闭 ICMP 重定向)
# 临时生效
echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.ens33.send_redirects = 0" >> /etc/sysctl.conf
#永久生效
cat > /etc/sysctl.conf << EOF
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
EOF
# 加载参数
sysctl -p
2.3 配置 IPVS 规则(DR 模式)
# 清空旧规则(如有)
ipvsadm -C
# 创建虚拟服务(VIP:80,轮询调度)
ipvsadm -A -t 192.168.10.100:80 -s rr
# 添加后端Real Server(-g表示DR模式,-w 1权重)
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.72 -g -w 1
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.73 -g -w 1
# 保存规则(防止重启丢失)
ipvsadm-save > /etc/sysconfig/ipvsadm
# 设置ipvsadm开机自启
systemctl enable --now ipvsadm
2.4 验证配置
# 查看VIP是否绑定
ifconfig ens33:0
# 查看IPVS规则
ipvsadm -ln
# 预期输出:TCP 192.168.10.100:80 rr 下有72和73的条目,Forward为Route(DR模式)
三、Real Server(72/73)配置(两台操作一致,仅页面内容区分)
3.1 部署 HTTPD 并创建自定义页面(区分两台服务器)
# 启动HTTPD并设置开机自启
systemctl enable --now httpd
# Real Server 72创建自定义页面
echo "<h1>Real Server 72 - 192.168.10.72</h1>" > /var/www/html/index.html
# Real Server 73创建自定义页面
echo "<h1>Real Server 73 - 192.168.10.73</h1>" > /var/www/html/index.html
3.2 绑定 VIP 到回环网卡(lo:0)(DR 模式核心)
# 临时绑定(重启失效)
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up
# 永久绑定(写入开机自启)
echo "ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up" >> /etc/rc.local
chmod +x /etc/rc.local
3.3 配置 ARP 抑制(防止 VIP 冲突)
# 临时生效
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
# 永久生效(写入sysctl.conf)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
# 加载参数
sysctl -p
3.4 验证配置
# 查看回环网卡VIP
ifconfig lo:0
# 测试本地HTTP服务
curl 127.0.0.1
# 72应输出:<h1>Real Server 72 - 192.168.10.72</h1>
# 73应输出:<h1>Real Server 73 - 192.168.10.73</h1>
四、主调度器(71)配置 Keepalived(核心)
编辑/etc/keepalived/keepalived.conf,内容如下(适配 DR 模式):
cat > /etc/keepalived/keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
enable_script_security
}
vrrp_script check_72 {
script "/usr/bin/curl -f http://192.168.10.72 > /dev/null 2>&1"
interval 2
weight -10
user root
}
vrrp_script check_73 {
script "/usr/bin/curl -f http://192.168.10.73 > /dev/null 2>&1"
interval 2
weight -10
user root
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/24 dev ens33 label ens33:0
}
track_script {
check_72
check_73
}
}
# 核心:virtual_server移到外部
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#同一个客户端 IP,在 50 秒内,所有请求都强制转发到同一个 Real Server
#persistence_timeout 50
protocol TCP
ipvs_syncdaemon_inteface ens33
real_server 192.168.10.72 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.73 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
EOF
五、备调度器(70)配置 Keepalived
复制 71 的配置文件,仅修改 3 处:
cat > /etc/keepalived/keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_BACKUP
# 关闭SNMP(避免干扰),强制开启IPVS规则生成
enable_script_security
}
# 定义健康检查脚本(检测Real Server的HTTPD是否正常)
vrrp_script check_72 {
script "/usr/bin/curl -f http://192.168.10.72 > /dev/null 2>&1"
interval 2
weight -10
user root
}
vrrp_script check_73 {
script "/usr/bin/curl -f http://192.168.10.73 > /dev/null 2>&1"
interval 2
weight -10
user root
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
# 备节点不抢占(避免主节点恢复后频繁切换)
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 指定网卡别名
192.168.10.100/24 dev ens33 label ens33:0
}
track_script {
check_72
check_73
}
# 关键修正:将virtual_server配置移到vrrp_instance外(全局生效)
}
# LVS-DR模式的核心配置(自动生成IPVS规则)------ 移到vrrp_instance外!
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#同一个客户端 IP,在 50 秒内,所有请求都强制转发到同一个 Real Server
#persistence_timeout 50
protocol TCP
# 新增:VIP绑定的网卡(和virtual_ipaddress对应)
ipvs_syncdaemon_inteface ens33
real_server 192.168.10.72 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.73 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
EOF
六、启动并验证(71/70)
# 启动keepalived并设置开机自启
systemctl enable --now keepalived
# 验证VIP是否绑定(主节点71会有VIP,备节点70无)
ip addr show ens33 | grep 192.168.10.100
#检查备节点策略是否同步
ipvsadm -ln
# 模拟主节点故障(停掉71的keepalived)
systemctl stop keepalived
# 此时在70上查看,VIP会自动漂移过来
ip addr show ens33 | grep 192.168.10.100
# 恢复主节点(71重启keepalived),VIP会切回71
systemctl start keepalived


注意事项:
这里一定要检查备节点策略是否同步成功,否则主节点71故障后备节点无法进行轮询转发
ipvsadm -ln

七:主节点71故障测试


关键注意事项
- 主备调度器的配置一致性 :除了
state/priority/router_id,其他配置(比如 VIP、LVS 规则、健康检查)必须完全一致; - VRRP 协议要求 :主备调度器必须在同一网段(你的 192.168.10.0/24),且
virtual_router_id不能和其他设备冲突; - IPVS 规则同步 :Keepalived 会自动生成 IPVS 规则,无需手动执行
ipvsadm命令,手动配置的规则会被覆盖。