alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.44k stars 7.6k forks source link

BioSocketChannelPool默认超时时间不够,导致连接出错 #3242

Open Sryoung0721 opened 3 years ago

Sryoung0721 commented 3 years ago

在配置canal1.3同步binlog时,遇到了这个连接问题,网上找了一圈似乎没有同样的问题。一般的报错在failure之后还会有一些详细信息,比如提示权限,密码,binlog位置问题等,但是这个情况就没有,只提示连接失败。

2020-12-11 17:30:15.162 [destination = example , address = /192.168.12.52:3306 , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address /192.168.12.52:3306 has an error, retrying. caused by com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: connect /192.168.12.52:3306 failure Caused by: java.io.IOException: connect /192.168.12.52:3306 failure at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:83) ~[canal.parse.driver-1.1.3.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.connect(MysqlConnection.java:89) ~[canal.parse-1.1.3.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser.preDump(MysqlEventParser.java:86) ~[canal.parse-1.1.3.jar:na] at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:175) ~[canal.parse-1.1.3.jar:na] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_261] Caused by: java.net.SocketTimeoutException: Timeout occurred, failed to read total 4 bytes in 5000 milliseconds, actual read only 0 bytes at com.alibaba.otter.canal.parse.driver.mysql.socket.BioSocketChannel.read(BioSocketChannel.java:91) ~[canal.parse.driver-1.1.3.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.utils.PacketManager.readHeader(PacketManager.java:19) ~[canal.parse.driver-1.1.3.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.negotiate(MysqlConnector.java:160) ~[canal.parse.driver-1.1.3.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:80) ~[canal.parse.driver-1.1.3.jar:na] ... 4 common frames omitted

经过排查后发现是socket连接超时的问题,有可能是因为服务器之间的网络之间的网络延时超过了默认的socket超时时间。 解决办法:修改lib/canal.parse.driver/com.alibaba.otter.canal.parse.driver.mysql.socket.BioSocketChannel.open()方法。代码中默认socket超时和connection连接超时时间为1s和10s,如果远程连接需要同步的数据库很慢的话,超过这个时间就会导致上述报错。将这两个值修改大一些即可。

代码: public static BioSocketChannel open(SocketAddress address) throws Exception { Socket socket = new Socket(); socket.setSoTimeout(1000);//根据实际情况修改 socket.setTcpNoDelay(true); socket.setKeepAlive(true); socket.setReuseAddress(true); socket.connect(address, 10000);//根据实际情况修改 return new BioSocketChannel(socket); }

moonMMMMmoon commented 3 years ago

我遇到了同样的问题,谢谢大佬,我根据你的方法解决好了