升级与回滚
升级前检查清单与自动体检、单实例与集群的升级顺序、迁移失败处置、升级后验证和回滚步骤。
概述
本文给出「升级前要知道什么、按什么顺序做」。回滚完全依赖备份,请先阅读 备份与恢复。适用部署:Docker Compose、原生包(Linux / systemd)、多实例集群(PostgreSQL 族 / MySQL 族元数据库)和内置 H2 单机。
三条硬约束
- 元数据库迁移不可逆:升级后不能用旧版本程序直接启动旧库。
- 回滚 = 恢复库 + 数据目录 + 连接密钥,三者成对,缺一不可。不要「只换回旧 jar、不恢复库」,也不要让旧版本实例继续连已迁移的新库。
- 没有自动回滚,也没有自动滚动升级:逐台替换、摘挂负载均衡、是否回滚都由人决定。
升级前检查清单
缺一项不要开始升级。
| 检查 | 方法 | 通过标准 |
|---|---|---|
| 目标版本与变更 | 版本更新说明 | 明确版本号;读完「升级注意」;确认没有需要手工执行的额外步骤 |
| 当前版本 / schema | curl -s http://127.0.0.1:18680/api/health |
记录 version 与 schemaVersion |
| 备份已完成并通过校验 | tools/backup.sh …,再 tools/restore.sh --verify |
输出「校验通过」;记录备份路径与 manifest.sha256 |
| 连接密钥可获取 | FDL_CONNECTION_SECRET_KEY 或 data/datalink.properties |
与备份同批归档,确认有人能取到 |
| 磁盘余量 | df -h(元数据库、数据目录) |
迁移与旧备份之后仍有余量(建议不低于 30%) |
| 集群体检 | /api/health/ready、GET /api/ops/cluster |
所有实例 ready;无正在进行的对账 / 重采;调度租约正常 |
| 运行中的作业 | 运行记录、管道、实时任务 | 已排空或确认可中断;升级窗口内不发布新任务 |
| 维护窗口与通知 | 变更单 | 通知使用方;明确回滚决策人与最晚回滚时间 |
| 升级包完整性 | 原生包 .sha256;镜像 digest |
校验和 / 摘要与发布物一致 |
| 反向代理与 Origin | .env 与部署配置 |
HTTPS 在反向代理终止时,已设置 FDL_TRUSTED_PROXIES 或 FDL_HTTP_ALLOWED_ORIGINS,代理转发 X-Forwarded-Proto/Host/For;否则升级后登录、保存等请求会返回 403 |
自动体检脚本
tools/preupgrade-check.sh 把能自动判定的项跑一遍(只读:不修改文件、不重启服务、不执行 SQL);--dry-run 只打印计划:
tools/preupgrade-check.sh \
--url http://127.0.0.1:18680 \
--data-dir /opt/sight-datalink/data \
--backup-dir /backup/datalink \
[--db-url 'jdbc:postgresql://db:5432/datalink'] [--cluster]
输出 [PASS] 通过、[WARN] 需人工确认、[FAIL] 必须修复后再升级;末尾给出 PASS / WARN / FAIL 计数,FAIL 大于 0 时退出码为 1,可直接作为变更流水线的门禁。
version/schemaVersion只对本机回环调用返回。从宿主机经发布端口访问 Docker 实例时通常拿不到,请在容器内获取:docker compose exec -T app sh -c 'curl -s http://127.0.0.1:18680/api/health'。- 脚本不检查运行中的作业、维护窗口、回滚决策人与升级包校验和,这些仍需人工确认。
- 多实例请每台都跑一次并加
--cluster。
提示:正式升级前,建议先在预发环境用同版本的备份演练一次「升级 + 回滚」。
升级顺序
Docker Compose(单实例)
- 备份(见 备份与恢复),记录
manifest.sha256。 - 拉取或构建新镜像,记录 digest。
docker compose up -d重建容器。- 按下文「升级后验证」检查。
默认 stop_grace_period 为 10 秒。有大查询在跑时,先在界面停止运行再升级;被强杀的运行会进入「中断 / 提交未知」状态,恢复后需人工确认(不会重复提交,但不会自动续跑)。
原生包(systemd)
解压新 ZIP 到临时目录 → 停服务 → 备份旧 jar 与脚本 → 覆盖 sight-datalink.jar 与 *.sh(data/ 原样保留)→ systemctl restart sight-datalink → 验证。sudo ./install.sh 也可完成脚本与服务单元更新(会重启服务)。
多实例集群
不要让多台新实例同时抢着迁移:
- 从负载均衡摘掉一台,先升级它,其余实例保持旧版本继续服务。
- 这台实例启动时执行数据库迁移。等日志出现
Started DFDataLinkBackendApplication,/api/health/ready返回 200,且schemaVersion升到目标版本。 - 在它上面做「升级后验证」,无异常后挂回负载均衡。
- 逐台替换其余实例,一次一台,替换后立刻校验
ready再动下一台。 - 全部替换完成后统一验证,
GET /api/ops/cluster确认成员版本一致、无实例反复重启。
迁移失败、实例反复重启或冒烟不通过时:立即停止替换其他实例,保留日志和 /api/health 输出,按下文「回滚」决策。
内置 H2(单机小规模)
迁移在同一 JVM 内执行。升级前仍必须停服务完成文件级备份;H2 不能多实例,也不要让 data/ 目录被两个进程共用。
迁移失败与启动异常
| 现象 | 含义 | 处置 |
|---|---|---|
日志 Found more than one migration with version … |
迁移脚本版本冲突 | 不要反复重启,换修复版本或按发布说明处理 |
MigrateException / SQL 语法错误 |
迁移在当前库族上失败 | 记录失败版本与 SQL,停止升级并保留日志,评估修复版或回滚 |
/api/health 长时间为 waiting 模式 |
元数据库连不上(不是迁移失败) | 检查 DB_URL、网络、账号;修好后 POST /api/bootstrap/retry,无需回滚 |
Schema-validation: missing column |
程序与库结构不一致 | 迁移没走完或 jar 版本不匹配;不要手工改表掩盖 |
| 实例反复重启(systemd) | 启动失败加自动重启 | journalctl -u sight-datalink -n 200 查看第一个异常;必要时 systemctl stop 后回滚 |
升级后验证
GET /api/health返回 200 且schemaVersion等于目标版本;GET /api/health/ready返回 200。- 登录正常(本地账号与外部登录各一人)。
- 任务、管道、实时任务、数据服务列表可读;打开一个流程任务画布正常渲染。
- 手动跑一个轻量任务成功,运行日志与追踪 ID 正常。
- 数据源「测试连接」通过(证明连接密钥仍可解密);受管文件与驱动目录可读。
GET /api/system/actuator/prometheus能抓取且有新指标,见 监控、告警与审计。- 平台日志出现本次操作审计。
- 发布 / 回滚一个任务版本,确认权限与版本冲突语义未变。
- 无实例处于非 ready 状态、无反复重启;
GET /api/ops/cluster成员版本一致。
回滚
触发回滚的条件(任一满足,且在维护窗口内):迁移失败且没有修复版本;升级后核心链路(登录、任务执行、数据源连接)不可用超过 15 分钟;数据正确性存疑(重复或丢失);安全修复引入阻塞问题。
回滚必须成对恢复:
- 停全部实例(集群:每台
systemctl stop/docker compose stop)。 - 恢复元数据库、数据目录和连接密钥(旧数据目录会被保留):
tools/restore.sh --dir '<升级前的备份目录>' --db-url '<DB_URL>' \ --data-dir /opt/sight-datalink/data --yes - 换回与备份同版本的程序(jar 或镜像 digest)。
- 启动并按「升级后验证」检查,确认版本号与
schemaVersion回到备份时的值。 - 负载均衡 / DNS 切回,通知使用方,在变更单记录恢复的备份 hash、时间与实际 RTO。
回滚期间,新版本产生的数据会随恢复丢失(以备份点为准)。升级后已有业务写入时,回滚前先评估丢失量是否可接受,或改为向前修复。多实例回滚要全部回到同一版本,不能混跑。
已知边界
- 没有「原地降级」工具,回滚只能恢复库。
- 升级前自动备份与校验没有内置到发布物中,请按本文和
tools/backup.sh手工执行。 - 集群没有自动滚动升级编排,逐台替换与摘挂负载均衡由部署方完成。
- 迁移失败后的半迁移库需要人工判断后恢复,不提供 repair 封装。
- 告警规则与 Grafana 仪表盘是示例资产,接入通知渠道由部署方配置。
变更记录模板
变更单: 升级人 / 复核人:
当前版本 → 目标版本:
备份目录 / manifest.sha256: 备份校验:通过/失败
升级开始/结束: 实际耗时:
单实例迁移实例: 其余实例替换顺序:
验证 1–9: 1☐ 2☐ 3☐ 4☐ 5☐ 6☐ 7☐ 8☐ 9☐
异常与处置:
是否回滚:是/否 回滚原因: 实际 RTO:
后续改进项: