Why: the 2026-10-12 drill left artifact recovery failed, and the retest changed that SELF result without changing the write-traffic gate. Evidence: backup-20261013-013354 on Dev a83588dd and backend 46073d30; K1-K7 true, RPO 65s, RTO 3s, five artifacts matched and cross-user access returned 404. SELF. Impact: proposal moves to r2.3. Second-instance writes stay closed until REPLAY or CI and the second host exist. Refs: docs/records/2026-10-12-u7-ops-drill-report.md docs/proposals/2026-10-11-collaboration-storage-and-distribution.md Co-authored-by: Cursor <cursoragent@cursor.com>
6.0 KiB
U7 运维演练与数据库基线报告(SELF,2026-10-12)
来源标注:SELF(本机隔离栈执行;非 CI GATE、非独立 REPLAY)。用户 2026-10-12 决定不做容量重放。不得据此放行第二实例写流量。
1. 被测对象
| 项 | 值 |
|---|---|
| Backend gitlink | 8e509775d39d1455b69be44803037faa7af844b4 |
| B6 Dev HEAD | b2e129ab3f3bdf222f16040fcd0513872d0e2a3c |
| C4 Dev HEAD | 308f33665eb2dfaf9ae661e87df8898c3c2ecb3a |
| C5 Dev HEAD | 792574692609d9bfdf113e2dc5af6f43c9a176dd |
| 主机 | 32 逻辑 CPU,122 GiB RAM;演练开始时 load average 见各 host.txt |
| 入口 | tests/load/collaboration/run_pgbench.sh;tests/ops/run_fault_drill.sh;tests/ops/run_backup_drill.sh |
原始输出在测量 worktree 的 results/(gitignore),不入库。任务卡 evidence 为 SELF。
2. B6 pgbench
结果目录 tests/load/collaboration/results/pgbench-20261012-131948。隔离实例 u7bench,scale 100,每档 60 秒,-M prepared。max_connections=100,superuser_reserved_connections=3,100 客户端封顶为 95。六档失败事务均为 0。
| 模式 | 客户端 | tps | P50 | P95 | P99 |
|---|---|---|---|---|---|
| select-only | 10 | 535646 | 0.018 ms | 0.024 ms | 0.030 ms |
| TPC-B 类 | 10 | 18798 | 0.339 ms | 0.673 ms | 5.560 ms |
| select-only | 30 | 952115 | 0.026 ms | 0.057 ms | 0.078 ms |
| TPC-B 类 | 30 | 52224 | 0.493 ms | 1.002 ms | 1.777 ms |
| select-only | 95 | 904708 | 0.087 ms | 0.180 ms | 0.417 ms |
| TPC-B 类 | 95 | 50607 | 1.041 ms | 3.361 ms | 18.106 ms |
主机不空闲。这是数据库参考基线,没有业务阈值,也不替代容量窗口。
3. C4 断连
结果目录 tests/ops/results/fault-20261012-142734。PG 18991,应用 18990/18992,Redis 18993。
| 判据 | pg-stop | pg-kill |
|---|---|---|
| F1 有界失败、进程仍在 | 过 | 过 |
| F2 不回落 SQLite,新进程拒绝就绪 | 过 | 过 |
| F3 恢复后两侧各 5 次写入 | 过,RTO 不到 1 秒,未重启应用 | 同左 |
| F4 失败 requestId 重放恰好一条 | 过 | 过 |
| F5 dup_seq=0、seq 无洞、无非终态 run | 过 | 过 |
Redis 限额 20 次/分钟,两实例各突发 40 个读:
| 判据 | 结果 |
|---|---|
| G1 共享限额 | 放行 20、429 为 60、其他错误 0 |
| G2 断连 | 放行 40、429 为 40、其他错误 0;已确认写入仍在 |
| G3 只拉起 Redis | 放行回到 20;rl:* 均有过期时间 |
| G4 | 发现:日志看不到降级计数 |
| G5 | 发现:Redis 不通时新进程拒绝启动 |
runtime.redisAddr 没有调用者可写的产品入口。演练用 SQL 写入默认 owner local 的 user 设置,并保留 mock。
4. C5 备份与恢复
结果目录 tests/ops/results/backup-20261012-153441。源 PG 18994,恢复目标 18997。合同数据量 seed 约 12 秒。
| 判据 | 结果 |
|---|---|
| K1 备份有效 | 过。failed_count=0,archived_count=80,pg_verifybackup 与 pg_restore --list 退出码 0 |
| K2 RPO≤5 分钟 | 过。64 秒 |
| K3 RTO≤60 分钟 | 过。4 秒。恢复后登录、列项目、读会话均为 200 |
| K4 工件与权限 | FAIL。五次上传都没有拿到工件编号 |
| K5 不变量 | 过。dup_seq=0,seq 无洞;恢复后消息/事件/知识/run 计数与故障前一致(消息 1 000 120);非终态 run 为 0 |
| K6 逻辑恢复 | 过。pg_restore 退出码 0,约 4 秒;计数等于 dump 时快照(消息 1 000 000,知识 100 000) |
| K7 权限与泄密 | 过。备份目录 700、文件 600;结果文本里没有连接串。静态加密与凭据演练记 N/A。归档和数据在同一块盘,没有模拟存储全毁 |
恢复后的计数与故障前一致,说明已提交的标记都在。64 秒是最后一条成功标记的确认时间到故障时刻的间隔;窗口末尾有的写入因为会话仍被 mock run 占用而没有落库。
K4 的原因在源应用日志:未设置 BLOBSTORE_S3_ENDPOINT 时,NewS3FromEnv 返回空的 *S3。这个空指针被放进 blobstore.Store 接口后不再等于 nil,finishOpen 不会回落本地目录,上传在 blobstore.(*S3).Put 空指针 panic。产品代码未改。因此工件 sha256 和跨用户拒绝没有测成。代码里本地后端的 content_path 是绝对路径;这次没有成功上传,所以没有用恢复后的下载来核验。
同日另一次恢复(backup-20261012-150713)在数据目录复制之后起不来,因为 socket 路径超过 107 字节。正式这次把 socket 放到 /tmp/u7bk-18997。
5. 放行(2026-10-12 当时)
B6、C4 为 SELF 通过。C5 的库恢复为 SELF 通过,工件恢复失败。第二实例写流量仍不放行。
当时还没做、该任务不启动的三项:
- 独立 REPLAY,或把 C4/C5 的快速档接进 CI 成为 GATE(需要平台准入)。
- C3 双主机。
- 上传在未配置对象存储时 panic,需要单独的产品修复后才能重测 K4。
6. 2026-10-13 K4 重测
上传 panic 已在 store 边界修复:带类型的空对象存储(未设置 BLOBSTORE_S3_ENDPOINT 时的 (*S3)(nil))视为未配置,回落本地工件目录。已构造的对象存储保持不变。Backend 提交 46073d30,Dev 被测头 a83588dd,backend gitlink 同为 46073d30。
重跑入口仍是 tests/ops/run_backup_drill.sh。结果目录 tests/ops/results/backup-20261013-013354(SELF)。原始结果另存于仓外 /home/weichen/projects/u7-k4-retest-preserved-20261013。
| 判据 | 结果 |
|---|---|
| K1–K3、K5–K7 | 过。RPO 65 秒,RTO 3 秒。pg_verifybackup 与 pg_restore --list 退出码 0,逻辑恢复约 5 秒,恢复后计数与故障前一致 |
| K4 工件与权限 | 过。5 个工件 checked=5、missing=0、mismatch=0。跨用户访问项目和工件均为 404 |
content_path 仍是绝对路径,快照继续还原到原目录。静态加密、凭据演练和整盘损坏仍是 N/A。
第二实例写流量仍不放行。剩下的门槛是独立 REPLAY 或经平台准入后的 C4/C5 CI 快速档,以及 C3 双主机。