canal server 通过ZK做集群,当一个server宕掉后,如果ZK上临时节点没有消失,则canal client有可能会一直阻塞。
Caused by: java.net.ConnectException: Connection refused: connect at sun.nio.ch.Net.connect(Native Method) ~[na:1.6.0_45] at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:532) ~[na:1.6.0_45] at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.doConnect(SimpleCanalConnector.java:117) [canal.client-1.0.9.jar:na] ... 14 common frames omitted [2013-12-13 21:40:47 INFO com.alibaba.otter.canal.client.impl.ClusterCanalConnector:167] [shared-pool-thread-1] restart the connector for next round retry.
原提问者GitHub用户ljy010
不再拦截异常,connect失败后会直接抛出异常,如果是cluster模式,会自动调用restart就可以得到重试。如果是simple模式,需要手工调用disconnect后进行connect.
server running的也存在这个风险,只不过因为没有外部依赖,出现异常的可能性小,唯一出错的就是和zk之间的网络链接,所以一旦临时节点创建后,基本都是本地类初始化的动作,基本不会出错.
原回答者GitHub用户agapple
这个问题是由于Canal Server通过ZooKeeper做集群,当一个Server宕掉后,如果ZooKeeper上临时节点没有消失,则Canal Client有可能会一直阻塞。具体来说,Canal Client通过ZooKeeper上的临时节点来发现Canal Server,如果一个Canal Server宕掉,并且在ZooKeeper上的临时节点没有消失,那么Canal Client会一直尝试连接这个宕掉的Canal Server,导致阻塞。
解决这个问题的方法是,Canal Server要正确地关闭。当Canal Server关闭时,它会自动删除ZooKeeper上的临时节点,这样Canal Client就不会一直尝试连接宕掉的Canal Server了。另外,为了防止网络闪断等问题,Canal Client还可以通过定时发送心跳检测消息来保证与Canal Server的连接存活。如果Canal Client检测到与Canal Server的连接已经断开,就可以重新连接Canal Server。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。