目前我想确认的是,如果我主库突然被shutdown,我canal设置了 canal.instance.detecting.enable = true canal.instance.detecting.heartbeatHaEnable = true canal.instance.standby.address = 10.88.26.208:3309 这两个参数。
之后我shutdown主库,canal的确去连接了备库,但是我从日志里面看到
2019-03-14 14:21:40.420 [destination = test , address = /10.88.26.207:3309 , HeartBeatTimeTask] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - try to ha switch, old:mha-master/10.88.26.207:3309, new:/10.88.26.208:3309 2019-03-14 14:21:40.420 [destination = test , address = /10.88.26.207:3309 , HeartBeatTimeTask] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:test[try to ha switch, old:mha-master/10.88.26.207:3309, new:/10.88.26.208:3309] 2019-03-14 14:21:40.482 [destination = test , address = /10.88.26.207:3309 , HeartBeatTimeTask] ERROR com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set 2019-03-14 14:21:40.501 [destination = test , address = /10.88.26.207:3309 , HeartBeatTimeTask] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - connect failed by java.io.IOException: connect /10.88.26.207:3309 failure at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:77) ~[canal.parse.driver-1.1.2.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.reconnect(MysqlConnector.java:86) ~[canal.parse.driver-1.1.2.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.reconnect(MysqlConnection.java:92) ~[canal.parse-1.1.2.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser$MysqlDetectingTimeTask.run(MysqlEventParser.java:228) ~[canal.parse-1.1.2.jar:na] at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.7.0_80] at java.util.TimerThread.run(Timer.java:505) [na:1.7.0_80] Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.7.0_80] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_80] at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_80] at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_80] at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_80] at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_80] at com.alibaba.otter.canal.parse.driver.mysql.socket.BioSocketChannelPool.open(BioSocketChannelPool.java:18) ~[canal.parse.driver-1.1.2.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.socket.SocketChannelPool.open(SocketChannelPool.java:18) ~[canal.parse.driver-1.1.2.jar:na] at com.alibaba.otter.canal.parse.driver.mysql.MysqlConnector.connect(MysqlConnector.java:72) ~[canal.parse.driver-1.1.2.jar:na] ... 5 common frames omitted 2019-03-14 14:21:40.516 [destination = test , address = /10.88.26.208:3309 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position 2019-03-14 14:21:40.516 [destination = test , address = /10.88.26.208:3309 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position by switch ::1552543264000 2019-03-14 14:21:40.576 [destination = test , address = /10.88.26.208:3309 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000002,position=821,serverId=20703,gtid=,timestamp=1552370698000] cost : 60ms , the next step is binlog dump
连接到了备库,但是获取的日志点是mysql-bin.000002的821,可是备库的最新日志序列,并不是mysql-bin.000002,想问下如何解释这个现象。
还有就是canal是如何保证在主库遇到shutdown或者主备切换之后如何保证日志不丢失的?
原提问者GitHub用户ZSH9053
基于主库的binlog时间戳到备库去定位对应的binlog, 只要你主备库时间不要差的太离谱(<=60秒内)
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。