在高流量业务场景中,单台服务器宕机会导致整个服务不可用。Keepalived配合HAProxy构建的双机热备集群是实现服务器高可用的经典方案,通过VRRP协议实现VIP故障切换,配合HAProxy的七层负载均衡,可将服务可用性提升至99.99%。本文记录一套从零搭建到验证完整的双机热备部署流程。
双机热备架构设计与环境准备
架构拓扑:两台物理服务器(Master/Backup)各运行HAProxy实例,Keepalived通过VRRP协议维护一个浮动VIP。正常情况下Master持有VIP并处理所有流量,Master故障时Backup在秒级接管VIP。
# 环境信息
# Master节点: 192.168.10.11 (hostname: lb-master)
# Backup节点: 192.168.10.12 (hostname: lb-backup)
# VIP: 192.168.10.100
# 后端Web服务器: 192.168.10.21, 192.168.10.22
# 系统环境
cat /etc/os-release # Rocky Linux 9.3
uname -r # 5.14.0-362.el9.x86_64
# 安装依赖
dnf install -y keepalived haproxy
systemctl enable keepalived haproxy
Keepalived VRRP配置主备切换
Keepalived的核心是VRRP(虚拟路由冗余协议)。Master节点优先级高于Backup,定期发送VRRP通告包。Backup在3个通告周期内未收到Master通告,则认为Master故障并提升自身为Master。
Master节点配置文件/etc/keepalived/keepalived.conf:
global_defs {
router_id LB_MASTER
enable_script_security
script_user root
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MySecret2026
}
virtual_ipaddress {
192.168.10.100/24 dev eth0
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
Backup节点配置几乎相同,仅state和priority不同:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90 # 低于Master的100
advert_int 1
# ... 其余配置与Master一致
}
健康检查脚本/etc/keepalived/check_haproxy.sh:
#!/bin/bash
# 检查HAProxy进程是否存活
if ! killall -0 haproxy 2>/dev/null; then
systemctl restart haproxy
sleep 2
if ! killall -0 haproxy 2>/dev/null; then
echo "HAProxy is down" >&2
exit 1
fi
fi
# 检查HAProxy管理端口是否响应
if ! curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8404/stats | grep -q '200\|503'; then
exit 1
fi
exit 0
chmod +x /etc/keepalived/check_haproxy.sh
chmod +x /etc/keepalived/notify.sh
HAProxy七层负载均衡配置
HAProxy作为前置代理,将VIP流量分发到后端Web服务器。关键配置包括后端健康检查、会话保持、连接复用等。
配置文件/etc/haproxy/haproxy.cfg:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 20000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats mode 660 level admin
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
timeout connect 5s
timeout client 30s
timeout server 30s
timeout http-keep-alive 10s
# 管理统计页面
frontend stats
bind *:8404
mode http
stats enable
stats uri /stats
stats admin if TRUE
stats auth admin:HaProxy2026
# HTTP前端
frontend web_http
bind *:80
mode http
option httplog
# ACL规则
acl is_api path_beg /api
acl is_static path_end .css .js .png .jpg .gif .ico .woff2
# 路由
use_backend api_servers if is_api
use_backend static_servers if is_static
default_backend web_servers
# 后端Web服务器组
backend web_servers
mode http
balance roundrobin
option httpchk GET /healthcheck
# 会话保持:基于Cookie
cookie SERVERID insert indirect nocache
server web1 192.168.10.21:80 check cookie web1 inter 2s rise 2 fall 3
server web2 192.168.10.22:80 check cookie web2 inter 2s rise 2 fall 3
# API服务器组
backend api_servers
mode http
balance leastconn
option httpchk GET /api/health
# 连接复用
option http-keep-alive
http-reuse safe
server api1 192.168.10.21:8080 check inter 2s rise 2 fall 3
server api2 192.168.10.22:8080 check inter 2s rise 2 fall 3
# 静态资源服务器组
backend static_servers
mode http
balance roundrobin
option httpchk GET /favicon.ico
# 静态资源缓存
http-response set-header Cache-Control "public, max-age=86400"
server static1 192.168.10.21:80 check inter 5s rise 2 fall 3
server static2 192.168.10.22:80 check inter 5s rise 2 fall 3
VRRP抢占模式与非抢占模式选择
默认配置下,原Master恢复后会重新抢占VIP。某些场景下这种行为不理想——例如Master频繁抖动会导致VIP反复切换。可通过nopreempt实现非抢占模式:
# 非抢占模式配置(Backup节点需设为MASTER初始状态)
vrrp_instance VI_1 {
state BACKUP # 两台都设为BACKUP
interface eth0
virtual_router_id 51
priority 100 # 仍然是100,但因为nopreempt不会抢占
advert_int 1
nopreempt # 关键:禁止抢占
# ... 其余配置不变
}
非抢占模式下,原Master恢复后不会自动接管VIP,需手动执行systemctl restart keepalived触发切换。生产环境建议采用非抢占模式配合手动切换,避免抖动场景下的来回切换。
故障切换验证与监控告警
配置完成后需进行完整的故障切换验证。通知脚本/etc/keepalived/notify.sh:
#!/bin/bash
# 故障切换通知脚本
STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.10.100"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
case "$STATE" in
master)
MSG="${DATE} | ${HOSTNAME} 成为MASTER,接管VIP ${VIP}"
;;
backup)
MSG="${DATE} | ${HOSTNAME} 降级为BACKUP,释放VIP ${VIP}"
;;
fault)
MSG="${DATE} | ${HOSTNAME} 进入FAULT状态"
;;
esac
# 记录日志
logger -t keepalived "$MSG"
# 发送告警(示例:企业微信机器人)
WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
curl -s -X POST "$WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"**高可用告警**\n${MSG}\"}}"
exit 0
验证步骤:
# 1. 启动服务(两台都执行)
systemctl start keepalived haproxy
# 2. 确认Master持有VIP
ip addr show eth0 | grep 192.168.10.100
# 应在Master节点看到VIP
# 3. 模拟故障:停止Master的Keepalived
ssh lb-master "systemctl stop keepalived"
# 4. 在Backup节点确认VIP切换
ip addr show eth0 | grep 192.168.10.100
# 应在Backup节点看到VIP,延迟通常1-3秒
# 5. 持续压测验证无中断
ab -n 100000 -c 100 http://192.168.10.100/
# 检查失败请求数是否为0或极低
# 6. 恢复Master
ssh lb-master "systemctl start keepalived"
# 抢占模式下VIP会切回Master
监控层面建议对以下指标设置告警:vrrp_script检查失败次数、VIP切换事件、后端服务器健康检查失败率、HAProxy当前连接数超过阈值。可使用Prometheus + haproxy_exporter采集指标,配合Alertmanager实现多渠道告警通知。
性能调优与内核参数优化
高流量场景下需调优系统内核参数和HAProxy配置以避免连接耗尽:
# /etc/sysctl.conf 网络参数优化
# 增加文件描述符上限
fs.file-max = 2097152
# TCP连接复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 增加SYN队列
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
# 增加连接跟踪表
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
# 应用配置
sysctl -p
# /etc/security/limits.conf
haproxy soft nofile 200000
haproxy hard nofile 200000
root soft nofile 200000
root hard nofile 200000
HAProxy层面,maxconn在global和frontend中需匹配设置,避免单前端连接数超过服务端处理能力。对于SSL终结场景(HTTPS),建议使用nbthread参数启用多线程并将CPU亲和性绑定到特定核心:
global
nbthread 4 # 与CPU核心数匹配
cpu-map auto:1/1-4 # 自动绑定线程到CPU核心
maxconn 20000
# SSL终结配置
frontend web_https
bind *:443 ssl crt /etc/haproxy/certs/domain.pem alpn h2,http/1.1
mode http
# HTTP/2多路复用
http-response set-header Strict-Transport-Security "max-age=31536000"
default_backend web_servers
这套Keepalived + HAProxy双机热备方案已在实际生产环境中承载单日数亿请求量。核心运维要点:定期演练故障切换流程,确保团队熟悉切换流程和恢复操作;监控VRRP心跳包传输延迟异常,提前发现网络抖动风险;保持两节点配置严格一致,使用配置管理工具(Ansible/Puppet)统一分发配置变更。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-keepalivedhaproxy/