问题情景:
server与client部署在同机上的高可用性问题 canal server版本为1.0.21,client版本为1.0.22
问题描述:
现有两台机器pc1, pc2, 分别部有server与client各1个,名为s1, c1, s2, c2。s1和c1在pc1上正常运行,s2和c2在pc2上作为备份hanging。
现将pc1进行reboot,pc2上的s2可以切换到正常运行态,但c2会卡在connector.subscribe()方法上。
问题分析:
subscribe()在内部(SimpleCanalConnector.java)实现时,会一直等待获取锁(mutex.get()),而未采用超时返回TimeoutException的方法(mutex.get(long timeout, TimeUnit unit))。
在只有server发生切换的时候,原有的client会在server更新位点时抛出异常,从而跳出收发binlog的循环,重新订阅server节点。而当server与client同时发生切换时,由于备份client一直处于等待锁状态中,所以未能更新获取node的参数或者重新调用subscribe()方法。
问题hack:
修改了一些源码,使其暴露了带有TimeoutException的subscribe()方法,从而用重试的方法hack此bug。尚有以下几点问题:
1、 由于在底层加入了超时机制,connect()与disconnect()方法也会抛出超时异常,从而不能保证正确开启/关闭连接。(未验证,只是觉得有风险)
2、 其它潜在风险(我才刚刚接手这一块,源码读的不够深)
望得到作者指点一二,敬谢
原提问者GitHub用户ForaLake
看下 https://github.com/alibaba/canal/issues/171, 如果是卡在subscribe方法,得检查下initRunning方法是否有执行成功,成功之后会触发一个回调更新mutex
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。