为什么我消费不到数据?
排查网络问题,Kafka 服务器地址为腾讯云内网地址,只能在腾讯云与订阅实例相同地域的私有网络内访问。
排查订阅 topic、内网地址、消费组名称、账号、密码等是否正确。可在 数据订阅控制台 单击订阅名进入订阅详情页和消费管理页查看。
排查加密参数是否正确,参见 Kafka 使用何种认证机制。
数据格式是怎么样的?
Kafka 使用何种认证机制?
Kafka 使用何种认证机制?
如下所示:
![](https://qcloudimg.tencent-cloud.cn/image/document/7d06cf23e9d32960e6f793b382560a9f.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/7d06cf23e9d32960e6f793b382560a9f.png)
何时进行 Kafka commit?
首先请将 Kafka 的 enable_auto_commit 参数设置为 false,以关闭自动 commit。生产者会在消息序列中的合适位置插入 Checkpoint 消息,消费者消费到 Checkpoint 消息后进行 commit,这样有利于保证消息的完整性。
服务端消息保留多久,如何设置消费 offset?
数据订阅 Kafka 服务端消息保留1天。
在 Kafka Client 修改 offset。根据需要配置 Kafka 的 auto_offset_reset 参数为 earliest 或者 latest。如果需要从具体的 offset 开始消费,则可以利用 Kafka Client 提供的 seek 功能,重新设置消费 offset。
在 DTS 数据订阅任务界面修改 offset。具体请参考 修改消费位点。
数据订阅可能会收到重复数据吗?
MySQL/TDSQL-C MySQL/MariaDB/Percona/TDSQL PostgreSQL 订阅任务过程中,如果进行修改订阅对象等操作会发生任务重启,重启后可能会导致用户在 kafka 客户端消费数据时出现重复。
DTS 是按最小数据单元进行传输的(增量阶段每标记一个 checkpoint 位点就是一个数据单元),如果重启时,刚好一个数据单元传输已完成,则不会导致数据重复;如果重启时,一个数据单元还正在传输中,那么再次启动后需要重新拉取这个数据单元,以保证数据完整性,这样就会导致数据重复。
MySQL/TDSQL-C MySQL 订阅任务当前已支持数据去重,消费 Demo 中包含了去重逻辑,不会产生数据重复,MariaDB/Percona/TDSQL PostgreSQL 订阅任务,用户如果对重复数据比较关注,请自行在消费数据时设置去重逻辑。
MongoDB 订阅任务不存在重复数据的场景。
如何提升数据消费速率?
数据订阅中,每个订阅任务对应一个 topic,源库的库表对象都投递到同一个 topic 中。如果需要提高消费速率,首先在配置订阅任务的时候,设置 kafka 分区策略,然后在消费数据的时候,创建多个消费组(消费组数量 ≤ kafka 分区数),这样不同分区的数据就可以通过多个消费组同时消费。
为什么消费数据时出现空事务?
在订阅指定库/表对象(非源实例全部),并且采用 Kafka 单分区的场景中,DTS 解析增量数据后,仅将订阅对象的数据写入 Kafka Topic 中,其他非订阅对象的数据会转成空事务写入 Kafka Topic,所以在消费数据时会出现空事务。空事务的 Begin/Commit 消息中保留了事务的 GTID 信息,可以保证 GTID 的连续性和完整性。同时,在 MySQL/TDSQL-C MySQL 的消费 Demo 中,多个空事务也做了压缩处理以减少消息数量。
为什么消费数据时多了checkpoint字段?
为了保证数据可重入,DTS 订阅引入 Checkpoint 机制。消息写入 Kafka Topic 时,一般每10秒会插入一个 Checkpoint,用来标识数据同步的位点,在任务中断后再重启识别断点位置,实现断点续传。另外,消费端遇到 Checkpoint 消息会做一次 Kafka 消费位点提交,以便及时更新消费位点。