将本次 Nginx + HAProxy + Keepalived 双机高可用(主备模式) 的完整部署过程梳理如下,方便归档和复盘。

一、 集群架构规划

  • VIP(虚拟 IP):192.168.10.66

  • 主节点(lb01):

    • IP:192.168.10.130

    • 绑定的物理网卡:ens160

    • 运行服务:Nginx + Keepalived (MASTER, priority 100)

  • 备节点(lb02):

    • IP:根据实际分配(如 192.168.10.131)

    • 绑定的物理网卡:ens160(若网卡名不同按实际填写)

    • 运行服务:HAProxy + Keepalived (BACKUP, priority 90)

二、 基础环境准备(两台机器均需执行)

1. 关闭防火墙与 SELinux

Bash

# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2. 安装必要软件包

psmisc 提供 killall 命令,检查脚本依赖此工具:

Bash

dnf install -y keepalived psmisc

3. 开启非本机 IP 绑定(内核参数)

允许服务绑定尚未漂移过来的 VIP:

Bash

echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p

三、 编写健康检查脚本

健康检查脚本用于探测本地代理进程。若挂掉,脚本返回退出码 1,Keepalived 探测失败后会自动扣除优先级,触发 VIP 漂移。

1. 主节点 lb01(探测 Nginx)

Bash

cat << 'EOF' > /etc/keepalived/check_lb.sh
#!/bin/bash
if ! killall -0 nginx &>/dev/null; then
    exit 1
fi
exit 0
EOF

chmod +x /etc/keepalived/check_lb.sh

2. 备节点 lb02(探测 HAProxy)

Bash

cat << 'EOF' > /etc/keepalived/check_lb.sh
#!/bin/bash
if ! killall -0 haproxy &>/dev/null; then
    exit 1
fi
exit 0
EOF

chmod +x /etc/keepalived/check_lb.sh

四、 Keepalived 核心配置

1. 主节点 lb01 配置 (/etc/keepalived/keepalived.conf)

Nginx

! Configuration File for keepalived

global_defs {
    router_id lb01
    script_user root
    enable_script_security
}

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

vrrp_instance VI_1 {
    state MASTER
    interface ens160          # 必须与 ip addr 显示的物理网卡名一致
    virtual_router_id 51      # 主备必须一致 (1-255)
    priority 100              # Master 优先级高于 Backup
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 12345678    # 密码长度不超过 8 位,主备必须一致
    }

    virtual_ipaddress {
        192.168.10.66/24 dev ens160 label ens160:vip
    }

    track_script {
        check_lb
    }
}

2. 备节点 lb02 配置 (/etc/keepalived/keepalived.conf)

Nginx

! Configuration File for keepalived

global_defs {
    router_id lb02
    script_user root
    enable_script_security
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface ens160          # 根据 lb02 实际网卡名调整
    virtual_router_id 51      # 与 Master 保持完全一致
    priority 90               # 备机优先级必须低于 Master
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 12345678    # 与 Master 保持完全一致
    }

    virtual_ipaddress {
        192.168.10.66/24 dev ens160 label ens160:vip
    }

    track_script {
        check_lb
    }
}

五、 启动服务与故障排查要点

1. 启动服务(两台机器均执行)

Bash

# 确保代理服务正常运行
systemctl enable --now nginx      # lb01 执行
systemctl enable --now haproxy    # lb02 执行

# 启动 Keepalived
systemctl enable --now keepalived

2. 本次踩坑复盘要点

  • 网卡名称拼写:keepalived.conf 中的网卡名必须与 ip addr show 严格一致(如 ens160,切勿误写为 eth160 或 eth0)。

  • 密码截断警告:auth_pass 最长仅支持 8 字节,超过会被截断。

  • 脚本权限与安全配置:高版本 Keepalived 默认限制 root 执行脚本,需在 global_defs 中显式指定 script_user root 与 enable_script_security。

  • 依赖工具:检查脚本若使用 killall,必须保证系统已预装 psmisc。

六、 功能验收测试

  1. 查看初始 VIP:

    • 在 lb01 执行 ip addr show ens160,包含 192.168.10.66。

    • 在 lb02 执行 ip addr show,不包含该 VIP(无脑裂)。

  2. 测试故障切换:

    • 在 lb01 模拟服务故障:systemctl stop nginx。

    • 观察 lb02 执行 ip addr show,VIP 应在 2 秒内漂移到 lb02。

  3. 测试恢复抢占:

    • 在 lb01 恢复服务:systemctl start nginx。

    • 观察 lb01 重新抢占回 VIP,lb02 自动释放 VIP。