AI蓝绿部署零停机方案:从环境搭建到平滑切换全步骤
为什么AI服务需要蓝绿部署零停机
当你更新AI模型或API服务时,如果直接替换正在运行的进程,正在处理的请求就会中断。
蓝绿部署(Blue-Green Deployment)通过维护两套完全独立的生产环境(绿环境运行旧版本,蓝环境运行新版本),借助负载均衡器一键切换流量,实现零停机更新。
这套方案在AI模型服务中同样适用,只需注意模型文件、特征库等依赖的同步问题。
本文将从零带你搭建一个可落地的蓝绿部署流程。
准备条件:两个环境 + 一个入口
- 绿环境(当前生产):已在运行的AI服务,假设监听端口
5001,目录/app/green。 - 蓝环境(新版本):新部署的AI服务,监听端口
5002,目录/app/blue。 - 入口代理:使用 Nginx 作为流量网关,监听 80 端口,将请求转发到当前激活的环境。
如果你的AI服务是 Docker 容器,也可以用两个容器实例分别绑定不同端口。下方示例以主机进程部署讲解,但步骤逻辑一致。
两步完成蓝绿流量切换
1. 在蓝环境部署新版本
将新版本的AI模型、代码和依赖复制到 /app/blue,启动服务并确认监听 5002。
例如用 Python Flask 启动:
cd /app/blue
# 假设启动脚本为 run.sh,内部设置端口=5002
bash run.sh &
# 验证服务是否正常
curl http://localhost:5002/health
如果返回 200 OK,说明蓝环境已经就绪。
2. 修改Nginx配置并重载
当前 Nginx 配置文件(/etc/nginx/conf.d/ai_service.conf)内容如下(指向绿环境):
upstream ai_backend {
server 127.0.0.1:5001; # 绿环境(旧)
}
server {
listen 80;
location / {
proxy_pass http://ai_backend;
proxy_set_header Host $host;
}
}
现在将 server 行改为指向蓝环境(端口5002):
upstream ai_backend {
server 127.0.0.1:5002; # 蓝环境(新)
}
执行重载(不会中断现有连接):
nginx -s reload
随后所有新请求都会流向蓝环境。
绿环境仍然运行,可随时通过切换回 5001 实现回滚。
避坑指南:这些细节容易出事
- 数据库或模型缓存:如果AI服务依赖在线特征库或数据库,切换后新版本必须使用相同的数据源,否则可能产生不一致。建议在蓝环境部署前先做数据迁移验证。
- 会话保持:如果你的AI服务有状态(如用户会话),蓝绿切换会导致会话丢失。建议将状态外置到Redis,或者采用灰度切换(逐步增加蓝环境权重)配合
ip_hash。 - 端口冲突:确保蓝环境的端口未被其他进程占用。使用
lsof -i :5002提前检查。 - Nginx重载失败:执行
nginx -t先测试配置语法,再重载。
如何验证零停机效果
切换完成后,用持续请求测试:
# 在另一个终端持续发起请求
while true; do
curl -s -o /dev/null -w "%{http_code}\n" http://your-domain/predict
sleep 0.5
done
正常情况应一直返回 200。
你也可以观察响应时间:
curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" http://your-domain/predict
若切换瞬间出现 502 或响应时间突增,
说明 Nginx 重载时存量连接处理不当,
可尝试 proxy_set_header Connection '' 或使用 http: 直接指向单个端口。
//127.0.0.1:
5002
高频问题解答
Q:蓝绿部署需要多少服务器?
A:最少一台服务器即可,用不同端口区分环境。如果考虑故障隔离,建议两台服务器分别运行绿环境和蓝环境。
Q:切换后发现新版本有Bug怎么回滚?
A:只需将 Nginx 配置文件中的 upstream 改回绿环境端口(5001),然后 nginx -s reload,所有请求立即切回旧版本。
Q:AI模型训练文件很大,同步到蓝环境太慢怎么办?
A:可以在绿环境单独准备一个存储目录,蓝环境通过软连接或共享存储(NFS)直接引用,减少复制耗时。
如果你正在处理AI蓝绿部署零停机的落地问题,建议先把本文步骤在自己的测试环境演练一遍,再上生产。
遇到异常时,优先检查Nginx配置语法、端口监听状态和环境依赖是否一致。