Keepalived + Nginx 高可用负载均衡部署

目录

一、架构与原理

[1.1 高可用架构设计](#1.1 高可用架构设计)

[1.2 核心原理](#1.2 核心原理)

二、部署步骤详解

[2.1 环境准备](#2.1 环境准备)

[2.2 安装 Docker 与 Docker Compose](#2.2 安装 Docker 与 Docker Compose)

[2.3 部署 Nginx 容器](#2.3 部署 Nginx 容器)

[2.3 安装Keepalived](#2.3 安装Keepalived)

[2.4 配置 Keepalived](#2.4 配置 Keepalived)

[2.4.1 主节点配置](#2.4.1 主节点配置)

[2.4.2 备节点配置](#2.4.2 备节点配置)

[2.5 健康检查脚本](#2.5 健康检查脚本)

[2.6 启动 Keepalived](#2.6 启动 Keepalived)

三、验证与测试

[3.1 检查 VIP 绑定](#3.1 检查 VIP 绑定)

[3.2 测试负载均衡](#3.2 测试负载均衡)

[3.3 模拟故障转移](#3.3 模拟故障转移)

四、常见问题与注意事项

[4.1 常见问题](#4.1 常见问题)

[4.2 注意事项](#4.2 注意事项)

五、总结


一、架构与原理

1.1 高可用架构设计
  • 目标 :通过 Keepalived 实现虚拟 IP(VIP)的故障转移,结合 Nginx 的负载均衡能力,确保服务的高可用性和可扩展性。

  • 核心组件

    • Keepalived:基于 VRRP 协议(虚拟路由冗余协议)实现 VIP 的故障转移。

    • Nginx:作为反向代理和负载均衡器,将请求分发到后端服务器。

    • Docker:容器化部署 Nginx,提升环境一致性。

1.2 核心原理
  1. VRRP 协议

    • 多台服务器组成一个虚拟路由组,共享一个 VIP。

    • 主节点(Master)定期发送心跳包(Advertisement),备节点(Backup)监听心跳。

    • 若主节点宕机,备节点接管 VIP。

  2. 健康检查

    • Keepalived 通过自定义脚本(如 nginx_check.sh)监控服务状态。

    • 若检测到 Nginx 容器异常,尝试重启;若重启失败,主动停止 Keepalived 服务,触发 VIP 转移。


二、部署步骤详解

2.1 环境准备
  • 操作系统

    • Centos
  • 服务器

    • 主节点:192.168.213.3

    • 备节点:192.168.213.4

  • VIP192.168.213.6/24

  • 网络接口ens33(需根据实际网卡名称修改)

  • 软件版本

    • Docker 20.10+

    • Docker Compose 2.20+

    • Keepalived 2.0+


2.2 安装 Docker 与 Docker Compose

可参考我之前的文章 Docker安装

解释

  • Docker 提供容器运行时环境,Nginx 运行在容器中,避免环境差异。

  • Docker Compose 用于定义和管理多容器应用,简化部署流程。


2.3 部署 Nginx 容器
  1. 创建目录结构

    复制代码
    mkdir -p /home/nginx/{conf,html}
  2. 编写 docker-compose.yml

    复制代码
    version: '1'
    services:
      nginx:
        image: nginx-upstream-check:1.25.3
        container_name: nginx1.25.3 # 容器名称需与检查脚本一致
        ports:
          - "8000:8000"                 # 暴露 HTTP 端口
        volumes:
          - ./conf:/usr/local/nginx/conf   # 挂载 Nginx 配置目录
          - ./logs:/usr/local/nginx/logs  # 挂载静态文件目录
        restart: unless-stopped       # 容器异常退出时自动重启
  3. 启动容器

    复制代码
    cd /home/nginx/
    docker-compose up -d
    复制代码

解释

  • volumes 挂载配置文件目录和静态资源目录,方便后续修改。

  • restart: unless-stopped 确保容器在异常退出时自动恢复。


2.3 安装Keepalived
复制代码
# 安装 EPEL 仓库(CentOS 7/8)
sudo yum install epel-release -y

# 安装 Keepalived
sudo yum install keepalived -y

# 验证安装
keepalived --version
2.4 配置 Keepalived
2.4.1 主节点配置

文件路径:/etc/keepalived/keepalived.conf

复制代码
global_defs {
   router_id LVS_DEVEL        # 唯一标识节点(如主机名)
   vrrp_skip_check_adv_addr   # 跳过 VRRP 广告地址检查
   vrrp_strict                # 启用严格模式(禁止非法 VRRP 包)
   vrrp_garp_interval 0       # 禁止发送 GARP 消息
   vrrp_gna_interval 0        # 禁止发送 GNA 消息
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"  # 健康检查脚本路径
    interval 6       # 每 6 秒执行一次检查
    weight 15        # 检查成功时,只增加一次,优化级为115,失败时为priority原来值100
    fall 2           # 连续 2 次检查失败视为节点故障
    rise 1           # 成功 1 次视为节点恢复
}

vrrp_instance VI_1 {
    state MASTER     # 主节点标识
    interface ens33  # 绑定的网络接口
    virtual_router_id 51  # 虚拟路由 ID(主备必须一致)
    priority 100     # 初始优先级(主节点高于备节点)
    advert_int 1     # 心跳包发送间隔(秒)
    authentication {
        auth_type PASS  # 认证类型为密码
        auth_pass 1111  # 认证密码(主备一致)
    }
    virtual_ipaddress {
        192.168.213.6/24 dev ens33 label ens33:1  # 配置 VIP
    }
    track_script {
        chk_nginx  # 关联健康检查脚本
    }
}

当weight > 0时,检测成功时,例如优先级为priority + weight(只增加一次),其它情况为初始优先级priority

例如priorit初始为100,weight为15,多次检测成功,优先级也是115,其它情况为100

当weight < 0时,检测失败时,优先级为priority + weight(只减去一次),其它情况为为初始优先级priority

例如priorit初始为100,weight为-15,多次检测失败,优先级也是85,其它情况为100

注*:weight的取值应该比主备相减后的绝对值大,例如主100,备90,weight的取值应该为|100-90| +正数,然后取正负值都可以,数值在-254到 254之间。我取值为15

2.4.2 备节点配置
  • 仅需修改以下参数:

    复制代码
    state BACKUP    # 备节点标识
    priority 90     # 优先级低于主节点

关键参数解释

  • virtual_router_id:同一组 VRRP 实例的节点必须一致。

  • priority:决定节点成为主节点的优先级(范围 1-254)。

  • track_script:关联健康检查脚本,动态调整优先级。


2.5 健康检查脚本

文件路径:/etc/keepalived/nginx_check.sh

复制代码
#!/bin/bash
NGINX_CONTAINER_NAME="nginx1.25.3"  # 与 docker-compose 中的容器名一致
NGINX_SCRIPT_DIR="/home/nginx"  # docker-compose.yml 所在目录
WAIT_TIME=2  # 容器启动后等待时间(秒)

# 检查容器是否运行
if [[ -z $(docker ps -q -f "name=$NGINX_CONTAINER_NAME") ]]; then
    echo "Nginx 容器未运行,尝试启动..."
    cd $NGINX_SCRIPT_DIR || exit 1
    docker-compose up -d || exit 1 # 启动容器
    sleep $WAIT_TIME      # 等待容器启动

    # 再次检查容器状态
    if [[ -z $(docker ps -q -f "name=$NGINX_CONTAINER_NAME") ]]; then
        exit 1
    else
        echo "Nginx 启动成功!"
        exit 0
    fi
else
    echo "Nginx 运行正常。"
    exit 0
fi

赋予执行权限

bash

复制代码
chmod +x /etc/keepalived/nginx_check.sh

脚本逻辑解释

  1. 检查容器状态 :使用 docker ps 查询容器是否运行。

  2. 尝试恢复 :若容器未运行,切换到项目目录并执行 docker-compose up -d

  3. 二次检查 :等待 WAIT_TIME 后再次检查容器状态。

  4. 故障转移:若恢复失败,停止 Keepalived 服务,触发备节点接管 VIP。


2.6 启动 Keepalived
复制代码
systemctl start keepalived    # 启动服务
systemctl enable keepalived   # 设置开机自启
systemctl status keepalived   # 查看状态

三、验证与测试

3.1 检查 VIP 绑定
复制代码
ip addr show ens33
  • 主节点输出应包含:192.168.213.6/24

  • 备节点无此 IP(正常状态)。


3.2 测试负载均衡

通过 VIP 访问 Nginx:

复制代码
curl http://192.168.213.6:8000
  • 若返回 Nginx 页面信息,说明负载均衡生效。

3.3 模拟故障转移
  1. 停止主节点 Nginx 容器

    复制代码
    mv /home/nginx/docker-compose.yml /home/nginx/docker-compose1.yml
    docker stop nginx1.25.3

    等待6秒后再进行下面步骤

  2. 检查备节点 VIP

    复制代码
    ip addr show ens33
  3. 恢复文件检查主节点 VIP

    复制代码
    mv /home/nginx/docker-compose1.yml /home/nginx/docker-compose.yml
    
    # 等待6秒后再进行下面步骤
    ip addr show ens33

四、常见问题与注意事项

4.1 常见问题
  1. VIP 未绑定

    • 检查防火墙是否放行 VRRP 协议(IP 协议号 112)。

    • 确认 virtual_router_id 主备一致。

  2. 脚本无法启动容器

    • 确保 Docker 服务正常运行。

    • 检查 docker-compose.yml 语法是否正确。

  3. 脑裂问题

    • 确保主备节点网络通信正常,避免因网络抖动导致 VIP 冲突。
4.2 注意事项
  • 日志监控 :定期检查 /var/log/messages和容器日志。

  • 权重调整weight 参数需确保主节点优先级始终高于备节点。

  • 容器名称一致 :脚本中的容器名需与 docker-compose.yml 中定义的完全一致。


五、总结

通过本文的部署,您将获得以下能力:

  1. 高可用性:VIP 自动故障转移,服务中断时间降至秒级。

  2. 自动恢复:Nginx 容器异常时自动重启,减少人工干预。

  3. 负载均衡:Nginx 分发请求到后端服务器,提升系统吞吐量。

此架构适用于企业级生产环境,尤其适合对可用性要求较高的 Web 服务。实际部署中,可根据业务需求扩展后端服务器数量,或结合云环境优化网络配置。

相关推荐
七夜zippoe11 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64812 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满12 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠12 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥13 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey90313 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技14 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀14 小时前
Linux环境变量
linux·运维·服务器
zzzsde14 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º16 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann