目录
[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 核心原理
-
VRRP 协议:
-
多台服务器组成一个虚拟路由组,共享一个 VIP。
-
主节点(Master)定期发送心跳包(Advertisement),备节点(Backup)监听心跳。
-
若主节点宕机,备节点接管 VIP。
-
-
健康检查:
-
Keepalived 通过自定义脚本(如
nginx_check.sh
)监控服务状态。 -
若检测到 Nginx 容器异常,尝试重启;若重启失败,主动停止 Keepalived 服务,触发 VIP 转移。
-
二、部署步骤详解
2.1 环境准备
-
操作系统:
- Centos
-
服务器:
-
主节点:
192.168.213.3
-
备节点:
192.168.213.4
-
-
VIP :
192.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 容器
-
创建目录结构:
mkdir -p /home/nginx/{conf,html}
-
编写
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 # 容器异常退出时自动重启
-
启动容器:
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
脚本逻辑解释:
-
检查容器状态 :使用
docker ps
查询容器是否运行。 -
尝试恢复 :若容器未运行,切换到项目目录并执行
docker-compose up -d
。 -
二次检查 :等待
WAIT_TIME
后再次检查容器状态。 -
故障转移:若恢复失败,停止 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 模拟故障转移
-
停止主节点 Nginx 容器:
mv /home/nginx/docker-compose.yml /home/nginx/docker-compose1.yml docker stop nginx1.25.3
等待6秒后再进行下面步骤
-
检查备节点 VIP
ip addr show ens33
-
恢复文件检查主节点 VIP
mv /home/nginx/docker-compose1.yml /home/nginx/docker-compose.yml # 等待6秒后再进行下面步骤 ip addr show ens33
四、常见问题与注意事项
4.1 常见问题
-
VIP 未绑定:
-
检查防火墙是否放行 VRRP 协议(IP 协议号
112
)。 -
确认
virtual_router_id
主备一致。
-
-
脚本无法启动容器:
-
确保 Docker 服务正常运行。
-
检查
docker-compose.yml
语法是否正确。
-
-
脑裂问题:
- 确保主备节点网络通信正常,避免因网络抖动导致 VIP 冲突。
4.2 注意事项
-
日志监控 :定期检查
/var/log/messages
和容器日志。 -
权重调整 :
weight
参数需确保主节点优先级始终高于备节点。 -
容器名称一致 :脚本中的容器名需与
docker-compose.yml
中定义的完全一致。
五、总结
通过本文的部署,您将获得以下能力:
-
高可用性:VIP 自动故障转移,服务中断时间降至秒级。
-
自动恢复:Nginx 容器异常时自动重启,减少人工干预。
-
负载均衡:Nginx 分发请求到后端服务器,提升系统吞吐量。
此架构适用于企业级生产环境,尤其适合对可用性要求较高的 Web 服务。实际部署中,可根据业务需求扩展后端服务器数量,或结合云环境优化网络配置。