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

相关推荐
奔跑吧邓邓子19 分钟前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
努力的小T23 分钟前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
枫叶落雨2222 小时前
08-Elasticsearch
运维·jenkins
爆更小小刘3 小时前
Linux下基本指令(4)
linux·运维·服务器
我码玄黄3 小时前
解决本地模拟IP的DHCP冲突问题
linux·运维
若云止水3 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数
运维·nginx
Self-Discipline3 小时前
Linux arm64 IOMMU总结
linux·运维·服务器
我言秋日胜春朝★3 小时前
【Linux】命名管道------Linux进程间通信的桥梁
linux·运维·服务器
Dontla3 小时前
华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)
运维·服务器·chrome
wenchun0014 小时前
【并发压测】高并发下Linux流量监控
linux·运维·服务器