开发者社区> 问答> 正文

canal server宕掉后,canal client有可能切不到备用server上

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

展开
收起
绿子直子 2023-05-09 16:10:32 112 0
2 条回答
写回答
取消 提交回答
  • 不再拦截异常,connect失败后会直接抛出异常,如果是cluster模式,会自动调用restart就可以得到重试。如果是simple模式,需要手工调用disconnect后进行connect.

    server running的也存在这个风险,只不过因为没有外部依赖,出现异常的可能性小,唯一出错的就是和zk之间的网络链接,所以一旦临时节点创建后,基本都是本地类初始化的动作,基本不会出错.

    原回答者GitHub用户agapple

    2023-05-10 11:09:35
    赞同 展开评论 打赏
  • 这个问题是由于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。

    2023-05-10 07:52:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载