开发者社区> 问答> 正文

canal 关于主备切换的问题

目前我想确认的是,如果我主库突然被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

展开
收起
古拉古拉 2023-05-08 13:46:55 101 0
1 条回答
写回答
取消 提交回答
  • 基于主库的binlog时间戳到备库去定位对应的binlog, 只要你主备库时间不要差的太离谱(<=60秒内)

    原回答者GitHub用户agapple

    2023-05-09 17:48:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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