test: rehearse MySQL GTID manual promotion
This commit is contained in:
37
docs/reports/phase-6-mysql-replication.md
Normal file
37
docs/reports/phase-6-mysql-replication.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# P6:MySQL GTID 复制与手工提升演练
|
||||
|
||||
验证日期:2026-09-20。新增 `scripts/test-mysql-replication.sh`,在两个一次性 MySQL 8.4 容器中使用原生 GTID 复制,先由源库承载真实 Orbit HTTP 受理,再停止源库、提升副本并用原幂等键重放请求。演练不连接已有数据库,也不修改生产数据。
|
||||
|
||||
## 实际环境与命令
|
||||
|
||||
使用 Docker `golang:1.27.1` 交叉构建 macOS arm64 的当前 `orbit`、`orbit-migrate` 和 `orbit-admin`,随后在宿主机执行:
|
||||
|
||||
```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-mysql-replication.sh
|
||||
```
|
||||
|
||||
脚本使用普通 Docker bridge 映射宿主机端口,避免 Docker Desktop 的 host network 只对容器可见;副本通过源容器 IP 和内部 3306 端口连接。两个数据库均启用 `gtid_mode=ON`、`enforce_gtid_consistency=ON`、行格式 binlog 和独立 `server_id`。源库和副本均随机生成密码,副本提升前保持 `read_only`/`super_read_only`。
|
||||
|
||||
## 实际结果
|
||||
|
||||
```json
|
||||
{"replication_io_sql":"Yes:Yes","replicated_task_rows":1,"source_stopped":true,"manual_promotion_verified":true,"idempotent_replay_same_task":true,"automatic_failover":false}
|
||||
```
|
||||
|
||||
真实步骤包括:
|
||||
|
||||
1. 迁移源库并签发通用应用凭据;
|
||||
2. 对源库执行带 GTID 的逻辑基线导入副本;
|
||||
3. 建立复制并核对 `Replica_IO_Running=Yes`、`Replica_SQL_Running=Yes`;
|
||||
4. 通过源库上的 Orbit HTTP 提交任务,确认副本收到任务记录;
|
||||
5. 停止源库,停止复制并提升副本为可写;
|
||||
6. 用原凭据和原幂等键启动 Orbit,重放后返回同一个任务身份;
|
||||
7. 用 `orbit-admin verify` 核对提升后的迁移版本、固定索引和零外键。
|
||||
|
||||
## 边界
|
||||
|
||||
这次演练证明 MySQL 原生 GTID 复制、手工提升、Orbit 重新连接和幂等重放可以在隔离拓扑中工作;它不提供自动故障探测、虚拟 IP、代理路由或零停机切换。没有测量复制延迟上限、网络分区、双主写入、磁盘损坏、跨故障域、备份介质、RPO/RTO 或生产容量。上线前仍需在批准的 MySQL 主从/集群拓扑中确定切换执行人、读写路由、复制确认、恢复点和恢复时间,并完成业务副作用核对。
|
||||
@@ -21,6 +21,7 @@
|
||||
| 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`,恢复后使用原凭据成功受理任务 |
|
||||
| Go 1.27.1 MySQL GTID 复制与手工提升 | 两个一次性 MySQL 8.4 bridge 容器;真实 Orbit HTTP;`scripts/test-mysql-replication.sh` | PASS;复制 IO/SQL 均为 `Yes`,任务记录复制到副本,源库停止后手工提升、结构核验和原幂等键重放通过;自动切换未验证 |
|
||||
| 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未核验,非零退出。重新构建并保存源码/二进制哈希,替换旧证据;生产容量未验收 |
|
||||
@@ -34,7 +35,7 @@
|
||||
|
||||
此前使用容器网络别名运行存储集成时,两组 COMMIT 故障测试曾因自身 `127.0.0.1` 明文连接前置条件被拒绝;本轮已改用共享网络命名空间单独复跑并通过,因此不再把它们列为未验证场景。共享网络命名空间只解决测试进程的 loopback 观察条件,不改变生产部署约束。
|
||||
|
||||
当前已完成仓库声明 Go 1.27.1 下的模块级门禁、MySQL 存储集成、关键 SDK/Orbit 进程故障组、24 个可运行 SDK 示例的真实服务串跑,以及 result-inbox/task-outbox 两个独立业务模块的真实 MySQL/HTTP/进程故障集成;SDK/服务端跨标签矩阵仍未完成。新增长期积压和慢消费者样本见[报告](phase-6-backlog.md)与[慢消费者报告](phase-6-slow-consumer.md),仍未升级为生产容量结论。此前 Docker Go 1.25 共享网络结果作为历史对照保留,不替代 Go 1.27.1 集成回归、目标拓扑和版本兼容门禁。
|
||||
当前已完成仓库声明 Go 1.27.1 下的模块级门禁、MySQL 存储集成、关键 SDK/Orbit 进程故障组、24 个可运行 SDK 示例的真实服务串跑、两个独立业务模块的真实 MySQL/HTTP/进程故障集成,以及隔离 MySQL GTID 复制和手工提升演练;SDK/服务端跨标签矩阵仍未完成。新增长期积压和慢消费者样本见[报告](phase-6-backlog.md)与[慢消费者报告](phase-6-slow-consumer.md),仍未升级为生产容量结论。此前 Docker Go 1.25 共享网络结果作为历史对照保留,不替代 Go 1.27.1 集成回归、目标拓扑和版本兼容门禁。
|
||||
|
||||
历史 macOS arm64 + Go 1.27.1 + loopback MySQL 的完整切点记录见[故障边界报告](phase-6-fault-boundaries.md);该记录与本轮 Go 1.27.1 模块门禁互相独立,仍不能替代声明工具链下的无过滤 MySQL 集成复跑。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user