在微服务架构与高并发场景下,高可用和负载均衡是保障系统稳定性的两大核心支柱。本文将深入剖析 Keepalived 与 LVS-DR 模式的协同工作机制,并通过完整的实战实验,带你从零构建一套具备故障自动切换能力的高性能集群架构。

一、核心机制深度解析:VRRP 与 LVS-DR 如何协同工作

要理解 Keepalived 的高可用能力,必须先从 VRRP(虚拟路由冗余协议) 说起。VRRP 的核心思想是将多台物理路由器虚拟成一台逻辑路由器,对外呈现唯一的虚拟 IP(VIP)。

其工作流程如下:

  • 角色选举:主备节点通过优先级(priority)竞争 MASTER 角色,优先级高者抢占 VIP;
  • 心跳检测:MASTER 节点周期性发送 VRRP 通告报文,BACKUP 节点持续监听;
  • 故障切换:若 BACKUP 在超时时间内未收到心跳,则判定 MASTER 故障,立即接管 VIP;
  • 故障恢复:MASTER 恢复后默认重新抢占 VIP(可配置为非抢占模式避免频繁切换)。

而 LVS-DR(直接路由)模式 则是高性能负载均衡的首选方案。其精妙之处在于:请求经过调度器分发,但响应数据包由后端真实服务器(RS)直接返回给客户端,绕过了调度器,从而极大提升了吞吐能力。具体流程为:客户端请求到达 VIP → LVS 修改目标 MAC 为某台 RS 的 MAC(IP 不变)→ RS 通过 lo 接口上的 VIP 处理请求 → RS 直接将响应返回客户端。

本次实验环境规划如下,共 4 台基于 OpenEuler24 的服务器:

组件中文名称核心作用通俗理解
Keepalived高可用热备工具基于 VRRP 实现 VIP 漂移、节点健康检查、主备自动切换集群的 “哨兵”,主节点挂了自动接管,主节点恢复后重新掌权
LVSLinux 虚拟服务器内核级四层负载均衡,支持 DR/NAT/TUN 三种模式流量的 “调度员”,把客户端请求分发给后端真实服务器
Director调度器运行 LVS+Keepalived,负责接收客户端请求并分发流量入口的 “老大”,主调度器(MASTER)负责服务,备调度器(BACKUP)待命
Real Server真实服务器运行业务服务(如 Nginx/Web),处理实际请求真正干活的 “打工人”,多台 RS 实现业务集群
VIP虚拟 IP漂移 IP,客户端统一访问的入口固定的 “访问地址”,在主备调度器间自动转移
角色主机名IP 地址核心服务
主调度器(MASTER)lb01192.168.10.101Keepalived+LVS+ipvsadm
备调度器(BACKUP)lb02192.168.10.102Keepalived+LVS+ipvsadm
真实服务器 1(RS1)web01192.168.10.103Nginx+Web 服务
真实服务器 2(RS2)web02192.168.10.104Nginx+Web 服务
虚拟 IP(VIP)-192.168.10.100客户端统一访问入口

二、基础环境初始化与 Keepalived 双机热备配置

在开始配置之前,所有节点都需要完成统一的初始化操作。测试环境下,为了简化配置流程,我们直接关闭防火墙与 SELinux:

# 关闭防火墙并禁用开机自启
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

接下来安装核心软件。主备调度器需要安装 Keepalived(高可用)和 ipvsadm(LVS 管理工具),而后端 RS 节点则安装 Nginx 提供 Web 服务:

# 主备调度器(lb01/lb02)执行
yum install -y keepalived ipvsadm
# 真实服务器(web01/web02)执行
yum install -y nginx

安装完成后,设置服务开机自启,确保系统重启后集群能自动恢复:

# 主备调度器
systemctl enable keepalived
# RS节点
systemctl enable nginx

现在进入主调度器(lb01)的配置环节。Keepalived 的主配置文件为 /etc/keepalived/keepalived.conf,建议先备份模板再进行修改:

cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
# 编辑配置文件
vi keepalived.conf

以下是主调度器的完整配置内容,重点关注 state MASTER、priority 150 以及 virtual_ipaddress 中的 VIP 定义:

! Configuration File for keepalived
# 全局配置段
global_defs {
    router_id LB01  # 服务器唯一标识,主备节点需不同
}
# VRRP热备实例配置
vrrp_instance VI_1 {
    state MASTER        # 角色为MASTER(主调度器)
    interface ens33     # 承载VIP的物理网卡(根据实际环境修改)
    virtual_router_id 1 # 虚拟路由ID,主备节点必须一致
    priority 100        # 优先级,数值越大越优先(主备需不同)
    advert_int 1        # 心跳间隔(秒),默认1秒
    # 认证配置,防止非法节点抢占
    authentication {
        auth_type PASS  # 密码认证
        auth_pass 123456# 认证密码,主备节点必须一致
    }
    # 虚拟IP(VIP)配置,可多个
    virtual_ipaddress {
        192.168.10.100/24
    }
}

备调度器(lb02)的配置与主节点基本一致,仅需修改三个关键参数:state 改为 BACKUP、priority 改为较低值(如 100)、router_id 改为唯一标识。同样先备份模板:

cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf
vi keepalived.conf

备节点的完整配置如下:

! Configuration File for keepalived
global_defs {
    router_id LB02  # 与主节点不同的标识
}
vrrp_instance VI_1 {
    state BACKUP      # 角色为BACKUP(备调度器)
    interface ens33   # 与主节点一致的物理网卡
    virtual_router_id 1 # 与主节点一致的虚拟路由ID
    priority 99       # 优先级低于主节点(100>99)
    advert_int 1      # 与主节点一致的心跳间隔
    authentication {
        auth_type PASS
        auth_pass 123456 # 与主节点一致的认证密码
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

配置完成后,在主备节点分别启动 Keepalived 服务:

systemctl start keepalived

✅ 验证环节:在主节点 lb01 上执行 ip a,若输出中包含 VIP 地址,说明绑定成功:

[root@lb01 ~]# ip addr show dev ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.101/24 brd 192.168.10.255 scope global ens33
    inet 192.168.10.100/32 scope global ens33  # VIP绑定成功
    valid_lft forever preferred_lft forever

而在备节点 lb02 上执行相同命令,应看不到 VIP,表明其正处于监听状态:

[root@lb02 ~]# ip addr show dev ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global ens33
    # 无VIP绑定,正常

故障切换测试:这是验证高可用能力的核心步骤。关闭 lb01 的 Keepalived 服务,观察 VIP 是否自动漂移到 lb02:

# 主节点lb01执行
systemctl stop keepalived
# 主节点验证:VIP消失
ip addr show dev ens33 | grep 192.168.10.100
# 备节点lb02验证:VIP绑定
ip addr show dev ens33 | grep 192.168.10.100

预期结果是 lb02 成功绑定 VIP 并接管服务。当 lb01 恢复后,默认抢占模式下 VIP 会自动切回。如果希望避免频繁切换,可以配置非抢占模式,在主备节点的 vrrp_instance 中添加 nopreempt 参数:

vrrp_instance VI_1 {
    state BACKUP  # 备节点保持BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    nopreempt        # 开启非抢占模式
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

非抢占模式下,主节点恢复后不会主动夺回 VIP,需要手动干预或等待备节点故障,适合对稳定性要求极高的生产环境。

[AFFILIATE_SLOT_1]

三、LVS-DR + Keepalived 高可用集群部署实战

在双机热备的基础上,我们进一步集成 LVS 实现负载均衡。首先配置后端真实服务器(web01/web02),需要将 VIP 绑定到 lo 接口并配置 ARP 抑制策略:

# 临时绑定(重启失效)
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100
# 验证
ifconfig lo:0 | grep 192.168.10.100

ARP 抑制是 DR 模式的关键步骤,通过修改内核参数确保 RS 不会响应非本地 ARP 请求,防止客户端绕过调度器直接访问 RS:

# 配置lo接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
# 配置所有接口ARP参数
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
# 永久生效(写入配置文件)
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

随后启动 Nginx 并配置测试页面,用于后续验证负载均衡效果:

# 启动Nginx
systemctl start nginx
# web01配置页面(标识RS1)
echo "Web01 - Real Server 1" >/usr/share/nginx/html/index.html
# web02配置页面(标识RS2)
echo "Web02 - Real Server 2" >/usr/share/nginx/html/index.html
# 验证RS本地访问
curl http://192.168.10.103  # web01
curl http://192.168.10.104  # web02

接下来配置调度器。首先加载 LVS 内核模块:

modprobe ip_vs
# 验证模块加载
lsmod | grep ip_vs

然后在主调度器(lb01)的 Keepalived 配置中添加 virtual_server 段,定义 LVS-DR 转发规则。注意 lb_kind 必须设置为 DR,persistence_timeout 可根据业务需求决定是否启用会话保持:

! Configuration File for keepalived
global_defs {
    router_id LB01
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}
# LVS虚拟服务器配置(DR模式)
virtual_server 192.168.10.100 80 {
    delay_loop 2          # 健康检查间隔(秒)
    lb_algo wrr           # 调度算法:加权轮询(WRR)
    lb_kind DR            # 转发模式:直接路由(DR)
    persistence_timeout 50 # 会话保持时间(秒)
    protocol TCP          # 协议:TCP
    # 真实服务器1配置
    real_server 192.168.10.103 80 {
        weight 1          # 权重
        TCP_CHECK {       # TCP健康检查
            connect_timeout 10 # 连接超时时间(秒)
            nb_get_retry 3   # 重试次数
            delay_before_retry 3 # 重试间隔(秒)
            connect_port 80  # 检测端口
        }
    }
    # 真实服务器2配置
    real_server 192.168.10.104 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

备调度器(lb02)的 LVS 配置与主节点完全一致,仅需调整 state、priority 和 router_id 三个参数:

! Configuration File for keepalived
global_defs {
    router_id LB02
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}
virtual_server

作为补充,以下是完整的系统初始化命令汇总,适用于所有机器:

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装依赖
yum install -y wget net-tools ipvsadm keepalived nginx

四、完整实验流程:从双机热备到 LVS 负载均衡

为了让大家更清晰地掌握整个部署流程,这里梳理一套标准化的实验步骤。首先是 Master 主节点(192.168.10.10)的配置:

vi /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_MASTER
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

接着配置 Backup 备节点(192.168.10.11):

vi /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_BACKUP
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}

启动服务后,在 Master 上执行 ip a 查看 VIP 是否绑定成功:

systemctl start keepalived
systemctl enable keepalived
ip addr

故障切换测试同样简单直接——停掉 Master 的 Keepalived,在 Backup 上观察 VIP 是否漂移过来:

systemctl stop keepalived
ip addr

接下来是 LVS-DR 集群的完整配置。两台 Real Server 都需要执行以下操作,包括绑定 VIP 到 lo 接口、抑制 ARP 响应、启动 Nginx 并设置差异化测试页面:

ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 up
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
vi /etc/sysctl.conf
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
sysctl -p
systemctl start nginx
echo "RS1 - 192.168.10.12" > /usr/share/nginx/html/index.html
echo "RS2 - 192.168.10.13" > /usr/share/nginx/html/index.html

Master 调度器的完整 LVS+Keepalived 配置如下:

vi /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_MASTER
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100/24
    }
}
virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    real_server 192.168.10.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.10.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
}

Backup 调度器仅需修改 state BACKUP 和 priority 100,其余 LVS 部分保持一致。重启 Keepalived 使配置生效:

systemctl restart keepalived

通过 ipvsadm -Ln 查看 LVS 规则,若能看到 VIP 和两台 RS 的记录,说明配置成功:

ipvsadm -Ln

五、测试验证与生产环境注意事项

访问 VIP 地址进行最终验证。在浏览器或终端中执行 curl 命令,不断刷新页面,应该会轮流出现两台 RS 的测试内容,表明负载均衡已生效:

http://192.168.10.100

关闭 Master 调度器后再次访问 VIP,网页仍可正常打开,证明高可用切换成功:

systemctl stop keepalived

关掉 Web1 的 Nginx 后访问 VIP,只会出现 Web2 的内容,说明健康检查机制正常工作:

systemctl stop nginx

⚠️ 生产环境注意事项:

  • 防火墙必须放行 VRRP 协议(协议号 112),否则心跳通信会中断;
  • 避免在虚拟机环境中随意漂移网卡,可能导致网络异常;
  • 建议使用 nopreempt 非抢占模式减少不必要的切换;
  • 健康检查间隔和超时时间要合理配置,避免误判导致频繁切换;
  • 监控脚本可扩展至 Nginx、MySQL、业务端口等更细粒度的服务检测。

补充几个关键知识点:LVS 支持三种模式——NAT 模式(请求和回包都走 LVS,性能一般)、TUN 模式(IP 隧道,支持跨网段)、DR 模式(直接路由,生产环境最常用,性能最高)。调度算法方面,rr 为轮询、wrr 为加权轮询、sh 为源地址哈希(支持会话保持)、dh 为目标地址哈希、lblc 为基于局部性的最少连接。

[AFFILIATE_SLOT_2]

总结

Keepalived 通过 VRRP 协议实现 VIP 的自动漂移与故障切换,LVS-DR 模式则提供了高性能的负载均衡能力。两者结合,构成了分布式系统架构中高可用与高并发的基石。掌握这套方案,不仅能够应对传统 IDC 场景,也为微服务架构下的流量入口高可用提供了坚实保障。建议在实际生产部署前,充分测试故障切换逻辑与健康检查策略,确保集群稳定运行。