基于 LVS-DR + Keepalived 的双机热备高可用负载均衡部署

分享一个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故障测试

关键注意事项

  1. 主备调度器的配置一致性 :除了state/priority/router_id,其他配置(比如 VIP、LVS 规则、健康检查)必须完全一致;
  2. VRRP 协议要求 :主备调度器必须在同一网段(你的 192.168.10.0/24),且virtual_router_id不能和其他设备冲突;
  3. IPVS 规则同步 :Keepalived 会自动生成 IPVS 规则,无需手动执行ipvsadm命令,手动配置的规则会被覆盖。
相关推荐
CodeCaptain1 天前
配置Nginx反向代理来实现负载均衡,续阿里云ECS配置Nginx反向代理
nginx·阿里云·负载均衡
Controller-Inversion2 天前
负载均衡与反向代理
运维·负载均衡
华纳云IDC服务商3 天前
DNS负载均衡能自动避开故障服务器吗?
运维·服务器·负载均衡
oMcLin3 天前
如何在 Debian 11 上实现基于 BGP 路由的动态负载均衡,提升跨地域数据中心的连接稳定性
debian·php·负载均衡
墨香幽梦客3 天前
系统高可用(HA)方案复盘:从主备切换到负载均衡的实现
运维·负载均衡
IT 乔峰3 天前
分享一个负载均衡的NDB高可用集群架构+部署详细说明
数据库·架构·负载均衡
坐不住的爱码4 天前
Nacos负载均衡
负载均衡·cloud
是大芒果4 天前
线程池和高并发
负载均衡·高可用
柠檬叶子C4 天前
【云计算】利用 LVS 构建集群实现负载均衡 | 集群的概念 | 单服务器性能瓶颈验证例子 | LVS 基础 | LVS 构建负载均衡集群实操步骤
服务器·负载均衡·lvs