docs: record Go 1.27.1 recovery rehearsals

This commit is contained in:
2026-09-20 16:16:52 +08:00
parent bf6f904346
commit 9c46022a32
5 changed files with 21 additions and 13 deletions

View File

@@ -1,14 +1,21 @@
# P6:隔离备份恢复演练
验证日期:2026-09-19。新增 `scripts/test-backup-restore.sh`,在两个一次性 MySQL 容器之间执行逻辑备份和恢复,恢复后用只读结构核验和核心记录计数确认结果。演练不连接已有数据库,也不修改生产数据。
验证日期:2026-09-20。新增 `scripts/test-backup-restore.sh`,在两个一次性 MySQL 容器之间执行逻辑备份和恢复,恢复后用只读结构核验和核心记录计数确认结果。演练不连接已有数据库,也不修改生产数据。
## 实际命令与环境
本轮使用 Docker `golang:1.27.1` 交叉构建 macOS arm64 的当前 Orbit 二进制,再在宿主机执行脚本:
```sh
DOCKER=/usr/local/bin/docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 \
sh scripts/test-backup-restore.sh
docker run --rm -e GOOS=darwin -e GOARCH=arm64 -e CGO_ENABLED=0 -e GOWORK=off \
-v "$PWD:/workspace" -v /tmp/orbit-go127-darwin:/out \
golang:1.27.1 sh -c 'cd /workspace && go build -o /out/orbit ./cmd/orbit && go build -o /out/orbit-migrate ./cmd/orbit-migrate && go build -o /out/orbit-admin ./cmd/orbit-admin'
ORBIT_BIN=/tmp/orbit-go127-darwin/orbit ORBIT_MIGRATE_BIN=/tmp/orbit-go127-darwin/orbit-migrate ORBIT_ADMIN_BIN=/tmp/orbit-go127-darwin/orbit-admin \
ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-backup-restore.sh
```
实际运行的构建使用 Go 1.27.1 的共享缓存目录,输出为当前提交对应的 Darwin arm64 二进制;脚本自身仍只创建一次性容器和临时文件。
源库和恢复库分别使用随机 root 密码、随机映射端口和独立数据库名。源库运行当前 `bin/orbit-migrate`,再通过 `bin/orbit-admin bootstrap` 写入一个通用应用、命名空间、凭据和队列;`mysqldump --single-transaction --routines --triggers --events --hex-blob --no-tablespaces` 导出后,通过容器内 MySQL 客户端导入恢复库。退出清理两个容器和临时凭据文件。
## 实际结果
@@ -21,4 +28,4 @@ DOCKER=/usr/local/bin/docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 \
## 验收边界
本次证明同版本 MySQL 的一次逻辑备份可以恢复为可被当前二进制读取的数据库,并保持无外键结构。它没有证明备份介质持久性、备份窗口内的大库锁/IO影响、跨版本升级恢复、复制切换、跨故障域部署、生产密钥托管、外部业务副作用核对或 RPO/RTO;这些仍需目标生产拓扑中的独立演练。恢复库也没有被接入 Worker 或业务流量,避免把恢复演练误当成恢复后的生产接管证明。
本次证明 Go 1.27.1 构建的当前二进制可以读取同版本 MySQL 的逻辑恢复库,并保持无外键结构。它没有证明备份介质持久性、备份窗口内的大库锁/IO影响、跨版本升级恢复、复制切换、跨故障域部署、生产密钥托管、外部业务副作用核对或 RPO/RTO;这些仍需目标生产拓扑中的独立演练。恢复库也没有被接入 Worker 或业务流量,避免把恢复演练误当成恢复后的生产接管证明。

View File

@@ -4,12 +4,11 @@
## 实际环境与命令
环境为 macOS arm64、当前 `bin/orbit`/`bin/orbit-migrate`/`bin/orbit-admin`、Docker MySQL 8.4。脚本创建随机本地卷和端口,迁移 28 个版本,初始化一个通用命名空间和队列:
环境为 macOS arm64、Docker Go 1.27.1 交叉构建的当前 Orbit 二进制、Docker MySQL 8.4。脚本创建随机本地卷和端口,迁移 28 个版本,初始化一个通用命名空间和队列:
``@@BT@sh
DOCKER=/usr/local/bin/docker \
ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 \
sh scripts/test-db-recovery.sh
ORBIT_BIN=/tmp/orbit-go127-darwin/orbit ORBIT_MIGRATE_BIN=/tmp/orbit-go127-darwin/orbit-migrate ORBIT_ADMIN_BIN=/tmp/orbit-go127-darwin/orbit-admin \
ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-db-recovery.sh
``@@BT@
数据库容器停止并移除后,脚本在相同端口和卷上创建恢复容器;Orbit 进程保持运行。
@@ -22,7 +21,7 @@ sh scripts/test-db-recovery.sh
恢复后的任务受理使用原命名空间凭据和固定 `Idempotency-Key`,说明新数据库连接能重新通过鉴权、结构检查、权限和受理事务。脚本没有启动 Worker,因此没有把任务受理误报为业务处理完成。
脚本语法检查和文档链接检查通过;实际数据库结构继续由 `orbit-admin verify` 核对零外键。标准全量回归仍需在资源充足环境执行,不能用本次短暂中断演练替代。
Go 1.27.1 交叉构建、脚本语法检查和文档链接检查通过;实际数据库结构继续由 `orbit-admin verify` 核对零外键。标准全量回归仍需在资源充足环境执行,不能用本次短暂中断演练替代。
## 边界

View File

@@ -19,6 +19,8 @@
| Go 1.27.1 SDK 可运行示例真实服务串跑 | MySQL 8.4.10 一次性库、真实 Orbit HTTP、Worker/Weave 凭据;24 个 SDK 示例及 `orbit-exec-load`、`orbit-schedule-load`、`orbit-workflow-load` | PASS;24 个示例和 3 个负载工具均完成实际受理、执行、结果/事件/流程核对,所有负载样本 `complete=true`、`unverified=0` |
| Go 1.27.1 result-inbox 真实业务集成 | 独立接收方 MySQL 8.4.10;真实 Orbit HTTP/WSS;`go test -race -run Integration ./...`,含 COMMIT 回执丢失、进程强杀后 Inbox 接管、并发去重及事务回滚 | PASS;测试包 34.183 秒,初始化与 demo 也完成;实际业务提交后才确认 ACK,最终业务效果只保留一次 |
| Go 1.27.1 task-outbox 真实业务集成 | 独立发送方 MySQL 8.4.10;真实 Orbit HTTP;`go test -race -run Integration ./...`,含 CLI、三处 COMMIT 回执丢失、HTTP 回执丢失、发送进程强杀后租约接管、预算和错误分类 | PASS;测试包 32.964 秒,初始化与 demo 也完成;原操作键恢复为单一平台任务 |
| Go 1.27.1 备份恢复脚本 | Go 1.27.1 交叉构建 macOS arm64 二进制;`scripts/test-backup-restore.sh`;MySQL 8.4 | PASS;源/恢复核心计数均为 `1,1,1,1,28`,迁移校验完整、固定索引6个、外键0 |
| Go 1.27.1 数据库短暂不可用脚本 | Go 1.27.1 交叉构建 macOS arm64 二进制;`scripts/test-db-recovery.sh`;MySQL 8.4 同卷重启 | PASS;readiness `200 → 503 → 200`,恢复后使用原凭据成功受理任务 |
| Orbit HTTP/metrics 子进程 | 同一共享网络命名空间;`TestIntegrationMetricsProcess`;metrics 启用/禁用各一组 | PASS,3.081 秒;监听隔离、隐私、后台采样和优雅退出均通过 |
| 真实Worker执行测量 | `orbit-exec-load`;最终短/混合/中长及截止不足四组,环境及原始JSON见[测量报告](phase-6-execution-load.md) | 96+96+6项全部逐项核验,长任务18次续租;24项截止负例按预期非零退出。SDK全模块竞态/vet/build通过,生产容量未验收 |
| 真实Weave流程测量 | `orbit-workflow-load`;24/100实例、固定发布版本双分支并行及24实例截止负例,见[流程测量报告](phase-6-workflow-load.md) | 124个正常实例、248个不同任务/唯一尝试和本地调用逐项关联;负例2成功/22未核验,非零退出。重新构建并保存源码/二进制哈希,替换旧证据;生产容量未验收 |