public void doSwitch(AuthenticationInfo newRunningInfo) { // 1. 需要停止当前正在复制的过程 // 2. 找到新的position点 // 3. 重新建立链接,开始复制数据 // 切换ip String alarmMessage = null; if (this.runningInfo.equals(newRunningInfo)) { alarmMessage = "same runingInfo switch again : " + runningInfo.getAddress().toString(); logger.warn(alarmMessage); return; } if (newRunningInfo == null) { alarmMessage = "no standby config, just do nothing, will continue try:" + runningInfo.getAddress().toString(); logger.warn(alarmMessage); sendAlarm(destination, alarmMessage); return; } else { stop(); alarmMessage = "try to ha switch, old:" + runningInfo.getAddress().toString() + ", new:" + newRunningInfo.getAddress().toString(); logger.warn(alarmMessage); sendAlarm(destination, alarmMessage); runningInfo = newRunningInfo; start(); } }
private MysqlConnection buildMysqlConnection(AuthenticationInfo runningInfo) { MysqlConnection connection = new MysqlConnection( runningInfo.getAddress(), runningInfo.getUsername(), runningInfo.getPassword(), connectionCharsetNumber, runningInfo.getDefaultDatabaseName()); connection.getConnector().setReceiveBufferSize(receiveBufferSize); connection.getConnector().setSendBufferSize(sendBufferSize); connection.getConnector().setSoTimeout(defaultConnectionTimeoutInSeconds * 1000); connection.setCharset(connectionCharset); connection.setSlaveId(this.slaveId); return connection; }
protected EntryPosition findStartPositionInternal(ErosaConnection connection) { MysqlConnection mysqlConnection = (MysqlConnection) connection; LogPosition logPosition = logPositionManager.getLatestIndexBy(destination); if (logPosition == null) { // 找不到历史成功记录 EntryPosition entryPosition = null; if (masterInfo != null && mysqlConnection.getConnector().getAddress().equals(masterInfo.getAddress())) { entryPosition = masterPosition; } else if (standbyInfo != null && mysqlConnection.getConnector().getAddress().equals(standbyInfo.getAddress())) { entryPosition = standbyPosition; } if (entryPosition == null) { entryPosition = findEndPosition(mysqlConnection); // 默认从当前最后一个位置进行消费 } // 判断一下是否需要按时间订阅 if (StringUtils.isEmpty(entryPosition.getJournalName())) { // 如果没有指定binlogName,尝试按照timestamp进行查找 if (entryPosition.getTimestamp() != null && entryPosition.getTimestamp() > 0L) { logger.warn( "prepare to find start position {}:{}:{}", new Object[] {"", "", entryPosition.getTimestamp()}); return findByStartTimeStamp(mysqlConnection, entryPosition.getTimestamp()); } else { logger.warn("prepare to find start position just show master status"); return findEndPosition(mysqlConnection); // 默认从当前最后一个位置进行消费 } } else { if (entryPosition.getPosition() != null && entryPosition.getPosition() > 0L) { // 如果指定binlogName + offest,直接返回 logger.warn( "prepare to find start position {}:{}:{}", new Object[] {entryPosition.getJournalName(), entryPosition.getPosition(), ""}); return entryPosition; } else { EntryPosition specificLogFilePosition = null; if (entryPosition.getTimestamp() != null && entryPosition.getTimestamp() > 0L) { // 如果指定binlogName + timestamp,但没有指定对应的offest,尝试根据时间找一下offest EntryPosition endPosition = findEndPosition(mysqlConnection); if (endPosition != null) { logger.warn( "prepare to find start position {}:{}:{}", new Object[] {entryPosition.getJournalName(), "", entryPosition.getTimestamp()}); specificLogFilePosition = findAsPerTimestampInSpecificLogFile( mysqlConnection, entryPosition.getTimestamp(), endPosition, entryPosition.getJournalName()); } } if (specificLogFilePosition == null) { // position不存在,从文件头开始 entryPosition.setPosition(BINLOG_START_OFFEST); return entryPosition; } else { return specificLogFilePosition; } } } } else { if (logPosition .getIdentity() .getSourceAddress() .equals(mysqlConnection.getConnector().getAddress())) { logger.warn("prepare to find start position just last position"); return logPosition.getPostion(); } else { // 针对切换的情况,考虑回退时间 long newStartTimestamp = logPosition.getPostion().getTimestamp() - fallbackIntervalInSeconds * 1000; logger.warn( "prepare to find start position by switch {}:{}:{}", new Object[] {"", "", logPosition.getPostion().getTimestamp()}); return findByStartTimeStamp(mysqlConnection, newStartTimestamp); } } }