开发者社区> 问答> 正文

server与client部署在同机上的高可用性问题

问题情景:

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

展开
收起
绿子直子 2023-05-09 15:55:15 73 0
1 条回答
写回答
取消 提交回答
  • 看下 https://github.com/alibaba/canal/issues/171, 如果是卡在subscribe方法,得检查下initRunning方法是否有执行成功,成功之后会触发一个回调更新mutex

    原回答者GitHub用户agapple

    2023-05-10 10:49:05
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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