当前位置: 首页 > article >正文

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

目录

一、架构与原理

1.1 高可用架构设计

1.2 核心原理

二、部署步骤详解

2.1 环境准备

2.2 安装 Docker 与 Docker Compose

2.3 部署 Nginx 容器

2.3 安装Keepalived

2.4 配置 Keepalived

2.4.1 主节点配置

2.4.2 备节点配置

2.5 健康检查脚本

2.6 启动 Keepalived

三、验证与测试

3.1 检查 VIP 绑定

3.2 测试负载均衡

3.3 模拟故障转移

四、常见问题与注意事项

4.1 常见问题

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 服务。实际部署中,可根据业务需求扩展后端服务器数量,或结合云环境优化网络配置。


      http://www.kler.cn/a/549290.html

      相关文章:

    1. 低代码组态软件-BY组态
    2. nodejs 038: Js Worker线程消息传递 Worker.postMessage() Worker.postMessage()
    3. 图像生成GAN和风格迁移
    4. mysql读写分离与proxysql的结合
    5. FOT(Forest-of-Thought):增强大型语言模型推理能力的新框架
    6. Docker安装Kafka(不依赖ZooKeeper)
    7. 【Linux】Ubuntu Linux 系统 ——PHP开发环境
    8. Netty的基本架构详解
    9. 【第12章:深度学习与伦理、隐私—12.1 AI伦理原则与偏见检测的方法与实践】
    10. 第437场周赛:找出长度为 K 的特殊子字符串、吃披萨、选择 K 个互不重叠的特殊子字符串、最长 V 形对角线段的长度
    11. 应用分层、三层架构和MVC架构
    12. 微信小程序的请求函数封装(ts版本,uniapp开发)
    13. Deep seek学习日记1
    14. 8. Docker 常规安装简介(安装 Tomcat ,安装 MySQL,安装Redis 同时指定安装的版本)
    15. WebMvcConfigurer 介绍
    16. 有关计算机的英语单词、短语、句子
    17. Python 文本探秘:正则表达式的易错迷宫穿越 -- 7. 正则表达式
    18. Redis初阶笔记
    19. Qt的QListWidget样式设置
    20. Unity中如何判断URL是否为RTSP或RTMP流