环境信息
canal version canal-1.1.2 mysql version
问题描述
使用内嵌canal的方法启动canal 使用zk存储meta信息如果 zk地址错误的情况下,调用 canalServer.stop(destination); canalServer.stop();
步骤重现
现在执行情况
otter也有类型的问题,不能关闭zk连接
给了一个错误的zk地址。然后执行 canalServer.stop(destination); canalServer.stop(); zk的报错仍在继续就是上面的截图。一直报错connection refused。定位到最下面是zk的超时默认好像是240天。
原提问者GitHub用户zhouluoyang0406
canalServer里的stop没有去关闭zk,如果用的是otter,zk链接是不会去关闭的
原回答者GitHub用户agapple
根据你提供的信息,看起来是因为错误的zk地址导致连接失败,而zk连接失败后,canalServer无法正常关闭。建议你先修改zk地址,确保canalServer正常启动并连接到zk,然后再执行停止操作。另外,你可以尝试手动关闭zk连接,具体方法可以参考以下代码:
if (canalServer != null) {
canalServer.stop(destination);
canalServer.stop();
}
if (zkClientx != null) {
zkClientx.close();
}
其中,zkClientx
是你创建zk连接的变量名。这样可以确保关闭zk连接,避免长时间超时。
当你使用内嵌canal的方式启动Canal时,如果zk地址错误,CanalServerWithEmbedded会抛出ConnectException,但是并不会自动关闭zk连接。因此,在关闭CanalServer之前,需要手动关闭zk连接,否则会导致zk连接泄漏。你可以在catch块中添加关闭zk连接的代码,例如:
CanalServerWithEmbedded canalServer = ...; CanalInstance instance = new CanalInstance(...); String destination = instance.getDestination(); try { canalServer.start(); canalServer.start(destination); // do something... } catch (Exception e) { // handle exception... } finally { canalServer.stop(destination); canalServer.stop(); canalServer.getCanalMQStarter().stopRunning(); canalServer.getCanalInstanceManager().stop(); canalServer.getCanalMQStarter().stop(); canalServer.getZkClient().close(); } 这样,在CanalServer停止之前,会先关闭zk连接,避免连接泄漏。另外,关于zk的超时时间,默认是10秒,而不是240天。你可以通过Canal的配置文件进行配置,例如:
canal.instance.zookeeper.sessionTimeout=10000 这里的sessionTimeout表示zk session的超时时间,单位是毫秒。如果你使用的是内嵌canal,你可以在CanalInstance的构造函数中指定zookeeper的配置,例如:
CanalInstance instance = new CanalInstance(...); instance.setZkClusters("127.0.0.1:2181"); instance.setSessionTimeout(10000); 这样,就可以指定zk session的超时时间为10秒。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。