引言
产品版本
本文档对应的产品版本为 ZStack API Router preview。
读者对象
本文档介绍 ZStack API Router 的升级准备、升级操作、验证和回滚方法,主要适用于以下读者:
- 部署运维工程师。
- 平台管理员。
- 技术支持工程师。
- 负责生产变更和灰度发布的实施人员。
升级概述
ZStack API Router 升级可能影响控制面、数据面、后台任务组件(worker)、控制台和数据库结构。升级前请先确认升级范围、业务窗口、备份状态和回滚路径。
升级范围
| 升级对象 | 影响说明 |
|---|---|
| 控制面 | 影响渠道、模型、令牌、组织、配额、审计等管理操作。 |
| 数据面 | 影响 /v1/* 和 /openai/v1/* 模型调用。 |
| 后台任务组件 | 影响渠道健康探测和模型同步。 |
| 控制台 | 影响控制台页面访问和操作体验。 |
| 数据库迁移 | 影响 PostgreSQL 数据库结构和元数据。 |
| 入口代理 | 影响域名、TLS、灰度分流和路径转发。 |
升级窗口
| 场景 | 是否建议停机 | 说明 |
|---|---|---|
| 单节点部署 | 建议安排维护窗口 | 升级期间数据面请求可能短暂失败。 |
| 多实例生产部署 | 可灰度升级 | 需入口层支持流量摘除和恢复。 |
| 控制台单独升级 | 通常不影响数据面 | 可通过稳定目录和灰度目录逐步切换。 |
| 数据库迁移 | 必须安排维护窗口 | 数据库迁移执行期间禁止并发执行多个版本升级。 |
| 旧库迁移 | 必须安排迁移窗口 | 迁移前需完成演练导入、备份和数据校验。 |
重要限制
升级前请阅读以下注意事项:
- PostgreSQL 数据库迁移(migration)只能前进式追加,不要修改已应用的迁移文件。
- 如果升级仅涉及入口代理、控制台或应用进程,通常可以应用层回滚。
- 如果新版本已经执行数据库迁移,应用层回滚不一定足够,必要时必须恢复数据库备份。
- 如果旧库迁移已写入目标库,回滚前需要明确目标库是否允许清空或恢复。
- 生产环境异常时,优先回滚入口层,其次回滚应用层,最后才恢复数据库。
- 升级过程中如出现持续 5xx、配额异常、用量日志异常或数据面不可用,应暂停升级并进入回滚流程。
数据库恢复会覆盖升级后产生的数据。恢复前请确认是否需要导出升级窗口内的新用量日志和审计日志。
适用边界
| 场景 | 适用方式 |
|---|---|
| 普通版本升级 | 按本文的备份、停服务、执行数据库迁移、启动和验证流程操作。 |
| 控制台升级 | 仅替换静态资源,必要时重启读取静态目录的服务。 |
| LobsterPool 灰度 | 通过入口层将部分 /openai/v1/* 流量切到新版本。 |
| 旧库迁移 | 使用迁移工具执行预检查、备份、演练导入、正式导入和数据校验。 |
| 紧急修复 | 可优先在入口层切换到稳定路径,再处理应用进程。 |
升级前检查
检查当前版本
记录当前版本、镜像、配置和入口信息:
docker images | grep zstack-router
docker compose ps
如使用 systemd:
systemctl status zstack-router
systemctl cat zstack-router
记录当前环境变量:
printenv | grep '^ZR_' | sort
检查服务状态
curl -fsS http://{ROUTER_HOST}:3080/healthz
curl -fsS http://{ROUTER_HOST}:3080/readyz
curl -fsS http://{ROUTER_HOST}:3080/metrics
检查近期请求状态:
select status, count(*) as requests, max(created_at) as last_seen
from zr_usage_logs
where created_at >= now() - interval '30 minutes'
group by status
order by last_seen desc;
检查变更内容
升级前请确认:
- 是否包含数据库迁移。
- 是否变更控制面 API。
- 是否变更
/v1/*或/openai/v1/*数据面行为。 - 是否需要同步控制台。
- 是否需要调整环境变量。
- 是否需要更新 Nginx 或 Ingress 配置。
检查备份条件
升级前必须准备:
| 备份对象 | 要求 |
|---|---|
| PostgreSQL | 可恢复的升级前备份。 |
| 环境变量文件 | 包含当前 ZR_* 配置。 |
| 镜像或二进制 | 保留旧版本,用于应用层回滚。 |
| 控制台静态目录 | 保留旧版本目录或软链。 |
| 入口代理配置 | 保留 Nginx、Ingress 或负载均衡配置。 |
备份
备份数据库
pg_dump "$ZR_DATABASE_URL" > zstack-router-$(date +%Y%m%d%H%M%S).sql
Docker Compose 环境可执行:
docker compose exec postgres pg_dump -U zstack_router zstack_router > zstack-router-$(date +%Y%m%d%H%M%S).sql
备份部署目录
tar -czf zstack-router-deploy-$(date +%Y%m%d%H%M%S).tar.gz /opt/zstack-router
备份入口配置
cp /etc/nginx/conf.d/zstack-router.conf /etc/nginx/conf.d/zstack-router.conf.$(date +%Y%m%d%H%M%S).bak
nginx -t
验证备份
| 检查项 | 说明 |
|---|---|
| 备份文件大小 | 备份文件不应为空。 |
| 存储位置 | 备份应放在独立磁盘或远端备份位置。 |
| 恢复命令 | 升级前应明确恢复命令和负责人。 |
| 权限 | 备份文件包含敏感数据,应限制访问权限。 |
单节点升级
适用场景
适用于试用、小规模环境或单实例生产环境。
前提条件
- 已完成数据库和部署目录备份。
- 已获取新版本镜像或二进制。
- 已安排维护窗口。
操作步骤
- 停止后台任务组件:
docker compose stop zr-worker
- 停止主服务:
docker compose stop zr-server
- 加载或拉取新镜像:
docker compose pull
离线环境使用:
docker load -i zstack-router-image.tar
- 执行数据库迁移:
docker compose run --rm zr-server zr-migrate
- 启动主服务:
docker compose up -d zr-server
- 启动后台任务组件:
docker compose up -d zr-worker
验证方式
docker compose ps
curl -fsS http://{ROUTER_HOST}:3080/healthz
curl -fsS http://{ROUTER_HOST}:3080/readyz
发起一次模型调用,并确认 用量日志 中产生记录。
生产灰度升级
适用场景
适用于多实例生产环境,或通过 Nginx、Ingress、负载均衡控制流量的环境。
前提条件
- 入口层支持摘除和恢复实例。
- 新旧版本可并行运行。
- 已准备监控指标和回滚入口。
操作步骤
- 将一台实例从入口层摘除。
- 在该实例上执行升级。
- 验证
/healthz、/readyz、/metrics和数据面调用。 - 将少量流量切入新实例。
- 观察成功率、延迟、上游错误、用量日志和审计日志。
- 无异常后逐步扩大流量。
- 全部实例升级完成后,保留旧版本备份直到观察期结束。
验证方式
| 验证项 | 方法 |
|---|---|
| 数据面成功率 | 查看监控和用量日志。 |
| 首个输出 Token 延迟 | 查看指标系统或流式调用结果。 |
| 配额扣减 | 对测试令牌发起调用并确认额度变化。 |
| 后台任务组件 | 执行一次模型同步或健康探测。 |
| 审计 | 执行一次测试管理操作并查看审计日志。 |
注意事项
- 灰度期间建议在入口层增加标识响应头,便于判断流量命中版本。
- 如发生异常,优先将入口流量切回旧版本。
- 如果新版本已执行不兼容的数据库迁移,应停止扩大灰度并评估数据库回滚。
控制台升级
适用场景
仅升级控制台静态资源,不变更数据面和数据库。
操作步骤
- 上传新控制台资源到独立发布目录(release directory)。
- 将灰度目录软链指向新目录。
- 使用测试用户访问灰度控制台。
- 验证登录、渠道管理、模型管理、令牌管理、日志查询等页面。
- 验证通过后,将稳定版本软链(stable symlink)切到新目录。
目录示例:
/data/www/zstack-router/releases/ui-20260622-1/
/data/www/zstack-router/releases/ui-20260622-2/
/data/www/zstack-router/ui-stable -> /data/www/zstack-router/releases/ui-20260622-1
/data/www/zstack-router/ui-gray -> /data/www/zstack-router/releases/ui-20260622-2
回滚方式
如果只发生控制台问题,将稳定目录或灰度目录软链切回旧目录即可。不要优先重启数据面服务。
旧库迁移
适用场景
当需要从旧版 AI Studio 或历史版本 ZStack API Router 数据库迁移到新版 ZStack API Router 时使用。
操作步骤
- 准备源库只读账号。
- 准备目标库并执行新版本数据库迁移。
- 执行预检查和演练导入。
- 在迁移窗口执行正式导入。
- 校验用户、组织、令牌、渠道、模型、路由策略、计费配置、用量日志和审计日志。
- 切换入口流量。
迁移前应输出预检查结果,至少包含源库连接状态、目标库连接状态、可迁移对象数量、异常对象数量和预计迁移耗时。
注意事项
- 演练导入通过后再执行正式导入。
- 目标库已有数据时,必须明确是否允许覆盖或合并。
- 迁移失败后不要反复执行正式导入,应先分析失败原因和目标库状态。
升级后验证
升级完成后请执行以下验证:
| 验证项 | 预期结果 |
|---|---|
/healthz | 返回成功。 |
/readyz | 返回 ready。 |
/metrics | 指标可采集。 |
| 控制台 | 可登录并查看主要资源。 |
| API Key | 可正常调用模型。 |
| 渠道 | 关键渠道健康状态正常。 |
| 用量日志 | 新请求能写入用量日志。 |
| 审计日志 | 管理操作能写入审计日志。 |
| 后台任务组件 | 模型同步和健康探测正常。 |
调用验证示例:
curl http://{ROUTER_HOST}:3080/v1/chat/completions \
-H "Authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": "upgrade validation"
}
]
}'
回滚
回滚原则
升级失败时,按以下顺序处理:
- 入口层回滚。 将流量切回旧版本或稳定路径。
- 应用层回滚。 恢复旧镜像、旧二进制或旧控制台静态资源目录。
- 数据库恢复。 仅当数据库迁移或数据写入导致无法通过应用层恢复时执行。
入口层回滚
适用于灰度异常、少量实例异常、数据面 5xx 增多等场景。
nginx -t
systemctl reload nginx
应用层回滚
适用于未执行数据库迁移,或数据库迁移与旧版本兼容的场景。
docker compose stop zr-worker
docker compose stop zr-server
docker load -i zstack-router-old-image.tar
docker compose up -d zr-server
docker compose up -d zr-worker
数据库恢复
适用于数据库迁移后旧版本无法读取数据库,或迁移数据异常且无法修复的场景。
psql "$ZR_DATABASE_URL" < zstack-router-backup.sql
数据库恢复会回退升级窗口内产生的数据。执行前请确认是否需要保留这段时间内的用量日志和审计日志。
常见问题
升级后 /readyz 失败
可能原因:
- 数据库连接失败。
- 数据库迁移未执行或执行失败。
- 新版本环境变量缺失。
处理方法:
- 检查
ZR_DATABASE_URL。 - 查看
zr-server日志。 - 检查数据库迁移执行记录。
升级后模型调用失败
可能原因:
- 路由策略指向不可用渠道。
- 渠道模型未同步。
- 上游地址或凭证变化。
处理方法:
- 查看用量日志中的错误状态。
- 检查渠道健康状态。
- 执行后台任务组件同步模型。
升级后控制台正常但调用失败
处理方法:
- 确认控制台入口和数据面入口是否指向同一版本。
- 检查
/v1/*路径代理。 - 使用 cURL 直接调用后端地址验证。
升级记录模板
| 字段 | 内容 |
|---|---|
| 升级时间 | 记录开始和结束时间。 |
| 执行人 | 记录操作人和复核人。 |
| 原版本 | 记录镜像标签(tag)、二进制版本或部署包名称。 |
| 目标版本 | 记录目标镜像标签(tag)、二进制版本或部署包名称。 |
| 升级范围 | 控制面、数据面、后台任务组件、控制台、数据库、入口代理。 |
| 备份位置 | 数据库、部署目录和入口配置备份路径。 |
| 风险确认 | 数据库迁移、停机窗口、回滚边界。 |
| 验证结果 | 健康检查、模型调用、日志、审计、指标。 |
| 回滚方案 | 入口层、应用层、数据库恢复负责人和命令。 |
