环境信息
1.1.4 5.8
问题描述
部署俩台canal-server,A和B,
基于SpringCanalInstanceGenerator启动,position上传到zk, A先启动,然后启动B,B相当于做A的上任务的standby节点, A上配置了39个destination复制binlog的任务 当stop A 进程,通过canal的HA机制任务被B接管,但是部分的任务出现了异常(39个出现了5个异常),异常如下
期待结果
正常启动
实际执行情况
部分任务启动失败
2021-04-13 11:13:14.340 [pool-34-thread-1] WARN c.a.o.canal.instance.spring.SpringCanalInstanceGenerator - 1. SpringCanalInstanceGenerator generate real destination : xxxxx 2021-04-13 11:13:14.383 [pool-34-thread-1] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties] 2021-04-13 11:13:14.383 [pool-34-thread-1] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [instance.properties] 2021-04-13 11:13:14.384 [pool-34-thread-1] WARN c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Could not load properties from class path resource [instance.properties]: class path resource [instance.properties] cannot be opened because it does not exist
推测原因
个别${canal.instance.destination}的值没有被spring初始化时获取,导致到destination为空,无法找到{destination}/instance.properties
....... 通过查看canal的代码发现以下的点可能会导致这种case发生
AbstractMysqlEventParser.start方法中 synchronized (CanalEventParser.class) { System.setProperty("canal.instance.destination", destination);
} finally{ System.setProperty("canal.instance.destination", ""); }
和
SpringCanalInstanceGenerator.generate方法中 synchronized (CanalEventParser.class) { System.setProperty("canal.instance.destination", destination); } finally{ System.setProperty("canal.instance.destination", ""); }
以上逻辑觉得存在并发修改{canal.instance.destinatio}情况,因为这个俩个都是在不同线程执行的,但是他们之间都是用各自的类锁的同步,应该持有同一把锁才能将canal.instance.destination设置和清除进行同步
解决办法:
将AbstractMysqlEventParser和SpringCanalInstanceGenerator 中synchronized(配置相同的类锁)
原提问者GitHub用户yangzhongj
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。