• 工作原理:两台服务器通过VRRP协议相互通信。主服务器(Master)会以组播方式向备服务器(Backup)发送心跳包。如果备服务器在一段时间内收不到心跳,就会接管VIP,成为新的主服务器。

  • 环境准备:你需要准备两台已部署好Nginx的Linux服务器,以及一个未被使用的内网虚拟IP(VIP)。

    角色 IP地址 VIP 操作系统
    主服务器 (Master) 192.168.1.10 192.168.1.100 CentOS 7 / Ubuntu 20.04+
    备服务器 (Backup) 192.168.1.11 192.168.1.100 CentOS 7 / Ubuntu 20.04+

🔧 1. 安装Keepalived并编写健康检查脚本

首先,在两台服务器上都需要安装Keepalived并创建健康检查脚本。

  1. 安装Keepalived

    • CentOS/RHELyum install -y keepalived

    • Ubuntu/Debianapt install -y keepalived

    • 同时确保你的Nginx服务已安装并正确配置。

  2. 创建Nginx健康检查脚本
    /etc/keepalived/目录下创建check_nginx.sh脚本。这个脚本至关重要,它用于探测Nginx是否真的正常工作,避免VIP“僵”在故障节点上。

    bash

    #!/bin/bash
    # 1. 尝试访问Nginx的健康检查接口,超时3秒,失败则返回非0
    if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then
        # 2. 健康检查失败,尝试重启Nginx
        systemctl restart nginx
        sleep 2
        # 3. 再次检查,如果还是失败,则停止本机的Keepalived服务,触发VIP漂移
        if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then
            systemctl stop keepalived
            exit 1
        fi
    fi
    exit 0

    这个脚本的逻辑是:先检查Nginx健康状态,如果失败就尝试重启Nginx,重启后再检查一次,如果仍然失败,就停止本机的Keepalived服务,让VIP漂移到备机。

  3. 赋予脚本执行权限

    bash

    chmod +x /etc/keepalived/check_nginx.sh
  4. 准备Nginx健康检查端点
    为了让上述脚本能进行可靠的HTTP检查,你需要在Nginx配置中添加一个专用的健康检查端点。

    nginx

    # 在 nginx.conf 的 server 块中添加
    location /healthz {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }

    配置完成后,使用nginx -t检查语法,并用nginx -s reload重新加载配置。你也可以通过curl http://127.0.0.1/healthz来验证是否能正常返回。


⚙️ 2. 配置Keepalived

接下来,分别配置两台服务器的Keepalived主配置文件/etc/keepalived/keepalived.conf注意:两个文件的大部分内容相同,仅有statepriorityrouter_id有差异

主服务器配置 (192.168.1.10)

bash

global_defs {
   router_id NGINX_MASTER    # 主服务器的标识
}

# 定义健康检查脚本及其参数
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2                # 每2秒执行一次脚本
    weight -5                 # 如果脚本失败,当前节点优先级减少5
}

# 定义VRRP实例
vrrp_instance VI_1 {
    state MASTER             # 初始角色为MASTER
    interface eth0           # 替换为你的网卡名,如eth0, ens33
    virtual_router_id 51     # 虚拟路由ID,主备必须一致
    priority 101             # 优先级,高于备节点
    advert_int 1             # 组播心跳间隔,单位秒

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0  # VIP及绑定的网卡
    }

    track_script {
        chk_nginx            # 引用健康检查脚本
    }
}
备服务器配置 (192.168.1.11)

bash

global_defs {
   router_id NGINX_BACKUP    # 备服务器的标识
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -5
}

vrrp_instance VI_1 {
    state BACKUP             # 初始角色为BACKUP
    interface eth0           # 替换为你的网卡名
    virtual_router_id 51     # 与主服务器保持一致
    priority 100             # 优先级低于主服务器
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }

    track_script {
        chk_nginx
    }
}

🚀 3. 启动服务并验证

配置完成后,按以下步骤启动并验证你的高可用集群。

  1. 启动服务
    在两台服务器上分别执行以下命令,先启动Nginx,再启动Keepalived。

    bash

    systemctl start nginx
    systemctl start keepalived

    如果一切正常,VIP会浮动在主服务器上。你可以分别在主备服务器上执行ip addr showip a来查看VIP的绑定情况。

  2. 模拟故障切换
    为了验证高可用是否生效,可以强制停止主服务器的Keepalived服务,模拟主节点故障。

    bash

    # 在主服务器上执行,模拟故障
    systemctl stop keepalived

    执行后,你应该会观察到:

    • 主服务器的VIP被释放。

    • 约3秒后(取决于advert_int和超时时间),备服务器的VIP被绑定,服务恢复正常。

    • 你可以通过curl -I http://192.168.1.100/healthz持续测试,观察中断时间。


📝 关键配置详解

为了让配置更清晰,下表说明了几个核心参数的作用:

配置项 作用 设置建议
state 指定节点的初始角色。 MASTER(主) / BACKUP(备)
priority 用于选举Master,数值高的节点获胜。 主 > 备,建议差值大于weight的绝对值
weight track_script脚本失败时,当前节点优先级的增减量。 绝对值小于主备priority的差值
interval 执行健康检查脚本的频率(秒)。 结合业务SLA设置,一般为2-5秒
advert_int VRRP心跳包的发送间隔(秒)。 减小此值可加快切换速度,一般为1秒
nopreempt 非抢占模式。 同时设置state BACKUPnopreempt可防止主节点恢复后立即抢回VI
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐