一、背景现象
背景:公司flink任务出现问题,数据没有写入到结果库中。
于是立马去查看flink任务,在web页面,没有任何异常,没有exception,checkpoint也正常,反压也没有。
那问题就不出在我程序的问题上了。矛头直指环境问题
二、环境排查
首先去查看了flink的taskManager打印的日志,发现数据消费到了某一个时间段,后续就再也没有数据进来了。
说明数据没有到flink程序,所以源头就出了问题。
检查了一下 kafka,发现没有消息积压,而且消费速率也正常。
那么问题也不出在kafka。那么就只可能是出在更源头的地方:canal
三、祸首canal
运维大佬查了一下canal日志:
com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:xxxx.xxx,22 vs 21
很明显,这日志就说 数据库新增了一个字段,跟之前的数据库字段个数不一致了。导致canal出错,然后消息没发出去
当时就想 canal肯定能支持兼容DDL撒,那肯定是canal某个设置的问题。
然后就去github找了一下canal的文档。
然后搜索的时候果然搜索到了某条issue,里面的内容大概跟我相似
重点指向:
canal.instance.filter.query.ddl = true
这个配置 从语义上讲,很明显看出来就是canal过滤掉了 mysql的ddl语句,那么就自然无法感知 mysql新增了一个字段。这样的话 当新增字段之后新来了一条数据,那么canal无法匹配字段个数,就报错了。
解决方案
canal.instance.filter.query.ddl = false
这样就可以了,canal就能接收到ddl语句,能自己去适应新增字段之后的变更了。