Keepalived+Nginx高可用集群搭建实战:双机热备配置与故障切换诊断

Keepalived双机热备基础架构与适用场景

Keepalived基于VRRP协议实现高可用集群,是Linux系统管理中最常用的网络层高可用方案。Nginx作为反向代理和负载均衡器,配合Keepalived可以实现VIP漂移,当主节点故障时备用节点自动接管流量,业务无感知切换。这个组合在电商大促、金融交易等对可用性要求极高的场景中广泛部署。

高可用集群的架构设计需要明确几个关键参数:检测间隔(多久检查一次主节点状态)、权重配置(主备优先级差值)、故障切换阈值(连续几次检测失败才触发切换)。这些参数直接影响故障切换的速度和稳定性,配置不当会导致频繁误切或切换延迟过大。

环境准备与网络拓扑规划

以典型双机热备场景为例:两台服务器分别作为MASTER和BACKUP,共享一个VIP对外提供服务。服务器之间通过专用心跳线通信,避免业务网络抖动导致误判断。

网络规划:

– 主节点(MASTER):192.168.10.11,运行Nginx

– 备节点(BACKUP):192.168.10.12,运行Nginx

– VIP:192.168.10.100,对外暴露的虚拟IP

– 心跳网络:10.0.0.0/24(独立网段)

两台机器均安装CentOS 7/8或Ubuntu 20.04+,系统内核版本不低于3.10。开始配置前确认防火墙放行VRRP协议(IP协议号112)。

Nginx安装与反向代理配置

两台服务器执行相同操作。以yum安装方式为例:

# 安装依赖
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 编译安装Nginx
cd /usr/local/src
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream
make && make install

# 创建系统服务
cat > /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=Nginx HTTP Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable nginx
systemctl start nginx

Nginx反向代理核心配置(/usr/local/nginx/conf/nginx.conf):

upstream backend_pool {
    server 192.168.20.101:8080 weight=5 max_fails=3 fail_timeout=30s;
    server 192.168.20.102:8080 weight=5 max_fails=3 fail_timeout=30s;
    server 192.168.20.103:8080 weight=3 max_fails=3 fail_timeout=30s backup;
}

server {
    listen 80;
    server_name 192.168.10.100;

    location / {
        proxy_pass http://backend_pool;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
    }

    location /health {
        access_log off;
        return 200 "ok";
    }
}

max_fails和fail_timeout配合实现后端健康检查。Nginx默认的被动健康检查机制在节点恢复后自动重新纳入负载均衡。

Keepalived安装与VRRP配置

安装Keepalived:

yum install -y keepalived
# 或编译安装获取最新版本
cd /usr/local/src
wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar zxvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
./configure --prefix=/usr/local/keepalived
make && make install

主节点(MASTER)配置文件 /etc/keepalived/keepalived.conf:

global_defs {
    router_id NGINX_MASTER
    enable_script_security
    script_user root
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    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 MyStr0ngP@ss
    }
    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
    track_script {
        check_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

关键参数解读:priority 100为主节点优先级,weight -20表示检测脚本失败时扣20分,扣分后低于备节点优先级即触发切换。fall 2表示连续2次检测失败才判定故障,rise 1表示恢复后1次成功即判定恢复。

备节点(BACKUP)配置文件

global_defs {
    router_id NGINX_BACKUP
    enable_script_security
    script_user root
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    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 MyStr0ngP@ss
    }
    virtual_ipaddress {
        192.168.10.100/24 dev eth0
    }
    track_script {
        check_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
}

主备配置差异只有三处:router_id、state、priority。virtual_router_id必须一致,否则两台机器各自形成独立VRRP组。

Nginx健康检查脚本编写

check_nginx.sh脚本是触发切换的关键环节:

#!/bin/bash
# /etc/keepalived/check_nginx.sh

NGINX_PORT=80
NGINX_PROCESS=$(pgrep -c nginx)

# 检查进程是否存活
if [ "$NGINX_PROCESS" -eq 0 ]; then
    # 尝试重启Nginx
    systemctl restart nginx
    sleep 2
    NGINX_PROCESS=$(pgrep -c nginx)
    if [ "$NGINX_PROCESS" -eq 0 ]; then
        echo "Nginx restart failed, triggering failover"
        exit 1
    fi
fi

# 检查端口是否响应
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:${NGINX_PORT}/health | grep -q "200"
if [ $? -ne 0 ]; then
    echo "Nginx health check failed"
    exit 1
fi

exit 0

脚本退出码为1时Keepalived触发weight扣分。脚本中加入了自动重启逻辑——单次Nginx崩溃不应该立即触发切换,先尝试本地恢复。

故障切换通知脚本

notify.sh用于切换时发送告警通知:

#!/bin/bash
# /etc/keepalived/notify.sh

STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.10.100"
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"

case "$STATE" in
    master)
        TITLE="高可用集群告警:节点切换为MASTER"
        CONTENT="主机 ${HOSTNAME} 已接管VIP ${VIP},请检查原主节点状态"
        ;;
    backup)
        TITLE="高可用集群通知:节点切换为BACKUP"
        CONTENT="主机 ${HOSTNAME} 已释放VIP ${VIP},当前降级为备用节点"
        ;;
    fault)
        TITLE="高可用集群告警:节点状态异常"
        CONTENT="主机 ${HOSTNAME} Keepalived进入FAULT状态,需立即排查"
        ;;
esac

curl -s -H "Content-Type: application/json" \
     -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"${TITLE}\n${CONTENT}\"}}" \
     "$WEBHOOK_URL"
chmod +x /etc/keepalived/check_nginx.sh
chmod +x /etc/keepalived/notify.sh
systemctl enable keepalived
systemctl start keepalived

故障切换验证与脑裂问题排查

部署完成后必须进行切换测试。模拟主节点故障的方法:

# 在主节点执行
systemctl stop nginx
# 等待4秒(interval 2 × fall 2),观察VIP是否漂移

# 在备节点检查VIP
ip addr show eth0 | grep 192.168.10.100

# 恢复主节点
systemctl start nginx
# 主节点优先级恢复为100,高于备节点90,VIP回切

脑裂问题是高可用集群中最危险的故障模式。两台服务器都认为自己持有VIP,导致IP冲突和流量混乱。常见原因与排查方法:

原因1:心跳网络不通。VRRP报文无法在主备之间传递,双方各自判断对方已宕机。排查命令tcpdump -i eth0 vrrp查看VRRP报文是否正常收发。解决方案是增加冗余心跳链路,或使用_serial_模式在串口线传输心跳。

原因2:防火墙阻断VRRP协议。VRRP使用IP协议号112,并非TCP/UDP端口。防火墙规则要显式放行:

# iptables放行VRRP
iptables -A INPUT -p 112 -j ACCEPT
# firewalld放行
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload

原因3:服务器高负载导致心跳超时。CPU满载时Keepalived调度不及时,心跳报文延迟。解决方案是配置服务器安全加固措施中限制业务进程CPU使用率上限,或为Keepalived设置进程实时优先级:

# 提高Keepalived进程优先级
renice -n -5 -p $(pidof keepalived)

日志分析与运行状态监控

Keepalived日志默认输出到syslog。配置独立日志文件便于故障排查:

# 修改/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"

# /etc/rsyslog.conf 添加
local0.* /var/log/keepalived.log

systemctl restart rsyslog keepalived

日常运维中需要关注的日志关键字:Entering MASTER STATE(成为主节点)、Entering BACKUP STATE(降级为备节点)、VRRP_Script(健康检查脚本结果)。日志中出现频繁的状态切换记录,说明高可用集群的稳定性存在隐患,需要从网络质量、服务器负载、健康检查脚本逻辑三个方向排查。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/keepalivednginx-gao-ke-yong-ji-qun-da-jian-shi-zhan-shuang/

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

相关推荐

Keepalived+Nginx高可用集群搭建实战:双机热备配置与故障切换诊断

高可用集群服务器运维中保障业务连续性的核心架构。本文以Keepalived配合Nginx双机热备为例,从环境准备、配置文件编写到故障切换诊断,给出完整的操作步骤。适用于IDC数据中心和云服务器选型后的生产环境部署场景。

高可用集群架构规划

双机热备的核心思路:两台服务器运行相同的Nginx服务,通过Keepalived维护一个虚拟IP(VIP),正常情况下VIP绑定在主节点,主节点故障时VIP自动漂移到备节点。客户端只感知VIP,不感知后端切换。

架构图:

         客户端
            |
        [VIP: 192.168.1.100]
         /              \
   [Master]          [Backup]
  192.168.1.101    192.168.1.102
   Nginx            Nginx
   Keepalived       Keepalived

硬件性能测评阶段需确认两台服务器的CPU、内存配置一致,避免备节点性能不足导致切换后雪崩。

安装Keepalived与Nginx

两台服务器执行相同操作。以CentOS Stream 9为例:

# 安装EPEL仓库
dnf install -y epel-release

# 安装Keepalived和Nginx
dnf install -y keepalived nginx

# 启动Nginx并设置开机自启
systemctl start nginx
systemctl enable nginx

# 服务器安全加固:关闭SELinux(生产环境建议配置策略而非关闭)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

配置Master节点的Keepalived

编辑主节点配置文件 /etc/keepalived/keepalived.conf:

global_defs {
    router_id NGINX_MASTER
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    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 Yunthe@2026
    }

    virtual_ipaddress {
        192.168.1.100
    }

    track_script {
        chk_nginx
    }
}

配置Backup节点和Nginx健康检查脚本

备节点配置与主节点基本一致,需要修改三处:router_id、state、priority。

global_defs {
    router_id NGINX_BACKUP
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    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 Yunthe@2026
    }

    virtual_ipaddress {
        192.168.1.100
    }

    track_script {
        chk_nginx
    }
}

编写Nginx健康检查脚本 /etc/keepalived/check_nginx.sh,两台机器都需配置:

#!/bin/bash
# 检测Nginx进程是否存在
if [ -z "$(pgrep nginx)" ]; then
    systemctl start nginx
    sleep 2
    if [ -z "$(pgrep nginx)" ]; then
        systemctl stop keepalived
    fi
fi
# 赋予执行权限
chmod +x /etc/keepalived/check_nginx.sh

# 启动Keepalived
systemctl start keepalived
systemctl enable keepalived

验证VIP与故障切换测试

配好双机后,需要实际验证故障告警体系的可用性。操作步骤:

# 1. 在Master节点查看VIP绑定情况
ip addr show eth0 | grep 192.168.1.100
# 输出应包含: inet 192.168.1.100/32 scope global eth0

# 2. 在Master节点停止Nginx,模拟故障
systemctl stop nginx

# 3. 等待5秒后在Backup节点检查VIP是否漂移
ip addr show eth0 | grep 192.168.1.100
# 正常情况Backup节点应获得VIP

# 4. 恢复Master节点的Nginx
systemctl start nginx
# VIP应自动回到Master节点(因为priority更高)

服务器故障排查:常见问题诊断

问题:VIP不漂移。排查方向:

# 检查Keepalived是否运行
systemctl status keepalived

# 检查VRRP通告是否正常(抓包)
tcpdump -i eth0 vrrp -nn

# 检查健康检查脚本是否可执行
ls -la /etc/keepalived/check_nginx.sh

# 检查防火墙是否放行VRRP协议(协议号112)
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload

问题:出现双主(脑裂)。两端都绑定了VIP,导致客户端请求随机分发。这是服务器安全加固中最需要警惕的故障。

# 原因通常是VRRP通告被防火墙阻断
# 解决:确保两端防火墙放行协议112
# 验证:在Master抓包应能看到VRRP通告
tcpdump -i eth0 vrrp -nn
# 正常输出: IP 192.168.1.101 > 224.0.0.18: VRRPv2, Advertisement, vrid 51

问题:备节点抢主后又立即切回。通常是健康检查脚本的间隔和weight配置不当。建议 fall 2(连续2次失败才切)加 interval 2(2秒检查一次),避免网络抖动导致的误切换。

算力资源规划建议

高可用集群不是终点,而是起点。当业务量增长到单机无法承载时,可以在Nginx层后面增加多台后端服务器,用Nginx的upstream模块做负载均衡,Keepalived只负责Nginx层面的高可用。算力资源规划时,建议预留30%的冗余容量,确保故障切换后备节点能扛住全部流量。

# Nginx负载均衡配置示例
upstream backend {
    server 192.168.1.201:8080 weight=3;
    server 192.168.1.202:8080 weight=2;
    server 192.168.1.203:8080 weight=1;
    keepalive 32;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

物理机架设高可用集群时,还需注意电源冗余、网络链路冗余等硬件层面的高可用设计。软件层面的Keepalived无法解决硬件单点故障,算力资源规划要全链路考虑冗余。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/keepalivednginx-gao-ke-yong-ji-qun-da-jian-shi-zhan-shuang/

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

相关推荐