【 TiDB 使用环境】 Poc
【 TiDB 版本】v5.4.1
【复现路径】
【遇到的问题:问题现象及影响】
官网上ticdc工具能支持dml和ddl事件捕获,seatuunel和flink cdc中对tidb的支持只能实现dml事件捕获,请问是因为tikv-java-client 3.2.0不支持DDL事件捕获吗,请问ticdc工具是如何实现的ddl事件捕获?能不能使用java程序实现捕获ddl事件的功能呀?
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
TiCDC 有专门的 OwnerDDLPuller 去拉取上游的 DDL, 你的使用场景是啥? 直接用 TiCDC不行吗?
谢谢,我们是要将TiDB的增量数据(DDL、DML)同步到下游数据库,该数据库当前的Ti CDC的 sink不支持,我们又不让用kafka ,想直接使用tikv-java-client 去实现,所以想确认tikv-java-client能不能做到支持DDL同步?还有ticdc是怎么实现DDL变更捕获的? 能不能使用java程序实现DDL捕获?
TiCDC 是监控 tikv 的 change log的,其中 OwnerDDLPuller 可以监听上游元数据的变化和 DDL 事件,
tikv-java-client 应该也能实现类似的功能,不过还是推荐用 TiCDC 这种成熟的产品,兼容性肯定更好
你下游是什么数据库? Pulsar 可以用吗?
TiCDC 支持文件同步模式,可以先用 NFS 试一下,不过我建议用 S3 ,量太大了…
Java client 没法感知 ticdc change event 的,除非 修改 ticdc capture data event ,
但是修改后,就没法升级了,这个也会带来运维的困难…
java 程序实现 DDL 捕获的可行方案
可通过以下两种技术路径实现 Java 程序的 DDL 事件捕获:
方案一:TiCDC+Kafka 桥接方案
利用 TiCDC 的 Kafka 输出功能,将 DDL 事件以 Avro 格式写入 Kafka Topic。Java 程序通过消费 Kafka 消息实现事件捕获,需注意:
- 需在 TiCDC 配置中开启
enable-tidb-extension=true
以保留 DDL 原生格式 - 解析消息中的
_tidb_commit_ts
和_tidb_table
等扩展字段
方案二:TiCDC 开放协议集成方案
通过 TiCDC Open Protocol 的 gRPC 接口(端口默认 8300)直接订阅变更流,Java 程序需实现:
- 基于 Protobuf 定义生成客户端代码(参考
cdc.proto
协议文件) - 处理
Event
消息体中的ResolvedTs
和AdminCommand
类型事件 - 维护本地 Schema 版本缓存以正确解析 DDL 后的表结构变更
谢谢,我们参考了flink cdc的tidb connector的实现,基于tikv-java-client3.2可以直接从tidb捕获DML事件的捕获,但是好像没有支持DDL事件的捕获,所以想搞清楚ticdc中是怎么实现DDL事件捕获的?
可以实现,使用参考这个文章,专栏 - 使用 TiKV 读改写 TiDB 数据 | TiDB 社区
谢谢,文章已看,是可以使用tikv-java-client3.2.0的scan api去获取指定key的数据。
我们需要获取的是实时的DDL变更数据,即在tidb中执行一个建表(create table …)的语句,我们希望从tikv中获取到这个建表的变更事件数据,文章中提到的是获取表中的行数据,没有说到获取DDL数据。能不能帮忙研究下ti cdc中是怎么扫描到ddl变更事件的,感谢!
o,哈哈哈,是滴,这个我给你瞧瞧哈
我看了一下,可以有两个思路:1. 监控全库全表cdc,这个需要过滤所有非ddl 数据。2监控mysql.tidb_ddl_history 这一张表,不过我写的tikv-reader 对json 解析没有解析好
总体来看 单纯监控ddl ,可以使用方法2 ,我测试了一下没有特别的问题。
本来想写个文章水水积分呢,看来没戏了