Linux服务器高可用集群搭建:Keepalived+HAProxy双活架构配置与故障切换实战

为什么需要Keepalived+HAProxy双活架构

单台负载均衡器是整个架构中最危险的单一故障点。一旦HAProxy进程崩溃或所在服务器宕机,后端所有业务将无法访问。Keepalived通过VRRP协议在多台节点间实现虚拟IP漂移,配合HAProxy的健康检查与负载分发能力,构建出自动故障切换的双活架构。这套方案部署成本低、切换速度快(通常1-3秒),是中小规模生产环境的首选高可用方案。

环境规划与网络拓扑

以两台HAProxy节点 + 三台后端Web服务器的架构为例:

# 节点规划
# HAProxy-Master:  192.168.1.10
# HAProxy-Backup:  192.168.1.11
# VIP:             192.168.1.100
# Web-01:          192.168.1.20
# Web-02:          192.168.1.21
# Web-03:          192.168.1.22

两台HAProxy服务器均配置Keepalived,Master节点持有VIP对外提供服务,Backup节点持续监听VRRP通告。Master故障时Backup在秒级接管VIP,客户端连接几乎无感知。

HAProxy配置详解

两台HAProxy节点的配置完全一致,关键配置项如下:

# /etc/haproxy/haproxy.cfg
global
    log /dev/log local0
    maxconn 4096
    daemon
    stats socket /var/run/haproxy.sock mode 660

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5s
    timeout client  30s
    timeout server  30s
    retries 3

frontend http_in
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/server.pem
    http-request redirect scheme https unless { ssl_fc }
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health HTTP/1.1
Host:\ localhost
    http-check expect status 200
    server web01 192.168.1.20:80 check inter 3s fall 3 rise 2 maxconn 256
    server web02 192.168.1.21:80 check inter 3s fall 3 rise 2 maxconn 256
    server web03 192.168.1.22:80 check inter 3s fall 3 rise 2 maxconn 256

几个需要注意的参数:

  • inter 3s:健康检查间隔3秒,生产环境建议2-5秒,太短增加后端压力,太长故障发现延迟
  • fall 3:连续3次检查失败才标记后端节点down,避免偶发网络抖动误判
  • rise 2:连续2次检查成功才恢复节点,防止节点不稳定时反复上下线
  • maxconn 256:单后端最大并发连接数,需根据后端服务器承载能力设置

Keepalived Master节点配置

# /etc/keepalived/keepalived.conf (Master)
global_defs {
    router_id HAProxy_MASTER
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight -20
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass MySecurePass2026
    }

    virtual_ipaddress {
        192.168.1.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"
}

Keepalived Backup节点配置

# /etc/keepalived/keepalived.conf (Backup)
global_defs {
    router_id HAProxy_BACKUP
}

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight -20
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass MySecurePass2026
    }

    virtual_ipaddress {
        192.168.1.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"
}

核心差异只有priority值:Master设100,Backup设90。当HAProxy进程挂掉时,chk_haproxy脚本的weight=-20会让Master优先级降到80,低于Backup的90,触发VIP漂移。

故障切换通知脚本

状态切换时发送告警是生产环境的基本要求:

#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.1.100"

case $STATE in
    MASTER)
        MSG="${HOSTNAME}已接管VIP ${VIP},成为主节点"
        ;;
    BACKUP)
        MSG="${HOSTNAME}释放VIP ${VIP},退为备份节点"
        ;;
    FAULT)
        MSG="${HOSTNAME}进入FAULT状态,请立即排查"
        ;;
esac

# 发送告警(示例:调用企业微信Webhook)
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"   -H 'Content-Type: application/json'   -d "{"msgtype":"text","text":{"content":"[Keepalived告警] ${MSG}"}}"

常见故障场景验证

部署完成后需要逐一验证以下场景:

场景1:Master节点HAProxy进程崩溃

# 在Master上模拟
systemctl stop haproxy
# 预期:2秒内chk_haproxy检测到,priority降20,Backup接管VIP
# 验证:在Backup上 ip addr show eth0 | grep 192.168.1.100

场景2:Master节点整机宕机

# 在Master上模拟
shutdown -h now
# 预期:Backup在advert_int*3(约3秒)内未收到VRRP通告,抢占VIP

场景3:后端Web服务器故障

# 停止web02的HTTP服务
ssh web02 systemctl stop nginx
# 预期:HAProxy在inter*fall(约9秒)内标记web02为down,流量自动分发到web01和web03
# 验证:echo "show stat" | socat stdio /var/run/haproxy.sock

场景4:脑裂问题

当Master和Backup之间的网络不通但两台服务器本身正常时,可能出现两台同时持有VIP的脑裂问题。解决方案:在Keepalived配置中增加unicast_peer和防火墙规则,确保VRRP通告只在指定对端间传递。同时配置arping检测,接管VIP前先探测该IP是否已有响应。

性能调优与安全加固

系统层面的内核参数优化:

# /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1          # 允许HAProxy绑定非本机IP
net.ipv4.tcp_tw_reuse = 1              # 复用TIME_WAIT连接
net.core.somaxconn = 32768             # 增大监听队列
net.ipv4.tcp_max_syn_backlog = 16384   # SYN队列长度
net.ipv4.tcp_fin_timeout = 15          # 缩短FIN超时

# 生效
sysctl -p

安全层面:限制VRRP通告仅在内网接口传播,用iptables过滤非授权VRRP包;auth_pass使用强密码;启用SELinux并配置合理的HAProxy策略。

架构扩展方向

当业务规模增长需要更多HAProxy节点时,可以引入三节点甚至五节点VRRP集群,priority值递减。后端服务器扩容只需在haproxy.cfg中添加server行并reload(HAProxy支持优雅reload,不丢弃已有连接)。对于跨机房容灾,可以配合DNS全局负载均衡(GSLB)实现异地双活,Keepalived负责机房内高可用,DNS负责机房级流量调度。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-keepalivedhaproxy/

(0)
小编小编
上一篇 13小时前
下一篇 13小时前

相关推荐

Linux服务器高可用集群搭建:Keepalived+HAProxy实战配置

高可用架构的核心组件选型

生产环境的服务可用性要求通常在99.9%以上,单点故障是最大的风险。Keepalived提供VIP漂移实现故障自动切换,HAProxy负责七层/四层负载均衡和健康检查,两者组合是中小规模集群最成熟的高可用方案。整套架构无需商业授权,部署和维护成本都可控。

环境准备与拓扑规划

本次搭建使用两台后端Web服务器和两台HAProxy+Keepalived节点:

Web1: 192.168.10.21 (Nginx)
Web2: 192.168.10.22 (Nginx)
HAProxy-1: 192.168.10.11 (MASTER)
HAProxy-2: 192.168.10.12 (BACKUP)
VIP: 192.168.10.100

操作系统:CentOS 7/8 或 Ubuntu 20.04+,内核3.10以上。两个HAProxy节点需时间同步(NTP/Chrony),否则Keepalived的VRRP选举可能异常。

HAProxy配置详解

在两个HAProxy节点上安装并配置:

# 安装
yum install -y haproxy   # CentOS
apt install -y haproxy   # Ubuntu

# /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    timeout connect         10s
    timeout client          30s
    timeout server          30s
    retries                 3

frontend http_front
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/server.pem
    redirect scheme https if !{ ssl_fc }
    default_backend web_back

backend web_back
    balance     roundrobin
    option httpchk GET /health HTTP/1.1\r\nHost:\ localhost
    server web1 192.168.10.21:80 check inter 3000 rise 2 fall 3
    server web2 192.168.10.22:80 check inter 3000 rise 2 fall 3

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats admin if LOCALHOST

关键参数说明:inter 3000每3秒检查一次后端;rise 2连续2次成功标记为up;fall 3连续3次失败标记为down。SSL配置需要将证书和私钥合并为PEM格式。

Keepalived VRRP配置

在MASTER节点上配置:

# /etc/keepalived/keepalived.conf (MASTER)
global_defs {
    router_id HAProxy_MASTER
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    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 MyS3cret!
    }

    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 BACKUP、priority 90,其余相同。

vrrp_script检查HAProxy进程是否存活。如果HAProxy崩溃,权重减20,BACKUP节点优先级反超自动接管VIP。

故障切换通知脚本

#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
VIP=192.168.10.100

case $STATE in
    master)
        logger "Keepalived: Transition to MASTER, VIP ${VIP} active"
        ;;
    backup)
        logger "Keepalived: Transition to BACKUP, VIP ${VIP} released"
        ;;
    fault)
        logger "Keepalived: FAULT state detected"
        ;;
esac

脑裂防护与检测

脑裂(Split Brain)是双机高可用中最严重的故障模式——两个节点都认为自己是MASTER,同时持有VIP。防护措施:

1. 增加仲裁机制:配置第三台服务器作为VRRP仲裁节点,或者使用vrrp_sync_group将多个VRRP实例绑定。

2. 脚本强杀:在notify脚本中检测对方节点是否仍在抢占VIP,如果是则强制关闭本节点Keepalived。

3. 监控告警:用ip addr show定时检测VIP是否同时出现在两个节点。

# 脑裂检测脚本(加入crontab,每分钟执行)
#!/bin/bash
VIP=192.168.10.100
PEER=192.168.10.12

LOCAL_HAS_VIP=$(ip addr show | grep -c "$VIP")
PEER_ALIVE=$(ping -c 1 -W 1 $PEER | grep -c "1 received")

if [ "$LOCAL_HAS_VIP" -eq 1 ] && [ "$PEER_ALIVE" -eq 1 ]; then
    PEER_HAS_VIP=$(ssh $PEER "ip addr show | grep -c '$VIP'" 2>/dev/null)
    if [ "$PEER_HAS_VIP" -eq 1 ]; then
        logger "CRITICAL: 脑裂检测!两端同时持有VIP"
        systemctl stop keepalived
    fi
fi

性能调优参数

高并发场景下需要调整以下内核参数:

# /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1

# 应用
sysctl -p

HAProxy的maxconn建议设为somaxconn的一半左右,避免内核层丢连接。Keepalived的advert_int在稳定内网环境下1秒足够,公网部署建议2-3秒以减少误切换。

日常运维检查清单

1. ip addr show eth0 确认VIP在MASTER节点

2. haproxy -vv 检查HAProxy版本和编译参数

3. 访问 http://VIP:8404/stats 查看后端健康状态

4. journalctl -u keepalived -f 实时查看VRRP状态变化

5. 定期模拟故障:停止MASTER的HAProxy,验证VIP是否在5秒内漂移到BACKUP

这套Keepalived+HAProxy方案已经在大量生产环境中验证,故障切换时间在3-5秒内完成,对上层业务几乎透明。配置完成后务必做故障演练,确保切换逻辑符合预期。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-keepalivedhaproxy/

(0)
小编小编
上一篇 13小时前
下一篇 13小时前

相关推荐