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

相关推荐
知远同学2 小时前
docker学习笔记2-最佳实践
运维·docker·容器
哈哈幸运4 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
黑心老人4 小时前
Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
linux·运维·服务器·macos
光算科技4 小时前
服务器在国外国内用户访问慢会影响谷歌排名吗?
运维·服务器·c++
口嗨农民工4 小时前
ubuntu18.04启动不了修复
linux·运维·ubuntu
YUELEI1184 小时前
Centos9 安装 nginx 及配置
nginx·centos
塔能物联运维5 小时前
双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁
大数据·运维
你是我的天晴5 小时前
k8s教程4:Kubernetes中的服务发现与负载均衡
kubernetes·服务发现·负载均衡
GalaxyPokemon6 小时前
Muduo网络库实现 [十六] - HttpServer模块
linux·运维·服务器·网络
461K.6 小时前
spark与hadoop的区别
大数据·运维·hadoop·分布式·spark·intellij-idea