在关键业务系统中,负载均衡层的高可用性直接决定服务连续性。本文将通过实践演示,在 Debian 12 上为 HAProxy 负载均衡器部署 Keepalived 高可用方案。利用虚拟路由器冗余协议(VRRP)实现故障秒级切换,结合虚拟 IP(浮动 IP)机制,构建无单点故障的负载均衡架构,确保业务流量永不中断。
Keepalived 通过 Linux 虚拟服务器(LVS)内核模块在主备路由器上实现负载均衡和故障转移功能,而 HAProxy 则为 TCP 和 HTTP 应用程序提供负载均衡和高可用性服务。
Keepalived 通过虚拟路由器冗余协议(VRRP)在主(活动)和备用(被动)LVS 路由器(在本例中为 HAProxy 服务器,因为它们负责负载均衡 Web 应用程序)之间发送定期消息,以确定彼此的状态。如果主服务器在预定义的时间内未能发送消息,Keepalived 将触发故障转移,备用服务器将成为主服务器。
所有虚拟服务器均被分配一个虚拟 IP(也称为浮动 IP)。这是一个可公开路由的 IP 地址。它会动态分配给当前处于活动状态的服务器。
此配置要求已部署并运行 HAProxy 服务器。在之前的文章中已详细介绍了在各种系统上安装和配置 HAProxy 负载均衡器的步骤;请查看在 Debian 12 上安装和简单配置 HAProxy
在本文中,将使用两台配备Keepalived的高可用性HAProxy服务器。以下是我们的部署架构。

在我的演示环境中,已在 Debian12 上运行 HAProxy 负载均衡器。因此,假设您的系统包缓存已更新,请运行以下命令在两个节点上都安装 Keepalived。
apt install keepalived
要使 Keepalived 服务能够将网络数据包转发到后端服务器,需要启用IP转发。在两台服务器上运行以下命令:
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf # 也可以打开此文件,取消对应行等注释。
同样,需要启用 HAProxy 和 Keepalived 以绑定到非本地 IP 地址,即绑定到故障转移 IP 地址(浮动 IP)。
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf # 也可以打开此文件,添加对应行到末尾。
重新加载 sysctl 设置:
sysctl -p
Keepalived 的默认配置文件应为 /etc/keepalived/keepalived.conf。然而,该配置文件默认情况下并未创建。
请按照以下内容创建配置文件(部分配置需要根据个人实际环境进行修改,比如网卡名称):
vi /etc/keepalived/keepalived.conf
Master 节点 Keepalived 配置:
# Global Settings for notifications
global_defs {
script_user root
enable_script_security
}
# Define the script used to check if haproxy is still working
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 2
}
# Configuration for Virtual Interface
vrrp_instance LB_VIP {
interface ens33
state MASTER # set to BACKUP on the peer machine
priority 101 # set to 99 on the peer machine
virtual_router_id 51
#smtp_alert # Enable Notifications Via Email
authentication {
auth_type AH
auth_pass myP@ssword # Password for accessing vrrpd. Same on all devices
}
unicast_src_ip 192.168.2.218 # Private IP address of master
unicast_peer {
192.168.2.248 # Private IP address of the backup haproxy
}
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
192.168.2.250
}
# Use the Defined Script to Check whether to initiate a fail over
track_script {
chk_haproxy
}
}
Backup 节点 Keepalived 配置:
# Global Settings for notifications
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance LB_VIP {
interface ens33
state BACKUP
priority 100
virtual_router_id 51
# smtp_alert
authentication {
auth_type AH
auth_pass myP@ssword
}
unicast_src_ip 192.168.2.248 # Private IP address of the backup haproxy
unicast_peer {
192.168.2.218 # Private IP address of the master haproxy
}
virtual_ipaddress {
192.168.2.250
}
track_script {
chk_haproxy
}
}
现在可以启动 Keepalived 并加入开机启动,使其在所有节点的系统启动时运行;
systemctl enable --now keepalived
查看 keepalived 启动状态:


在 Master 节点上检查IP地址分配:
ip --brief a
可以看到,ens33 网卡上面多了一个IP,这个便是虚拟(浮动)IP。
查看 Backup 节点 IP 地址分配:

现在,我们把 Master 节点上接口 ens33 关闭,请确保在关闭接口之前已通过控制台登录。
ip link set ens33 down
查看 Backup 节点状态:
systemctl status keepalived
虚拟 IP 已成功切换到 Backup 节点。
再次开启 Master 节点 ens33 网卡,虚拟 IP 在数秒钟内恢复到 Master 节点上。

我们对 HAProxy 配置文件所做改动是将前端绑定IP和统计IP地址调整为VIP或浮动IP,在本实践中为 192.168.2.250。后端服务器修改为两台运行了 FastAPI 的 web 服务器。
vi /etc/haproxy/haproxy.cfg
重启 HAProxy 和 Keepalived 服务:
systemctl restart haproxy
systemctl restart keepalived
访问虚拟IPhttp://192.168.2.250:8080测试:

访问虚拟IP 的信息统计:

至此,您已成功在 Debian 12 上部署了 HAProxy + Keepalived 的高可用负载均衡架构。通过虚拟 IP 漂移和健康检查机制,系统可在主节点故障时 1000ms 内自动切换至备用节点,实现服务无缝接管。
典型适用场景:
架构边界注意:
进阶调优建议:
weight 参数实现差异化流量分配