开发者社区> 问答> 正文

canal+ kafka的分区参数疑惑

canal + kafka的采集分区参数

canal.mq.dynamicTopic=topicA:schema1.table1,topicA:schema2.table2 canal.mq.partitionsNum=3 canal.mq.partitionHash=...

我阅读wiki的理解是

topicA 存放canal从 table1和table2增量同步的数据 自动创建topic,且分区数量为3 分区策略是,按表分区,即表数据分开存放在不同的topic分区。

但是测试的结果和我理解的不一样

环境: linux centos 6 canal 1.1.15 mysql 5.7.42 kafka 2.12_2.2.0

case1: 采集table1和table2 到 topicA 符合预期 但是kafka的topicA的分区数量是1, 不符合预期的3. 查看了相关的issue,作者说是kafka的topic要手动创建并指定分区数量 #3339

case2: 于是我手动创建了 topic, 指定分区数量为4

测试2次的结果都是:

数据分布在3个分区内, 每个分区table1和table2的数据都有。

我就疑惑了,canal.mq.partitionsNum是决定 数据分布在多少个分区内吗 canal.mq.partitionHash=... 的效果也没办法理解了。

请路过的大佬的指导下这三个参数的含义,拜谢

================ 附 wiki的部分资料

canal.mq.dynamicTopic -- 例子5:test0:test,test1:test1.test1,指定多个表达式,会将test库的表都发送到test0的topic下,test1.test1的表发送到对应的test1的topic下,其余的表发送到默认的canal.mq.topic值

canal.mq.partitionHash -- 例子5:... ,不指定pk信息的正则匹配,将所有正则匹配的表,对应的hash字段为表名。 按表hash: 一张表的所有数据可以发到同一个分区,不同表之间会做散列 (会有热点表分区过大问题)

canal.mq.dynamicTopic,主要控制是否是单topic还是多topic,针对命中条件的表可以发到表名对应的topic、库名对应的topic、默认topic name canal.mq.partitionsNum、canal.mq.partitionHash,主要控制是否多分区以及分区的partition的路由计算,针对命中条件的可以做到按表级做分区、pk级做分区等

原提问者GitHub用户zhang5324496

展开
收起
山海行 2023-04-27 16:06:39 157 0
1 条回答
写回答
取消 提交回答
  • canal.mq.partitionHash的作用是按照哪个列做分区,如果不指定,默认只会发送给其中1个分区

    原回答者GitHub用户agapple

    2023-04-27 22:04:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第16讲】:Spring Boot 2.0 实战Apache Kafka百万级高并发消息中间件与原理解析 立即下载
MaxCompute技术公开课第四季 之 如何将Kafka数据同步至MaxCompute 立即下载
消息队列kafka介绍 立即下载