Linux服务器高可用集群搭建:Keepalived+Nginx双机热备完整部署

服务器高可用集群是企业核心业务连续性的基础保障。本文以Keepalived配合Nginx为技术方案,完整演示双机热备到负载均衡的部署流程,涵盖架构设计、安装配置、故障切换测试和日常运维监控。适用于需要搭建高可用Web服务、API网关等场景的运维实践。

高可用集群架构设计:VIP漂移与健康检查机制

Keepalived基于VRRP(虚拟路由冗余协议)实现VIP(虚拟IP)在多台服务器之间的自动漂移。主节点故障时,备节点在秒级内接管VIP,对外服务不中断。整体架构如下:

# 架构示意
#                    客户端请求
#                        |
#                   VIP: 192.168.1.100
#                   /              \
#           Master(主节点)      Backup(备节点)
#           192.168.1.101       192.168.1.102
#           Nginx :80           Nginx :80
#           Keepalived          Keepalived
#                \                /
#                后端应用服务器集群

VRRP协议的工作机制:主节点定期发送VRRP通告包(默认每1秒),备节点在3个通告周期内未收到主节点通告,则认为主节点故障,触发VIP漂移。Keepalived同时执行应用层健康检查,当Nginx进程异常但服务器本身正常时,也能触发故障切换。

服务器环境准备与基础配置

两台服务器均使用CentOS Stream 9 / Ubuntu 22.04,关闭防火墙或放行VRRP协议,确保时间同步。

# 两台服务器均执行

# 安装依赖
yum install -y nginx keepalived pcre-devel openssl-devel
# Ubuntu: apt install -y nginx keepalived

# 放行VRRP协议(firewalld方式)
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload

# 或iptables方式
iptables -I INPUT -p vrrp -j ACCEPT

# 确保时间同步
timedatectl set-ntp true
chronyc sources

基础Nginx配置(两台相同),作为反向代理将请求转发到后端应用服务器:

# /etc/nginx/conf.d/ha-proxy.conf

upstream backend {
    server 192.168.1.201:8080 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.202:8080 weight=1 max_fails=3 fail_timeout=30s;
    keepalive 32;
}

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://backend;
        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 3s;
        proxy_read_timeout 30s;
    }

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

Keepalived配置详解:主节点与备节点

主节点Keepalived配置:

# /etc/keepalived/keepalived.conf (Master节点 192.168.1.101)

global_defs {
    router_id HA_MASTER
    enable_script_security
}

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 YourPass123
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        chk_nginx
    }

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"
}

备节点配置只需修改三处:state改为BACKUP,priority设为90,router_id改为HA_BACKUP。其余配置与主节点完全一致,确保virtual_router_idauth_pass相同。

健康检查脚本与故障通知配置

Nginx进程检测脚本,当Nginx进程不存在时尝试重启,重启失败则停止Keepalived让VIP漂移:

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

NGINX_PID=$(pgrep -x nginx | head -1)

if [ -z "$NGINX_PID" ]; then
    systemctl restart nginx
    sleep 2
    NGINX_PID=$(pgrep -x nginx | head -1)
    if [ -z "$NGINX_PID" ]; then
        exit 1
    fi
fi
exit 0

故障切换通知脚本,通过企业微信/钉钉Webhook发送告警:

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

STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.1.100"
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"

case "$STATE" in
    master)
        MSG="高可用切换告警 主机:${HOSTNAME} 状态:MASTER VIP:${VIP}"
        ;;
    backup)
        MSG="高可用状态变更 主机:${HOSTNAME} 状态:BACKUP VIP:${VIP}"
        ;;
    fault)
        MSG="高可用故障告警 主机:${HOSTNAME} 状态:FAULT VIP:${VIP}"
        ;;
esac

curl -s -X POST "$WEBHOOK_URL" \
    -H 'Content-Type: application/json' \
    -d '{"msgtype":"text","text":{"content":"'"$MSG"'"}}'

赋予脚本执行权限并启动服务:

chmod +x /etc/keepalived/check_nginx.sh
chmod +x /etc/keepalived/notify.sh

systemctl enable keepalived nginx
systemctl start keepalived nginx

# 查看VIP绑定状态
ip addr show eth0 | grep 192.168.1.100

故障切换测试:模拟主节点宕机验证VIP漂移

部署完成后必须进行切换测试。测试场景包括Nginx进程崩溃、主节点网络断开、主节点关机三种情况:

# 场景1: 在主节点停止Nginx,观察VIP是否漂移
systemctl stop nginx

# 在Backup节点观察VIP是否接管
ip addr show eth0 | grep 192.168.1.100

# 查看Keepalived日志
journalctl -u keepalived -f --no-pager

# 场景2: 恢复主节点Nginx,观察VIP是否回切
systemctl start nginx
sleep 3
ip addr show eth0 | grep 192.168.1.100

# 场景3: 持续请求测试,验证切换过程的中断时间
while true; do
    curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://192.168.1.100/
    sleep 0.5
done

正常情况下,VIP漂移在1-3秒内完成,客户端请求会有短暂超时但不影响整体服务。对于要求零中断的场景,可以在客户端配置重试机制或使用DNS层面的负载均衡配合。

服务器安全加固:Keepalived集群防护要点

高可用集群的安全加固容易被忽视。以下是几个关键安全措施:

# 1. 限制VRRP协议只接受对端节点
iptables -I INPUT -p vrrp -s 192.168.1.102 -j ACCEPT  # Master节点
iptables -I INPUT -p vrrp -s 192.168.1.101 -j ACCEPT  # Backup节点
iptables -A INPUT -p vrrp -j DROP

# 2. Keepalived认证密码使用强密码(至少16位)

# 3. 限制管理端口访问
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# 4. Nginx隐藏版本号
# nginx.conf 中添加 server_tokens off;

# 5. 配置syslog远程日志,防止单点日志丢失

高可用集群上线后,定期进行切换演练(建议每月一次),验证切换流程的可靠性。同时部署Prometheus + Grafana监控Keepalived状态和Nginx健康指标,设置告警规则在VIP状态异常时及时通知运维团队。IDC数据中心环境下,还需考虑跨机柜冗余和双上行链路设计,避免单点物理故障导致整个集群不可用。硬件性能测评应定期进行,确保服务器负载在安全范围内。

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

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

相关推荐

Linux服务器高可用集群搭建:Keepalived+Nginx双主热备配置全流程

为什么服务器高可用需要Keepalived

单点Nginx一旦宕机,所有业务流量中断。Keepalived基于VRRP协议实现VIP漂移,当主节点故障时备用节点在秒级接管,业务几乎无感知。双主模式更让两台服务器互相为主备,资源利用率翻倍。这篇文章把Keepalived+Nginx双主高可用的搭建、调优和排障全流程写清楚。

环境规划与网络拓扑

双主架构需要两台服务器、两个VIP:

– 节点A:192.168.1.10,VIP1(Master) 192.168.1.100,VIP2(Backup) 192.168.1.101
– 节点B:192.168.1.11,VIP1(Backup) 192.168.1.100,VIP2(Master) 192.168.1.101
– 两个VIP由DNS轮询或LB分发流量

基础环境准备:

# 两台机器都执行
yum install -y keepalived nginx
systemctl enable keepalived nginx
firewall-cmd --add-service=vrrp --permanent
firewall-cmd --reload

VRRP协议需要放行,否则节点间无法通信,导致脑裂。

Nginx负载均衡配置

两台机器的Nginx配置保持一致:

upstream backend {
    server 192.168.1.20:8080 weight=5;
    server 192.168.1.21:8080 weight=5;
    keepalive 32;
}

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

验证Nginx正常启动:nginx -t && systemctl start nginx

Keepalived双主配置

节点A的/etc/keepalived/keepalived.conf

global_defs {
    router_id NODE_A
    vrrp_skip_check_adv_addr
    vrrp_garp_master_refresh 60
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MyPass123
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        chk_nginx
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MyPass456
    }
    virtual_ipaddress {
        192.168.1.101/24
    }
    track_script {
        chk_nginx
    }
}

节点B的配置对称交换:VI_1的state改为BACKUP、priority改为90,VI_2的state改为MASTER、priority改为100。

Nginx健康检查脚本

Keepalived需要检测Nginx进程状态,进程挂掉就主动释放VIP:

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

/etc/keepalived/check_nginx.sh

#!/bin/bash
if ! pidof nginx > /dev/null; then
    systemctl restart nginx
    sleep 2
    if ! pidof nginx > /dev/null; then
        exit 1
    fi
fi
exit 0
chmod +x /etc/keepalived/check_nginx.sh

逻辑:检测到Nginx进程不在,先尝试重启一次,2秒后再检测,仍失败则让Keepalived执行VIP漂移。

脑裂防护与故障切换验证

脑裂是双主架构的最大风险——两台机器都认为自己是Master,争抢VIP。防护手段:

1. 防火墙放行VRRP:前面已配置
2. 仲裁脚本:检测到对端不可达时,尝试ping网关,网关也不可达则不切换
3. 日志监控journalctl -u keepalived -f 实时观察VRRP状态

故障切换验证步骤:

# 在节点A上模拟Nginx故障
systemctl stop nginx

# 观察VIP漂移(在任意机器执行)
ip addr show eth0 | grep 192.168.1.100

# 2-3秒内VIP应该出现在节点B上
# 节点B执行
ip addr show eth0 | grep 192.168.1.100

恢复验证:

# 节点A恢复Nginx
systemctl start nginx

# Keepalived检测Nginx恢复后,priority回升
# VI_1的priority更高,VIP自动抢回节点A

服务器安全加固要点

Keepalived配置文件的auth_pass明文存储,需要做好文件权限:

chmod 600 /etc/keepalived/keepalived.conf
chown root:root /etc/keepalived/keepalived.conf

系统层面:

– 禁止root远程SSH密码登录,仅允许密钥认证
– SELinux保持enforcing状态,Keepalived策略需提前配置
– 内核参数调优:net.ipv4.tcp_tw_reuse = 1net.core.somaxconn = 65535

这套Keepalived+Nginx双主方案已在大量生产环境验证,切换时间3秒内,配合健康检查脚本做到故障自动恢复+自动降级。根据业务规模,可以扩展为多VIP多主架构,应对更高并发需求。

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

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

相关推荐