特性描述
对于 MySQL 这种 OLTP 型数据库同步数据时,如果一个事务涉及了多行数据或者是多个表的数据的操作时,原生 ClickHouse(MaterializedMySQL)不支持事务的原子可见,可能出现幻读等异常数据。
TDSQL-H LibraDB 的 MVCC 版本针对该问题进行了优化,对于从 MySQL 这种 OLTP 型数据库同步,一个事务的变更数据在 TDSQL-H LibraDB 的多个分片、多个分区上都是原子可见的,保证的数据的严格一致。 即 LibraDB 的 CDC 任务保证了源端数据库事务的最终一致性。
使用限制
仅 TDSQL-H LibraDB 的 MVCC 版本支持。
前提条件
已创建上线 MVCC 版本的 TDSQL-H LibraDB 实例。
已创建 CDC 任务,同步类型为表结构+全量数据+增量数据。
使用说明
同一批删除多行数据,非 MVCC 版本不支持数据的原子可见,MVCC 版本数据原子可见。多个表的原子可见与同一批删除多行数据原理类似。 在 CDC 任务目标端(即 TDSQL-H LibraDB)查询非 MVCC 版本和 MVCC 版本同步的数据。
下文以同一批删除多行数据为例。
非 MVCC 版本:
1.1 查询 t3 表中的数据。
select * from t3;# 返回结果Query id: 5312f276-027e-44cc-9ff3-7e3aa752705d┌─id─┬─name─┬─birth───────────────┬─_sign─┬─_version─┐│ 1 │ dd │ 2022-06-21 14:29:08 │ 1 │ 5295 ││ 2 │ cc │ 2022-06-22 14:29:22 │ 1 │ 5296 ││ 4 │ xx │ 2022-06-24 14:29:49 │ 1 │ 5298 ││ 8 │ tt │ 2022-06-23 14:29:34 │ 1 │ 5297 │└────┴──────┴─────────────────────┴───────┴──────────┘4 rows in set. Elapsed: 0.002 sec.
1.2 在 CDC 任务源端同时删除 id=1、id=2、id=4 的数据后,并且迅速在目的端 TDSQL-H LibraDB 中查询数据。因为不支持数据的原子可见性,故可能返回删除过程中的任意中间状态。
# 返回结果示例SELECT count(*) AS cnt FROM t3 FINAL WHERE _sign > 0;Query id: f7dba001-a0cc-41f7-bdfa-04b9eec12e0a┌─cnt─┐│ 2 │└─────┘7 rows in set. Elapsed: 0.003 sec.
在短时间内,上述查询结果可能是 4、3、2、1 中的任意值(部分数据没有完全同步),但最终查询结果为 1(所有数据均已同步至目标端,并且可见)。
MVCC 版本:
1.1 查询 t5 表中的数据。
# 返回结果SELECT count(*) AS cnt FROM t5Query id: 95cdaac0-31ee-41ef-a6dc-b58208dbb8c4┌─cnt─┐│ 4 │└─────┘1 rows in set. Elapsed: 0.004 sec.
1.2 在 CDC 任务源端同时删除 id=1、id=2、id=4 的数据后,在目的端 TDSQL-H LibraDB 中查询数据,数据严格实时一致(事务中所有变更同时生效)。
select count(*) as cnt from t5;# 返回结果Query id: 6420d6a8-5ae6-407e-a080-f706a4509a16┌─cnt─┐│ 1 │└─────┘1 rows in set. Elapsed: 0.004 sec.
因为数据严格实时一致,故查询结果只可能是4(所有数据均未同步到目标端)或者是1(所有数据均已同步到目标端),即为数据原子可见。