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
ServerRunningMonitor有一个delayTime的设计,可以调低这个值,在处理zookeeper网络断开时即时退出,目前时默认延迟5秒钟
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。