一 问题描述
canal往kafka同步报错,数据无法同步。
canal instance报错:ERROR com.alibaba.otter.canal.kafka.CanalKafkaProducer - java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms
canal server也有报错:WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-2] Error while fetching metadata with correlation id 2681 : {=INVALID_TOPIC_EXCEPTION}
二 解决办法
① 检查kafka是否正常启动
② 检查kafka服务器端口是否开放
③ 检查/etc/hosts文件中是否包含ip与主机名对应关系
④ 检查下canal instance里是否有配置canal.mq.topic。假如canal.instance.filter.query.dml为false,则必须显示指定canal.mq.topic的值
⑤ 检查topic是否有问题,尝试重建下topic
⑥ canal版本升级了(由1.1.4升级到1.1.5,且kafka中存在用.分隔的topic)
1.1.5 canal不支持往kafka中用.分隔的 topic进行同步,canal会自动将topic名称中的.转为为_,示例:
#以下是canal instance的配置
# table regex
canal.instance.filter.regex=baidd.t1
# mq config
canal.mq.topic=baidd
# dynamic topic route by schema or table regex
canal.mq.dynamicTopic=baidd.t1
canal会自动往名称为baidd_t1的topic中进行同步,倘若kafka中不存在baidd.t1,会自动创建baidd_t1,但倘若存在baidd.t1,会导致canal无法继续同步,也不会自动创建baidd_t1,canal server报错:
canal instance报错:ERROR com.alibaba.otter.canal.kafka.CanalKafkaProducer - java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms
canal server也有报错:WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-2] Error while fetching metadata with correlation id 2681 : {baidd_t1=INVALID_TOPIC_EXCEPTION}
解决办法:
删掉kafka里现有带点的topic,这里是baidd.t1,改程序代码,将topic中的.改为_
注意:无须改动canal instance里的canal.mq.dynamicTopic,还用.分隔即可,我试验发现改成_,反而影响数据同步
--本篇文章参考了https://github.com/alibaba/canal/issues/2974