启动Canal,如果持续有数据,不报错。当没有数据时,25s就SocketTimeoutException异常,导致重连。 报错位于BioSocketChannel.read(BioSocketChannel.java:123) 查看代码,BioSocketChannel中的SO_TIMEOUT=1000,即1s,如果read()不到数据,1s就会抛出SocketTimeoutException。其中累加到入参的25s,就会向上抛出异常,导致重连。
在文件DirectLogFetcher中定义了master hearbeat=15;然后READ_TIMEOUT_MILLISECONDS=(MASTER_HEARTBEAT_PERIOD_SECONDS + 10) * 1000;即read()的时候timeout=25s。 现在现象就是BioSocketChannel中的read(25)方法传入的timeout时间是25s,如果没有增量数据,超过25s,就抛出SocketTimeoutException异常了。
如果不开启master heartbeat的话,是不是25s就会sockettimeout异常,进行重连。 开启master heartbeat是设置配置文件中的canal.instance.detecting.enable =true 和canal.instance.detecting.heartbeatHaEnable = true么?我现在设置了没有起作用呢?是哪里没设置对么
原提问者GitHub用户theonesmx
canal.instance.detecting.enable和binlog master heartbeat不是一个概念。 canal.instance.detecting.enable是fork出另一个connection由canal server发起的heartbeat。 binlog master heartbeat则是MySQL dump协议的一部分,由MySQL master发起直接在dump connection中传输。canal server 无需配置直接开启的(为了解决半连接问题)。 https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html 可以看MASTER_HEARTBEAT_PERIOD 这一段,检查下master端是否生效.
原回答者GitHub用户lcybo
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。