请问为什么async commit和binlog不兼容呢?

binlog的文档里 https://docs.pingcap.com/zh/tidb/stable/tidb-binlog-overview 写着

TiDB Binlog 与 TiDB v5.0 版本开始引入的以下特性不兼容,无法一起使用:
* TiDB 系统变量 tidb_enable_async_commit:启用 TiDB Binlog 后,开启该选项无法获得性能提升。要获得性能提升,建议使用 TiCDC 替代 TiDB Binlog。

是因为 pump 里的key有可能是commit_ts,而异步提交的commit_ts不保证唯一吗?

我们将 Pump 抽象成了一个简单的 kv 数据库,key 为 binlog 的 start _ts (Priwrite binlog) 或者 commit_ts (Commit binlog),value 为 binlog 的元数据,binlog 的数据则存在数据文件中。

这篇文章也描述了,不论是 start_ts 还是 commit_ts 都是通过 PD 的 TSO来提供的
TSO目前就是唯一的,对于事务而言,不论是乐观事务,还是悲观事务,同一时间内只有一个事务可以commit成功。

TiCDC 对于数据的处理方式,和 tidb 的binlog 方案有很大的差别,
数据是通过 tidb 的入口进去的,然后

  • tidb 会通过 tikv 提供的 KV API 或者 DistSQL API 去获取数据,发生变更时,则将变更记录

  • ticdc则是 由 tikv 在发生变更后,通过 变更的统一接口去处理这个记录

主要的区别在这里…
希望能帮到你

那就是因为async commit的commit_ts不一定是从pd拿到的值,所以和binlog不兼容吗?

我给你解释了处理方式, TS 获取的方式 肯定是一致的
但是对于数据处理的方式完全不一样了,ticdc 和binlog 肯定不兼容了

可能我没说清楚,我的问题是async commit(异步提交)和binlog为什么不兼容,不是ticdc和binlog兼不兼容

没理解到哪个点吧
2pc (两阶段提交的事务),被简化后,变成 1pc ( 一阶段提交) 【异步提交的方式】

那么以前在tidb 节点上,需要完成的 2 PC被简化了 变成 1PC ,会影响到 tidb 生成 binlog 的机制
基本上是冲突的,因为tidb 无法掌控事务是否被提交,就无法捕捉事务变化的过程
但是 ticdc 的机制,刚好对这个方式进行了一个补充

1 个赞