开发者社区> 问答> 正文

Canal server 脑裂问题

HA集群模式下,出现同一个destination在两个canal-sever上均处于启动状态的情况。

Canal版本1.1.4 , CanalAdmin 模式 ,canal-server1 和 canal-server2 做HA 配置一个destination d1, canal-server1 启动destination d1 , canal-server2 处于standby状态。

当canal-server1 发生网络抖动(比如断网)和zookeeper断开链接(超过zookeeper maxSessionTimeout 时间,默认20*tickTime 通常为40s) , 临时节点失效/otter/canal/destinations/d1/running ,canal-server2 成功创建并启动destination d1 ; 但此时canal-server1 并未stop掉 d1 . canal-server1 网络恢复后,会出现同一个destination d1 在canal-server1 canal-server2 都是启动状态。 在配置 canal.serverMode = kafka 模式下,会出现消息重复及顺序问题。

临时解决办法: canal-server RunningMonitor 收到Zookeeper Disconnected状态后,主动退出active模式。

`diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java index 1cf4764..348beb5 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java @@ -203,7 +203,11 @@ public class CanalController { zkclientx.subscribeStateChanges(new IZkStateListener() {

                             public void handleStateChanged(KeeperState state) throws Exception {

                               if (state.equals(KeeperState.Disconnected)) {

                                           "destination :{}", destination);

                               }
                           }`

原提问者GitHub用户JichengSong

展开
收起
Java工程师 2023-05-03 09:42:39 119 0
1 条回答
写回答
取消 提交回答
  • ServerRunningMonitor有一个delayTime的设计,可以调低这个值,在处理zookeeper网络断开时即时退出,目前时默认延迟5秒钟

    原回答者GitHub用户agapple

    2023-05-04 13:26:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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