定下来的事
- 许可证 MIT;一期只做 MySQL + PostgreSQL,含同构;同表双向与 UI 二期。
- 三种组合:MySQL→MySQL、PG→PG、MySQL↔PG(两个方向算一种异构)。
- 版本:**PG 10 起的每个大版本都要覆盖**;MySQL 5.7 / 8.0 / 8.4 / 9.x 四个家族。
9PG 大版本(10–18)
4MySQL 家族
169链路(全笛卡尔)
1352测试单元(×8 场景)
PostgreSQL 10–18:差异比想象中大
每一项差异都会改变同步的实现路径,不能靠"应该差不多"糊过去。
MySQL 4 个家族:语法和认证都会咬人
一个具体例子:拿 8.0 时代写死的 SHOW MASTER STATUS 去连 8.4,直接语法报错。所以连接器不能按版本号分支,只能运行时探测。
169 条链路怎么跑得起:四层矩阵
≤15 分钟PR 门禁(T1 子集 × 3 场景)
30–50 分钟nightly(≈40 链路 × 8 场景)
2–3 小时release 全量 169 链路
每周一遍全版本全覆盖
为什么不全量每 PR 跑:1352 个单元跑不起也不必要。但一个版本都不许漏——漏的那条往往就是用户的生产版本。分层让 PR 不堵、每周仍全量扫一遍。
能力探测表(不写版本号分支)
产品表现:预检写「你的 PG 12 没有磁盘保护阀,我们用告警代替自动失效」,而不是抛 max_slot_wal_keep_size is not a valid parameter。
支持档:EOL 的也测,但不假装它是主力
全支持PG 14–18、MySQL 8.0 / 8.4 / 9.x — 缺陷必修,CI 全场景
尽力支持PG 10–13、MySQL 5.7 — 仍进矩阵仍跑 nightly,但上游已不再出补丁,预检里明示「建议升级」
不支持PG ≤ 9.6(无原生 pgoutput)、MySQL ≤ 5.6、MariaDB(本期)
降级方向PG 18→17 这类只验「明确拒绝 + 人话原因」,不承诺支持
测试形态(不变的骨架)
五层单元 / 连接器契约 / 端到端 / 故障注入(kill -9、slot 被删、schema 漂移)/ 性能基线(退化 >15% 红)
影子模型对拍内存影子库 vs 目标库逐行比;schema fuzz × 操作序列 fuzz;断言最终一致 / 重放幂等 / 位点不倒退 / 不串位;失败最小化成 seed
准入制度每个连接器带 testmatrix.yaml(镜像/版本/启动参数/能力位),没有清单 PR 直接红
覆盖度报表进 READMEpostgres 10→10 … 18→18 = 9/9 ✔,空格子一眼可见,不许吹「生产级」
语料 TPC-H / northwind / sakila / 各版本官方 regression DDL —— 零本地依赖,不拿任何客户库做基准。
降级:先补偿,后拒绝
每个能力缺口按三步走:① 自动补偿(用户无感)→ ② 有代价的替代(如实标注、可开关)→ ③ 才拒绝 + 解释 + 替代路径。降级不能降正确性——补偿会让结果不一致时,宁可不做。
落在实现上是「一张表驱动」:探测能力 → 查补偿表 → 有 ① 就用 ① 并在预检记「已补偿」→ 否则问用户是否接受 ② 的代价 → 都不行才拒绝。
跨版本降级只拒绝那一张表,不拒绝整个任务。
性能指标与开销:都要能算出来
≥20k 行/s单核快照(200 B 窄行)
p99 <100 ms端到端(同机房,batch 1 ms)
<80 MB / <256 MB空转 / 增量常驻内存
<200 ms冷启动;二进制 <25 MB
怎么测:TPC-H lineitem 三档(1M / 10M / 100M 行)+ sysbench 写入压测驱动增量;延迟用「源端写 clock_timestamp() → 目标端可见时间」打点;每次 release 存基线 JSON,任一指标退化 >15% 就红。
磁盘约束 runner 只有 14 GB → matrix 让每个 job 只拉自己那个镜像,不要把 9 个 PG + 4 个 MySQL(约 6 GB)全缓存。
其余设计(v1 继承)
- 预检三级 + 定制教程;可逆准备全部前置,最后只剩「重启一次数据库」
- 垃圾清理:孤儿四条判定、默认 dry-run、租约防双跑、位点与数据同事务(幂等)
- Catalog:行数/主键/「有无稳定主键」硬提示/类型映射预览/单表覆盖;目标同名表默认报错
- 频次五档:一次性 / 初始化+实时 / 实时仅增量 / 定时增量(只要 SELECT)/ 定时全量(>500 万行拒绝)
- 内容:列/行/结构可选;DDL 只跟随四类,其余拦截暂停
- 转换:单位/时区/编码/枚举/脱敏/计算列;不做聚合、join、脚本;失败进死信表
名字候选(六个,slug 在 spencerswagger 名下均未被占用)
已定:津梁(JinLiang) —— 渡口与桥,异构两端之间那一段水路。仓库 spencerswagger/JinLiang、二进制 jinliang(短写 jl)。