mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
optimize gtid
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
package com.alibaba.otter.canal.parse.driver.mysql.packets;
|
package com.alibaba.otter.canal.parse.driver.mysql.packets;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类 MariaGTIDSet.java 的实现
|
* 类 MariaGTIDSet.java 的实现
|
||||||
*
|
*
|
||||||
@@ -13,8 +13,9 @@ import java.util.Map;
|
|||||||
* @version 1.0.0
|
* @version 1.0.0
|
||||||
*/
|
*/
|
||||||
public class MariaGTIDSet implements GTIDSet {
|
public class MariaGTIDSet implements GTIDSet {
|
||||||
|
|
||||||
//MariaDB 10.0.2+ representation of Gtid
|
//MariaDB 10.0.2+ representation of Gtid
|
||||||
Map<Long, MariaGtid> gtidMap = new HashMap<>();
|
private Map<Long, MariaGtid> gtidMap = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] encode() throws IOException {
|
public byte[] encode() throws IOException {
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ public class GtidUtil {
|
|||||||
public static GTIDSet parseGtidSet(String gtid, boolean isMariaDB) {
|
public static GTIDSet parseGtidSet(String gtid, boolean isMariaDB) {
|
||||||
if (isMariaDB) {
|
if (isMariaDB) {
|
||||||
return MariaGTIDSet.parse(gtid);
|
return MariaGTIDSet.parse(gtid);
|
||||||
}
|
} else {
|
||||||
return MysqlGTIDSet.parse(gtid);
|
return MysqlGTIDSet.parse(gtid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,16 +1,12 @@
|
|||||||
package com.alibaba.otter.canal.parse.inbound;
|
package com.alibaba.otter.canal.parse.inbound;
|
||||||
|
|
||||||
|
import static com.alibaba.otter.canal.parse.driver.mysql.utils.GtidUtil.parseGtidSet;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection;
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang.exception.ExceptionUtils;
|
import org.apache.commons.lang.exception.ExceptionUtils;
|
||||||
import org.apache.commons.lang.math.RandomUtils;
|
import org.apache.commons.lang.math.RandomUtils;
|
||||||
@@ -25,7 +21,7 @@ import com.alibaba.otter.canal.parse.CanalEventParser;
|
|||||||
import com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet;
|
import com.alibaba.otter.canal.parse.driver.mysql.packets.GTIDSet;
|
||||||
import com.alibaba.otter.canal.parse.exception.CanalParseException;
|
import com.alibaba.otter.canal.parse.exception.CanalParseException;
|
||||||
import com.alibaba.otter.canal.parse.exception.PositionNotFoundException;
|
import com.alibaba.otter.canal.parse.exception.PositionNotFoundException;
|
||||||
import com.taobao.tddl.dbsync.binlog.exception.TableIdNotFoundException;
|
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection;
|
||||||
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor;
|
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor;
|
||||||
import com.alibaba.otter.canal.parse.index.CanalLogPositionManager;
|
import com.alibaba.otter.canal.parse.index.CanalLogPositionManager;
|
||||||
import com.alibaba.otter.canal.parse.support.AuthenticationInfo;
|
import com.alibaba.otter.canal.parse.support.AuthenticationInfo;
|
||||||
@@ -38,8 +34,7 @@ import com.alibaba.otter.canal.protocol.position.LogIdentity;
|
|||||||
import com.alibaba.otter.canal.protocol.position.LogPosition;
|
import com.alibaba.otter.canal.protocol.position.LogPosition;
|
||||||
import com.alibaba.otter.canal.sink.CanalEventSink;
|
import com.alibaba.otter.canal.sink.CanalEventSink;
|
||||||
import com.alibaba.otter.canal.sink.exception.CanalSinkException;
|
import com.alibaba.otter.canal.sink.exception.CanalSinkException;
|
||||||
|
import com.taobao.tddl.dbsync.binlog.exception.TableIdNotFoundException;
|
||||||
import static com.alibaba.otter.canal.parse.driver.mysql.utils.GtidUtil.parseGtidSet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 抽象的EventParser, 最大化共用mysql/oracle版本的实现
|
* 抽象的EventParser, 最大化共用mysql/oracle版本的实现
|
||||||
|
|||||||
@@ -350,10 +350,10 @@ public class MysqlConnection implements ErosaConnection {
|
|||||||
private void sendBinlogDumpGTID(GTIDSet gtidSet) throws IOException {
|
private void sendBinlogDumpGTID(GTIDSet gtidSet) throws IOException {
|
||||||
if (isMariaDB()) {
|
if (isMariaDB()) {
|
||||||
sendMariaBinlogDumpGTID(gtidSet);
|
sendMariaBinlogDumpGTID(gtidSet);
|
||||||
return;
|
} else {
|
||||||
}
|
|
||||||
sendMySQLBinlogDumpGTID(gtidSet);
|
sendMySQLBinlogDumpGTID(gtidSet);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sendMySQLBinlogDumpGTID(GTIDSet gtidSet) throws IOException {
|
private void sendMySQLBinlogDumpGTID(GTIDSet gtidSet) throws IOException {
|
||||||
BinlogDumpGTIDCommandPacket binlogDumpCmd = new BinlogDumpGTIDCommandPacket();
|
BinlogDumpGTIDCommandPacket binlogDumpCmd = new BinlogDumpGTIDCommandPacket();
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ public class MysqlEventParser extends AbstractMysqlEventParser implements CanalE
|
|||||||
|
|
||||||
protected EntryPosition findStartPosition(ErosaConnection connection) throws IOException {
|
protected EntryPosition findStartPosition(ErosaConnection connection) throws IOException {
|
||||||
if (isGTIDMode()) {
|
if (isGTIDMode()) {
|
||||||
// GTID模式下,CanalLogPositionManager里取最后的gtid,没有则取instanc配置中的
|
// GTID模式下,CanalLogPositionManager里取最后的gtid,没有则取instance配置中的
|
||||||
LogPosition logPosition = getLogPositionManager().getLatestIndexBy(destination);
|
LogPosition logPosition = getLogPositionManager().getLatestIndexBy(destination);
|
||||||
if (logPosition != null) {
|
if (logPosition != null) {
|
||||||
// 如果以前是非GTID模式,后来调整为了GTID模式,那么为了保持兼容,需要判断gtid是否为空
|
// 如果以前是非GTID模式,后来调整为了GTID模式,那么为了保持兼容,需要判断gtid是否为空
|
||||||
@@ -381,7 +381,7 @@ public class MysqlEventParser extends AbstractMysqlEventParser implements CanalE
|
|||||||
protected EntryPosition findEndPositionWithMasterIdAndTimestamp(MysqlConnection connection) {
|
protected EntryPosition findEndPositionWithMasterIdAndTimestamp(MysqlConnection connection) {
|
||||||
MysqlConnection mysqlConnection = (MysqlConnection) connection;
|
MysqlConnection mysqlConnection = (MysqlConnection) connection;
|
||||||
final EntryPosition endPosition = findEndPosition(mysqlConnection);
|
final EntryPosition endPosition = findEndPosition(mysqlConnection);
|
||||||
if (tableMetaTSDB != null) {
|
if (tableMetaTSDB != null || isGTIDMode()) {
|
||||||
long startTimestamp = System.currentTimeMillis();
|
long startTimestamp = System.currentTimeMillis();
|
||||||
return findAsPerTimestampInSpecificLogFile(mysqlConnection,
|
return findAsPerTimestampInSpecificLogFile(mysqlConnection,
|
||||||
startTimestamp,
|
startTimestamp,
|
||||||
@@ -426,7 +426,8 @@ public class MysqlEventParser extends AbstractMysqlEventParser implements CanalE
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (entryPosition == null) {
|
if (entryPosition == null) {
|
||||||
entryPosition = findEndPositionWithMasterIdAndTimestamp(mysqlConnection); // 默认从当前最后一个位置进行消费
|
entryPosition =
|
||||||
|
findEndPositionWithMasterIdAndTimestamp(mysqlConnection); // 默认从当前最后一个位置进行消费
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断一下是否需要按时间订阅
|
// 判断一下是否需要按时间订阅
|
||||||
|
|||||||
Reference in New Issue
Block a user