在HA模式下,instance的lazy启动不成立。
首先看CanalController的代码
for (Map.Entry<String, InstanceConfig> entry : instanceConfigs.entrySet()) { final String destination = entry.getKey(); InstanceConfig config = entry.getValue(); // 创建destination的工作节点 if (!config.getLazy() && !embededCanalServer.isStart(destination)) { // HA机制启动 ServerRunningMonitor runningMonitor = ServerRunningMonitors.getRunningMonitor(destination); if (!runningMonitor.isStart()) { runningMonitor.start(); } }
if (autoScan) {
instanceConfigMonitors.get(config.getMode()).register(destination, defaultAction);
}
}
lazy模式下,ServerRunningMonitor不会启动,那么在zookeeper的/otter/canal/destinations/destination/cluster节点下不会有数据,running节点也不会有数据
再看ClusterNodeAccessStrategy的代码 public SocketAddress nextNode() { if (runningAddress != null) {// 如果服务已经启动,直接选择当前正在工作的节点 return runningAddress; } else if (!currentAddress.isEmpty()) { // 如果不存在已经启动的服务,可能服务是一种lazy启动,随机选择一台触发服务器进行启动 return currentAddress.get(0);// 默认返回第一个节点,之前已经做过shuffle } else { throw new CanalClientException("no alive canal server"); } }
由于cluster和running节点都不存在,此处会进入else分支,客户端会一直报错,没办法触发laze启动。
原提问者GitHub用户lulu2panpan
ServerRunningMonitor只是检测running节点的变化,不管是否lazy模式,都会为每个instance创建一个cid节点,这里的currentAddress拿的应该是这个list.
看了下代码,目前cid节点的注册是依赖了ServerRunningMonitor.start()方法,逻辑上这里的确会有一点问题。
改进办法:ServerRunningMonitor可以增加init方法,init方法调用创建cid,init方法不受lazy模式控制
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。