mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
Compare commits
14 Commits
canal-1.1.
...
canal-1.1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1f5a5a8e4 | ||
|
|
4c906702a6 | ||
|
|
9e715b95bc | ||
|
|
ea8949298f | ||
|
|
ba924b9f1d | ||
|
|
7e0061fe93 | ||
|
|
6440b744f2 | ||
|
|
066b022bb3 | ||
|
|
738f41049f | ||
|
|
0f6b9d156a | ||
|
|
ed754b5203 | ||
|
|
11f89163c1 | ||
|
|
cda330e49e | ||
|
|
f9f810226d |
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.admin</artifactId>
|
<artifactId>canal.admin</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.admin</artifactId>
|
<artifactId>canal.admin</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>canal.admin-web</artifactId>
|
<artifactId>canal.admin-web</artifactId>
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>mysql</groupId>
|
<groupId>mysql</groupId>
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<!-- 支持arm64需要mysql 8.0,升级为8.0的新版驱动 -->
|
||||||
|
<version>8.0.33</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ esac
|
|||||||
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
||||||
str=`file -L $JAVA | grep 64-bit`
|
str=`file -L $JAVA | grep 64-bit`
|
||||||
|
|
||||||
JAVA_OPTS="$JAVA_OPTS -Xss256k -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
JAVA_OPTS="$JAVA_OPTS -Xss1m -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
||||||
if [ $JavaVersion -ge 11 ] ; then
|
if [ $JavaVersion -ge 11 ] ; then
|
||||||
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
||||||
JAVA_OPTS="$JAVA_OPTS"
|
JAVA_OPTS="$JAVA_OPTS"
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal.admin</artifactId>
|
<artifactId>canal.admin</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>canal admin module for otter ${project.version}</name>
|
<name>canal admin module for otter ${project.version}</name>
|
||||||
<modules>
|
<modules>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@@ -54,6 +54,11 @@
|
|||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.yaml</groupId>
|
||||||
|
<artifactId>snakeyaml</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.diffblue</groupId>
|
<groupId>com.diffblue</groupId>
|
||||||
<artifactId>deeptestutils</artifactId>
|
<artifactId>deeptestutils</artifactId>
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
package com.alibaba.otter.canal.client.adapter.support;
|
package com.alibaba.otter.canal.client.adapter.support;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class YamlUtilsTest {
|
public class YamlUtilsTest {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoadConfigToYml() {
|
public void testLoadConfigToYml() {
|
||||||
String configStr="dataSourceKey: defaultDS\n"
|
String configStr="dataSourceKey: defaultDS\n"
|
||||||
@@ -17,6 +20,7 @@ public class YamlUtilsTest {
|
|||||||
+ "outerAdapterKey: mysql1\n"
|
+ "outerAdapterKey: mysql1\n"
|
||||||
+ "concurrent: true\n"
|
+ "concurrent: true\n"
|
||||||
+ "dbMapping:\n"
|
+ "dbMapping:\n"
|
||||||
|
+ " _id: _id\n"
|
||||||
+ " database: mytest\n"
|
+ " database: mytest\n"
|
||||||
+ " table: user\n"
|
+ " table: user\n"
|
||||||
+ " targetTable: mytest2.user\n"
|
+ " targetTable: mytest2.user\n"
|
||||||
@@ -35,6 +39,7 @@ public class YamlUtilsTest {
|
|||||||
MappingConfig config = YamlUtils.ymlToObj(null, configStr, MappingConfig.class, null, new Properties());
|
MappingConfig config = YamlUtils.ymlToObj(null, configStr, MappingConfig.class, null, new Properties());
|
||||||
|
|
||||||
Assert.assertNotNull(config);
|
Assert.assertNotNull(config);
|
||||||
|
Assert.assertEquals(config.getDbMapping().getId(), "_id");
|
||||||
Assert.assertEquals(config.getDestination(), "example");
|
Assert.assertEquals(config.getDestination(), "example");
|
||||||
Assert.assertEquals(config.getOuterAdapterKey(), "mysql1");
|
Assert.assertEquals(config.getOuterAdapterKey(), "mysql1");
|
||||||
Assert.assertEquals(config.getDbMapping().getDatabase(), "mytest");
|
Assert.assertEquals(config.getDbMapping().getDatabase(), "mytest");
|
||||||
@@ -104,6 +109,9 @@ public class YamlUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static class DbMapping {
|
private static class DbMapping {
|
||||||
|
|
||||||
|
@Value("${_id}")
|
||||||
|
private String id ;
|
||||||
private boolean mirrorDb = false; // 是否镜像库
|
private boolean mirrorDb = false; // 是否镜像库
|
||||||
private String database; // 数据库名或schema名
|
private String database; // 数据库名或schema名
|
||||||
private String table; // 表名
|
private String table; // 表名
|
||||||
@@ -225,5 +233,13 @@ public class YamlUtilsTest {
|
|||||||
public void setAllMapColumns(Map<String, String> allMapColumns) {
|
public void setAllMapColumns(Map<String, String> allMapColumns) {
|
||||||
this.allMapColumns = allMapColumns;
|
this.allMapColumns = allMapColumns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -59,12 +59,12 @@ public class ES6xAdapter extends ESAdapter {
|
|||||||
public Map<String, Object> count(String task) {
|
public Map<String, Object> count(String task) {
|
||||||
ESSyncConfig config = esSyncConfig.get(task);
|
ESSyncConfig config = esSyncConfig.get(task);
|
||||||
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
||||||
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.get_index(), mapping.get_type()).size(0)
|
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.getIndex(), mapping.getType()).size(0)
|
||||||
.getResponse();
|
.getResponse();
|
||||||
|
|
||||||
long rowCount = response.getHits().getTotalHits();
|
long rowCount = response.getHits().getTotalHits();
|
||||||
Map<String, Object> res = new LinkedHashMap<>();
|
Map<String, Object> res = new LinkedHashMap<>();
|
||||||
res.put("esIndex", mapping.get_index());
|
res.put("esIndex", mapping.getIndex());
|
||||||
res.put("count", rowCount);
|
res.put("count", rowCount);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
|
|
||||||
public EtlResult importData(List<String> params) {
|
public EtlResult importData(List<String> params) {
|
||||||
ESMapping mapping = config.getEsMapping();
|
ESMapping mapping = config.getEsMapping();
|
||||||
logger.info("start etl to import data to index: {}", mapping.get_index());
|
logger.info("start etl to import data to index: {}", mapping.getIndex());
|
||||||
String sql = mapping.getSql();
|
String sql = mapping.getSql();
|
||||||
return importData(sql, params);
|
return importData(sql, params);
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 如果是主键字段则不插入
|
// 如果是主键字段则不插入
|
||||||
if (fieldItem.getFieldName().equals(mapping.get_id())) {
|
if (fieldItem.getFieldName().equals(mapping.getId())) {
|
||||||
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
} else {
|
} else {
|
||||||
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
@@ -117,8 +117,8 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
if (idVal != null) {
|
if (idVal != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
@@ -127,8 +127,8 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
|
|
||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest esIndexRequest = this.esConnection.new ES6xIndexRequest(mapping.get_index(),
|
ESIndexRequest esIndexRequest = this.esConnection.new ES6xIndexRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
idVal.toString()).setSource(esFieldData);
|
idVal.toString()).setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esIndexRequest.setRouting(parentVal);
|
esIndexRequest.setRouting(parentVal);
|
||||||
@@ -137,12 +137,12 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
idVal = esFieldData.get(mapping.getPk());
|
idVal = esFieldData.get(mapping.getPk());
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index(),
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex(),
|
||||||
mapping.get_type()).setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal)).size(10000);
|
mapping.getType()).setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal)).size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
batchBegin = System.currentTimeMillis();
|
batchBegin = System.currentTimeMillis();
|
||||||
esBulkRequest.resetBulk();
|
esBulkRequest.resetBulk();
|
||||||
@@ -180,12 +180,12 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(e.getMessage(), e);
|
logger.error(e.getMessage(), e);
|
||||||
errMsg.add(mapping.get_index() + " etl failed! ==>" + e.getMessage());
|
errMsg.add(mapping.getIndex() + " etl failed! ==>" + e.getMessage());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
|
|||||||
@@ -66,19 +66,19 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insert(ESSyncConfig.ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void insert(ESSyncConfig.ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest updateRequest = esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest updateRequest = esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
updateRequest.setRouting(parentVal);
|
updateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(updateRequest);
|
getBulk().add(updateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest indexRequest = esConnection.new ES6xIndexRequest(mapping.get_index(),
|
ESIndexRequest indexRequest = esConnection.new ES6xIndexRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
pkVal.toString()).setSource(esFieldData);
|
pkVal.toString()).setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
indexRequest.setRouting(parentVal);
|
indexRequest.setRouting(parentVal);
|
||||||
@@ -87,13 +87,13 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index(),
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex(),
|
||||||
mapping.get_type()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
mapping.getType()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
|
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -150,19 +150,19 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete(ESSyncConfig.ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void delete(ESSyncConfig.ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
ESDeleteRequest esDeleteRequest = this.esConnection.new ES6xDeleteRequest(mapping.get_index(),
|
ESDeleteRequest esDeleteRequest = this.esConnection.new ES6xDeleteRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
pkVal.toString());
|
pkVal.toString());
|
||||||
getBulk().add(esDeleteRequest);
|
getBulk().add(esDeleteRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index(),
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex(),
|
||||||
mapping.get_type()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
mapping.getType()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -207,7 +207,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet,
|
public Object getESDataFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -216,7 +216,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -231,7 +231,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
@Override
|
@Override
|
||||||
public Object getIdValFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet) throws SQLException {
|
public Object getIdValFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -248,7 +248,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
public Object getESDataFromRS(ESSyncConfig.ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
if (fieldItem.getFieldName().equals(idFieldName)) {
|
if (fieldItem.getFieldName().equals(idFieldName)) {
|
||||||
@@ -294,7 +294,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromDmlData(ESSyncConfig.ESMapping mapping, Map<String, Object> dmlData,
|
public Object getESDataFromDmlData(ESSyncConfig.ESMapping mapping, Map<String, Object> dmlData,
|
||||||
Map<String, Object> esFieldData) {
|
Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
||||||
@@ -304,7 +304,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -319,7 +319,7 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromDmlData(ESSyncConfig.ESMapping mapping,String owner, Map<String, Object> dmlData,
|
public Object getESDataFromDmlData(ESSyncConfig.ESMapping mapping,String owner, Map<String, Object> dmlData,
|
||||||
Map<String, Object> dmlOld, Map<String, Object> esFieldData) {
|
Map<String, Object> dmlOld, Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
||||||
@@ -353,19 +353,19 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
pkVal.toString()).setDoc(esFieldData);
|
pkVal.toString()).setDoc(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
@@ -373,12 +373,12 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index(),
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex(),
|
||||||
mapping.get_type()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
mapping.getType()).setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal)).size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES6xUpdateRequest(mapping.getIndex(),
|
||||||
mapping.get_type(),
|
mapping.getType(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -394,15 +394,15 @@ public class ES6xTemplate implements ESTemplate {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private String getEsType(ESMapping mapping, String fieldName) {
|
private String getEsType(ESMapping mapping, String fieldName) {
|
||||||
String key = mapping.get_index() + "-" + mapping.get_type();
|
String key = mapping.getIndex() + "-" + mapping.getType();
|
||||||
Map<String, String> fieldType = esFieldTypes.get(key);
|
Map<String, String> fieldType = esFieldTypes.get(key);
|
||||||
if (fieldType != null) {
|
if (fieldType != null) {
|
||||||
return fieldType.get(fieldName);
|
return fieldType.get(fieldName);
|
||||||
} else {
|
} else {
|
||||||
MappingMetaData mappingMetaData = esConnection.getMapping(mapping.get_index(), mapping.get_type());
|
MappingMetaData mappingMetaData = esConnection.getMapping(mapping.getIndex(), mapping.getType());
|
||||||
|
|
||||||
if (mappingMetaData == null) {
|
if (mappingMetaData == null) {
|
||||||
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.get_index());
|
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.getIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldType = new LinkedHashMap<>();
|
fieldType = new LinkedHashMap<>();
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ public class ConfigLoadTest {
|
|||||||
Assert.assertNotNull(config);
|
Assert.assertNotNull(config);
|
||||||
Assert.assertEquals("defaultDS", config.getDataSourceKey());
|
Assert.assertEquals("defaultDS", config.getDataSourceKey());
|
||||||
ESSyncConfig.ESMapping esMapping = config.getEsMapping();
|
ESSyncConfig.ESMapping esMapping = config.getEsMapping();
|
||||||
Assert.assertEquals("mytest_user", esMapping.get_index());
|
Assert.assertEquals("mytest_user", esMapping.getIndex());
|
||||||
Assert.assertEquals("_doc", esMapping.get_type());
|
Assert.assertEquals("_doc", esMapping.getType());
|
||||||
Assert.assertEquals("id", esMapping.get_id());
|
Assert.assertEquals("id", esMapping.getId());
|
||||||
Assert.assertNotNull(esMapping.getSql());
|
Assert.assertNotNull(esMapping.getSql());
|
||||||
|
|
||||||
// Map<String, List<ESSyncConfig>> dbTableEsSyncConfig =
|
// Map<String, List<ESSyncConfig>> dbTableEsSyncConfig =
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -59,11 +59,11 @@ public class ES7xAdapter extends ESAdapter {
|
|||||||
public Map<String, Object> count(String task) {
|
public Map<String, Object> count(String task) {
|
||||||
ESSyncConfig config = esSyncConfig.get(task);
|
ESSyncConfig config = esSyncConfig.get(task);
|
||||||
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
||||||
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.get_index()).size(0).getResponse();
|
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.getIndex()).size(0).getResponse();
|
||||||
|
|
||||||
long rowCount = response.getHits().getTotalHits().value;
|
long rowCount = response.getHits().getTotalHits().value;
|
||||||
Map<String, Object> res = new LinkedHashMap<>();
|
Map<String, Object> res = new LinkedHashMap<>();
|
||||||
res.put("esIndex", mapping.get_index());
|
res.put("esIndex", mapping.getIndex());
|
||||||
res.put("count", rowCount);
|
res.put("count", rowCount);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
|
|
||||||
public EtlResult importData(List<String> params) {
|
public EtlResult importData(List<String> params) {
|
||||||
ESMapping mapping = config.getEsMapping();
|
ESMapping mapping = config.getEsMapping();
|
||||||
logger.info("start etl to import data to index: {}", mapping.get_index());
|
logger.info("start etl to import data to index: {}", mapping.getIndex());
|
||||||
String sql = mapping.getSql();
|
String sql = mapping.getSql();
|
||||||
return importData(sql, params);
|
return importData(sql, params);
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 如果是主键字段则不插入
|
// 如果是主键字段则不插入
|
||||||
if (fieldItem.getFieldName().equals(mapping.get_id())) {
|
if (fieldItem.getFieldName().equals(mapping.getId())) {
|
||||||
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
} else {
|
} else {
|
||||||
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
@@ -118,7 +118,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
@@ -128,7 +128,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest esIndexRequest = this.esConnection.new ES7xIndexRequest(
|
ESIndexRequest esIndexRequest = this.esConnection.new ES7xIndexRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal.toString()).setSource(esFieldData);
|
idVal.toString()).setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esIndexRequest.setRouting(parentVal);
|
esIndexRequest.setRouting(parentVal);
|
||||||
@@ -137,13 +137,13 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
idVal = esFieldData.get(mapping.getPk());
|
idVal = esFieldData.get(mapping.getPk());
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
batchBegin = System.currentTimeMillis();
|
batchBegin = System.currentTimeMillis();
|
||||||
esBulkRequest.resetBulk();
|
esBulkRequest.resetBulk();
|
||||||
@@ -182,12 +182,12 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(e.getMessage(), e);
|
logger.error(e.getMessage(), e);
|
||||||
errMsg.add(mapping.get_index() + " etl failed! ==>" + e.getMessage());
|
errMsg.add(mapping.getIndex() + " etl failed! ==>" + e.getMessage());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
|
|||||||
@@ -66,17 +66,17 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insert(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void insert(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest updateRequest = esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest updateRequest = esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
updateRequest.setRouting(parentVal);
|
updateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(updateRequest);
|
getBulk().add(updateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest indexRequest = esConnection.new ES7xIndexRequest(mapping.get_index(), pkVal.toString())
|
ESIndexRequest indexRequest = esConnection.new ES7xIndexRequest(mapping.getIndex(), pkVal.toString())
|
||||||
.setSource(esFieldData);
|
.setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
indexRequest.setRouting(parentVal);
|
indexRequest.setRouting(parentVal);
|
||||||
@@ -85,13 +85,13 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
|
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -148,18 +148,18 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void delete(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
ESDeleteRequest esDeleteRequest = this.esConnection.new ES7xDeleteRequest(mapping.get_index(),
|
ESDeleteRequest esDeleteRequest = this.esConnection.new ES7xDeleteRequest(mapping.getIndex(),
|
||||||
pkVal.toString());
|
pkVal.toString());
|
||||||
getBulk().add(esDeleteRequest);
|
getBulk().add(esDeleteRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -204,7 +204,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet,
|
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -213,7 +213,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
@Override
|
@Override
|
||||||
public Object getIdValFromRS(ESMapping mapping, ResultSet resultSet) throws SQLException {
|
public Object getIdValFromRS(ESMapping mapping, ResultSet resultSet) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -245,7 +245,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
if (fieldItem.getFieldName().equals(idFieldName)) {
|
if (fieldItem.getFieldName().equals(idFieldName)) {
|
||||||
@@ -289,7 +289,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
@Override
|
@Override
|
||||||
public Object getESDataFromDmlData(ESMapping mapping, Map<String, Object> dmlData, Map<String, Object> esFieldData) {
|
public Object getESDataFromDmlData(ESMapping mapping, Map<String, Object> dmlData, Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
||||||
@@ -299,7 +299,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -314,7 +314,7 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromDmlData(ESMapping mapping,String owner, Map<String, Object> dmlData, Map<String, Object> dmlOld,
|
public Object getESDataFromDmlData(ESMapping mapping,String owner, Map<String, Object> dmlData, Map<String, Object> dmlOld,
|
||||||
Map<String, Object> esFieldData) {
|
Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
||||||
@@ -348,17 +348,17 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData);
|
pkVal.toString()).setDoc(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
@@ -366,12 +366,12 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES7xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -387,15 +387,15 @@ public class ES7xTemplate implements ESTemplate {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private String getEsType(ESMapping mapping, String fieldName) {
|
private String getEsType(ESMapping mapping, String fieldName) {
|
||||||
String key = mapping.get_index() + "-" + mapping.get_type();
|
String key = mapping.getIndex() + "-" + mapping.getType();
|
||||||
Map<String, String> fieldType = esFieldTypes.get(key);
|
Map<String, String> fieldType = esFieldTypes.get(key);
|
||||||
if (fieldType != null) {
|
if (fieldType != null) {
|
||||||
return fieldType.get(fieldName);
|
return fieldType.get(fieldName);
|
||||||
} else {
|
} else {
|
||||||
MappingMetaData mappingMetaData = esConnection.getMapping(mapping.get_index());
|
MappingMetaData mappingMetaData = esConnection.getMapping(mapping.getIndex());
|
||||||
|
|
||||||
if (mappingMetaData == null) {
|
if (mappingMetaData == null) {
|
||||||
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.get_index());
|
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.getIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldType = new LinkedHashMap<>();
|
fieldType = new LinkedHashMap<>();
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -53,11 +53,11 @@ public class ES8xAdapter extends ESAdapter {
|
|||||||
public Map<String, Object> count(String task) {
|
public Map<String, Object> count(String task) {
|
||||||
ESSyncConfig config = esSyncConfig.get(task);
|
ESSyncConfig config = esSyncConfig.get(task);
|
||||||
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
ESSyncConfig.ESMapping mapping = config.getEsMapping();
|
||||||
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.get_index()).size(0).getResponse();
|
SearchResponse response = this.esConnection.new ESSearchRequest(mapping.getIndex()).size(0).getResponse();
|
||||||
|
|
||||||
long rowCount = response.getHits().getTotalHits().value;
|
long rowCount = response.getHits().getTotalHits().value;
|
||||||
Map<String, Object> res = new LinkedHashMap<>();
|
Map<String, Object> res = new LinkedHashMap<>();
|
||||||
res.put("esIndex", mapping.get_index());
|
res.put("esIndex", mapping.getIndex());
|
||||||
res.put("count", rowCount);
|
res.put("count", rowCount);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
|
|
||||||
public EtlResult importData(List<String> params) {
|
public EtlResult importData(List<String> params) {
|
||||||
ESMapping mapping = config.getEsMapping();
|
ESMapping mapping = config.getEsMapping();
|
||||||
logger.info("start etl to import data to index: {}", mapping.get_index());
|
logger.info("start etl to import data to index: {}", mapping.getIndex());
|
||||||
String sql = mapping.getSql();
|
String sql = mapping.getSql();
|
||||||
return importData(sql, params);
|
return importData(sql, params);
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 如果是主键字段则不插入
|
// 如果是主键字段则不插入
|
||||||
if (fieldItem.getFieldName().equals(mapping.get_id())) {
|
if (fieldItem.getFieldName().equals(mapping.getId())) {
|
||||||
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
idVal = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
} else {
|
} else {
|
||||||
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
Object val = esTemplate.getValFromRS(mapping, rs, fieldName, fieldName);
|
||||||
@@ -118,7 +118,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
idVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
@@ -128,7 +128,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest esIndexRequest = this.esConnection.new ES8xIndexRequest(
|
ESIndexRequest esIndexRequest = this.esConnection.new ES8xIndexRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal.toString()).setSource(esFieldData);
|
idVal.toString()).setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esIndexRequest.setRouting(parentVal);
|
esIndexRequest.setRouting(parentVal);
|
||||||
@@ -137,13 +137,13 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
idVal = esFieldData.get(mapping.getPk());
|
idVal = esFieldData.get(mapping.getPk());
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), idVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
esBulkRequest.add(esUpdateRequest);
|
esBulkRequest.add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
batchBegin = System.currentTimeMillis();
|
batchBegin = System.currentTimeMillis();
|
||||||
esBulkRequest.resetBulk();
|
esBulkRequest.resetBulk();
|
||||||
@@ -182,12 +182,12 @@ public class ESEtlService extends AbstractEtlService {
|
|||||||
(System.currentTimeMillis() - batchBegin),
|
(System.currentTimeMillis() - batchBegin),
|
||||||
(System.currentTimeMillis() - esBatchBegin),
|
(System.currentTimeMillis() - esBatchBegin),
|
||||||
esBulkRequest.numberOfActions(),
|
esBulkRequest.numberOfActions(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(e.getMessage(), e);
|
logger.error(e.getMessage(), e);
|
||||||
errMsg.add(mapping.get_index() + " etl failed! ==>" + e.getMessage());
|
errMsg.add(mapping.getIndex() + " etl failed! ==>" + e.getMessage());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
|
|||||||
@@ -62,17 +62,17 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insert(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void insert(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest updateRequest = esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest updateRequest = esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
updateRequest.setRouting(parentVal);
|
updateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(updateRequest);
|
getBulk().add(updateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESIndexRequest indexRequest = esConnection.new ES8xIndexRequest(mapping.get_index(), pkVal.toString())
|
ESIndexRequest indexRequest = esConnection.new ES8xIndexRequest(mapping.getIndex(), pkVal.toString())
|
||||||
.setSource(esFieldData);
|
.setSource(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
indexRequest.setRouting(parentVal);
|
indexRequest.setRouting(parentVal);
|
||||||
@@ -81,13 +81,13 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
|
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -144,18 +144,18 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
public void delete(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
ESDeleteRequest esDeleteRequest = this.esConnection.new ES8xDeleteRequest(mapping.get_index(),
|
ESDeleteRequest esDeleteRequest = this.esConnection.new ES8xDeleteRequest(mapping.getIndex(),
|
||||||
pkVal.toString());
|
pkVal.toString());
|
||||||
getBulk().add(esDeleteRequest);
|
getBulk().add(esDeleteRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
commitBulk();
|
commitBulk();
|
||||||
@@ -200,7 +200,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet,
|
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -209,7 +209,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -224,7 +224,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
@Override
|
@Override
|
||||||
public Object getIdValFromRS(ESMapping mapping, ResultSet resultSet) throws SQLException {
|
public Object getIdValFromRS(ESMapping mapping, ResultSet resultSet) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
Object value = getValFromRS(mapping, resultSet, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
@@ -241,7 +241,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
public Object getESDataFromRS(ESMapping mapping, ResultSet resultSet, Map<String, Object> dmlOld,
|
||||||
Map<String, Object> esFieldData) throws SQLException {
|
Map<String, Object> esFieldData) throws SQLException {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
if (fieldItem.getFieldName().equals(idFieldName)) {
|
if (fieldItem.getFieldName().equals(idFieldName)) {
|
||||||
@@ -286,7 +286,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromDmlData(ESMapping mapping, Map<String, Object> dmlData,
|
public Object getESDataFromDmlData(ESMapping mapping, Map<String, Object> dmlData,
|
||||||
Map<String, Object> esFieldData) {
|
Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();
|
||||||
@@ -296,7 +296,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
resultIdVal = value;
|
resultIdVal = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldItem.getFieldName().equals(mapping.get_id())
|
if (!fieldItem.getFieldName().equals(mapping.getId())
|
||||||
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
&& !mapping.getSkips().contains(fieldItem.getFieldName())) {
|
||||||
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
esFieldData.put(Util.cleanColumn(fieldItem.getFieldName()), value);
|
||||||
}
|
}
|
||||||
@@ -311,7 +311,7 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
public Object getESDataFromDmlData(ESMapping mapping, String owner, Map<String, Object> dmlData,
|
public Object getESDataFromDmlData(ESMapping mapping, String owner, Map<String, Object> dmlData,
|
||||||
Map<String, Object> dmlOld, Map<String, Object> esFieldData) {
|
Map<String, Object> dmlOld, Map<String, Object> esFieldData) {
|
||||||
SchemaItem schemaItem = mapping.getSchemaItem();
|
SchemaItem schemaItem = mapping.getSchemaItem();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
Object resultIdVal = null;
|
Object resultIdVal = null;
|
||||||
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
for (FieldItem fieldItem : schemaItem.getSelectFields().values()) {
|
||||||
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
ColumnItem columnItem = fieldItem.getColumnItems().iterator().next();
|
||||||
@@ -345,17 +345,17 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
private void append4Update(ESMapping mapping, Object pkVal, Map<String, Object> esFieldData) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
String parentVal = (String) esFieldData.remove("$parent_routing");
|
String parentVal = (String) esFieldData.remove("$parent_routing");
|
||||||
if (mapping.isUpsert()) {
|
if (mapping.isUpsert()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
pkVal.toString()).setDoc(esFieldData).setDocAsUpsert(true);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
}
|
}
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
} else {
|
} else {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
pkVal.toString()).setDoc(esFieldData);
|
pkVal.toString()).setDoc(esFieldData);
|
||||||
if (StringUtils.isNotEmpty(parentVal)) {
|
if (StringUtils.isNotEmpty(parentVal)) {
|
||||||
esUpdateRequest.setRouting(parentVal);
|
esUpdateRequest.setRouting(parentVal);
|
||||||
@@ -363,12 +363,12 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.get_index())
|
ESSearchRequest esSearchRequest = this.esConnection.new ESSearchRequest(mapping.getIndex())
|
||||||
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
.setQuery(QueryBuilders.termQuery(mapping.getPk(), pkVal))
|
||||||
.size(10000);
|
.size(10000);
|
||||||
SearchResponse response = esSearchRequest.getResponse();
|
SearchResponse response = esSearchRequest.getResponse();
|
||||||
for (SearchHit hit : response.getHits()) {
|
for (SearchHit hit : response.getHits()) {
|
||||||
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.get_index(),
|
ESUpdateRequest esUpdateRequest = this.esConnection.new ES8xUpdateRequest(mapping.getIndex(),
|
||||||
hit.getId()).setDoc(esFieldData);
|
hit.getId()).setDoc(esFieldData);
|
||||||
getBulk().add(esUpdateRequest);
|
getBulk().add(esUpdateRequest);
|
||||||
}
|
}
|
||||||
@@ -384,15 +384,15 @@ public class ES8xTemplate implements ESTemplate {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private String getEsType(ESMapping mapping, String fieldName) {
|
private String getEsType(ESMapping mapping, String fieldName) {
|
||||||
String key = mapping.get_index() + "-" + mapping.get_type();
|
String key = mapping.getIndex() + "-" + mapping.getType();
|
||||||
Map<String, String> fieldType = esFieldTypes.get(key);
|
Map<String, String> fieldType = esFieldTypes.get(key);
|
||||||
if (fieldType != null) {
|
if (fieldType != null) {
|
||||||
return fieldType.get(fieldName);
|
return fieldType.get(fieldName);
|
||||||
} else {
|
} else {
|
||||||
MappingMetadata mappingMetaData = esConnection.getMapping(mapping.get_index());
|
MappingMetadata mappingMetaData = esConnection.getMapping(mapping.getIndex());
|
||||||
|
|
||||||
if (mappingMetaData == null) {
|
if (mappingMetaData == null) {
|
||||||
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.get_index());
|
throw new IllegalArgumentException("Not found the mapping info of index: " + mapping.getIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldType = new LinkedHashMap<>();
|
fieldType = new LinkedHashMap<>();
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.alibaba.otter.canal.client.adapter.support.AdapterConfig;
|
import com.alibaba.otter.canal.client.adapter.support.AdapterConfig;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ES 映射配置
|
* ES 映射配置
|
||||||
@@ -28,13 +29,13 @@ public class ESSyncConfig implements AdapterConfig {
|
|||||||
private String esVersion = "es6";
|
private String esVersion = "es6";
|
||||||
|
|
||||||
public void validate() {
|
public void validate() {
|
||||||
if (esMapping._index == null) {
|
if (esMapping.index == null) {
|
||||||
throw new NullPointerException("esMapping._index");
|
throw new NullPointerException("esMapping._index");
|
||||||
}
|
}
|
||||||
if ("es6".equals(esVersion) && esMapping._type == null) {
|
if ("es6".equals(esVersion) && esMapping.type == null) {
|
||||||
throw new NullPointerException("esMapping._type");
|
throw new NullPointerException("esMapping._type");
|
||||||
}
|
}
|
||||||
if (esMapping._id == null && esMapping.getPk() == null) {
|
if (esMapping.id == null && esMapping.getPk() == null) {
|
||||||
throw new NullPointerException("esMapping._id or esMapping.pk");
|
throw new NullPointerException("esMapping._id or esMapping.pk");
|
||||||
}
|
}
|
||||||
if (esMapping.sql == null) {
|
if (esMapping.sql == null) {
|
||||||
@@ -96,9 +97,14 @@ public class ESSyncConfig implements AdapterConfig {
|
|||||||
|
|
||||||
public static class ESMapping implements AdapterMapping {
|
public static class ESMapping implements AdapterMapping {
|
||||||
|
|
||||||
private String _index;
|
@Value("${_index}")
|
||||||
private String _type;
|
private String index;
|
||||||
private String _id;
|
|
||||||
|
@Value("${_type}")
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
@Value("${_id}")
|
||||||
|
private String id;
|
||||||
private boolean upsert = false;
|
private boolean upsert = false;
|
||||||
private String pk;
|
private String pk;
|
||||||
private Map<String, RelationMapping> relations = new LinkedHashMap<>();
|
private Map<String, RelationMapping> relations = new LinkedHashMap<>();
|
||||||
@@ -114,28 +120,28 @@ public class ESSyncConfig implements AdapterConfig {
|
|||||||
|
|
||||||
private SchemaItem schemaItem; // sql解析结果模型
|
private SchemaItem schemaItem; // sql解析结果模型
|
||||||
|
|
||||||
public String get_index() {
|
public String getIndex() {
|
||||||
return _index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_index(String _index) {
|
public void setIndex(String index) {
|
||||||
this._index = _index;
|
this.index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String get_type() {
|
public String getType() {
|
||||||
return _type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_type(String _type) {
|
public void setType(String type) {
|
||||||
this._type = _type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String get_id() {
|
public String getId() {
|
||||||
return _id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set_id(String _id) {
|
public void setId(String id) {
|
||||||
this._id = _id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isUpsert() {
|
public boolean isUpsert() {
|
||||||
|
|||||||
@@ -136,8 +136,8 @@ public class SchemaItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FieldItem getIdFieldItem(ESSyncConfig.ESMapping mapping) {
|
public FieldItem getIdFieldItem(ESSyncConfig.ESMapping mapping) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
return getSelectFields().get(mapping.get_id());
|
return getSelectFields().get(mapping.getId());
|
||||||
} else {
|
} else {
|
||||||
return getSelectFields().get(mapping.getPk());
|
return getSelectFields().get(mapping.getPk());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,13 +54,13 @@ public class ESSyncService {
|
|||||||
for (ESSyncConfig config : esSyncConfigs) {
|
for (ESSyncConfig config : esSyncConfigs) {
|
||||||
if (logger.isTraceEnabled()) {
|
if (logger.isTraceEnabled()) {
|
||||||
logger.trace("Prepared to sync index: {}, destination: {}",
|
logger.trace("Prepared to sync index: {}, destination: {}",
|
||||||
config.getEsMapping().get_index(),
|
config.getEsMapping().getIndex(),
|
||||||
dml.getDestination());
|
dml.getDestination());
|
||||||
}
|
}
|
||||||
this.sync(config, dml);
|
this.sync(config, dml);
|
||||||
if (logger.isTraceEnabled()) {
|
if (logger.isTraceEnabled()) {
|
||||||
logger.trace("Sync completed: {}, destination: {}",
|
logger.trace("Sync completed: {}, destination: {}",
|
||||||
config.getEsMapping().get_index(),
|
config.getEsMapping().getIndex(),
|
||||||
dml.getDestination());
|
dml.getDestination());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ public class ESSyncService {
|
|||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
StringBuilder configIndexes = new StringBuilder();
|
StringBuilder configIndexes = new StringBuilder();
|
||||||
esSyncConfigs
|
esSyncConfigs
|
||||||
.forEach(esSyncConfig -> configIndexes.append(esSyncConfig.getEsMapping().get_index()).append(" "));
|
.forEach(esSyncConfig -> configIndexes.append(esSyncConfig.getEsMapping().getIndex()).append(" "));
|
||||||
logger.debug("DML: {} \nAffected indexes: {}",
|
logger.debug("DML: {} \nAffected indexes: {}",
|
||||||
JSON.toJSONString(dml, JSONWriter.Feature.WriteNulls),
|
JSON.toJSONString(dml, JSONWriter.Feature.WriteNulls),
|
||||||
configIndexes.toString());
|
configIndexes.toString());
|
||||||
@@ -105,10 +105,10 @@ public class ESSyncService {
|
|||||||
logger.trace("Sync elapsed time: {} ms,destination: {}, es index: {}",
|
logger.trace("Sync elapsed time: {} ms,destination: {}, es index: {}",
|
||||||
(System.currentTimeMillis() - begin),
|
(System.currentTimeMillis() - begin),
|
||||||
dml.getDestination(),
|
dml.getDestination(),
|
||||||
config.getEsMapping().get_index());
|
config.getEsMapping().getIndex());
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.error("sync error, es index: {}, DML : {}", config.getEsMapping().get_index(), dml);
|
logger.error("sync error, es index: {}, DML : {}", config.getEsMapping().getIndex(), dml);
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,7 +210,7 @@ public class ESSyncService {
|
|||||||
// ------主表 查询sql来更新------
|
// ------主表 查询sql来更新------
|
||||||
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
||||||
ESMapping mapping = config.getEsMapping();
|
ESMapping mapping = config.getEsMapping();
|
||||||
String idFieldName = mapping.get_id() == null ? mapping.getPk() : mapping.get_id();
|
String idFieldName = mapping.getId() == null ? mapping.getPk() : mapping.getId();
|
||||||
FieldItem idFieldItem = schemaItem.getSelectFields().get(idFieldName);
|
FieldItem idFieldItem = schemaItem.getSelectFields().get(idFieldName);
|
||||||
|
|
||||||
boolean idFieldSimple = true;
|
boolean idFieldSimple = true;
|
||||||
@@ -336,7 +336,7 @@ public class ESSyncService {
|
|||||||
|
|
||||||
// ------是主表------
|
// ------是主表------
|
||||||
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
if (schemaItem.getMainTable().getTableName().equalsIgnoreCase(dml.getTable())) {
|
||||||
if (mapping.get_id() != null) {
|
if (mapping.getId() != null) {
|
||||||
FieldItem idFieldItem = schemaItem.getIdFieldItem(mapping);
|
FieldItem idFieldItem = schemaItem.getIdFieldItem(mapping);
|
||||||
// 主键为简单字段
|
// 主键为简单字段
|
||||||
if (!idFieldItem.isMethod() && !idFieldItem.isBinaryOp()) {
|
if (!idFieldItem.isMethod() && !idFieldItem.isBinaryOp()) {
|
||||||
@@ -349,7 +349,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, id: {}",
|
logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.delete(mapping, idVal, null);
|
esTemplate.delete(mapping, idVal, null);
|
||||||
@@ -368,7 +368,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, pk: {}",
|
logger.trace("Main table delete es index, destination:{}, table: {}, index: {}, pk: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
pkVal);
|
pkVal);
|
||||||
}
|
}
|
||||||
esFieldData.remove(pkFieldItem.getFieldName());
|
esFieldData.remove(pkFieldItem.getFieldName());
|
||||||
@@ -438,7 +438,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Single table insert to es index, destination:{}, table: {}, index: {}, id: {}",
|
logger.trace("Single table insert to es index, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.insert(mapping, idVal, esFieldData);
|
esTemplate.insert(mapping, idVal, esFieldData);
|
||||||
@@ -461,7 +461,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table insert to es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
logger.trace("Main table insert to es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
sql.replace("\n", " "));
|
sql.replace("\n", " "));
|
||||||
}
|
}
|
||||||
Util.sqlRS(ds, sql, rs -> {
|
Util.sqlRS(ds, sql, rs -> {
|
||||||
@@ -475,7 +475,7 @@ public class ESSyncService {
|
|||||||
"Main table insert to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
"Main table insert to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.insert(mapping, idVal, esFieldData);
|
esTemplate.insert(mapping, idVal, esFieldData);
|
||||||
@@ -497,7 +497,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table delete es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
logger.trace("Main table delete es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
sql.replace("\n", " "));
|
sql.replace("\n", " "));
|
||||||
}
|
}
|
||||||
Util.sqlRS(ds, sql, rs -> {
|
Util.sqlRS(ds, sql, rs -> {
|
||||||
@@ -519,7 +519,7 @@ public class ESSyncService {
|
|||||||
"Main table delete to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
"Main table delete to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.delete(mapping, idVal, esFieldData);
|
esTemplate.delete(mapping, idVal, esFieldData);
|
||||||
@@ -554,7 +554,7 @@ public class ESSyncService {
|
|||||||
|
|
||||||
String fieldName = fieldItem.getFieldName();
|
String fieldName = fieldItem.getFieldName();
|
||||||
// 判断是否是主键
|
// 判断是否是主键
|
||||||
if (fieldName.equals(mapping.get_id())) {
|
if (fieldName.equals(mapping.getId())) {
|
||||||
fieldName = "_id";
|
fieldName = "_id";
|
||||||
}
|
}
|
||||||
paramsTmp.put(fieldName, value);
|
paramsTmp.put(fieldName, value);
|
||||||
@@ -566,7 +566,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Join table update es index by foreign key, destination:{}, table: {}, index: {}",
|
logger.trace("Join table update es index by foreign key, destination:{}, table: {}, index: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
||||||
}
|
}
|
||||||
@@ -617,7 +617,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Join table update es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
logger.trace("Join table update es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
sql.toString().replace("\n", " "));
|
sql.toString().replace("\n", " "));
|
||||||
}
|
}
|
||||||
Util.sqlRS(ds, sql.toString(), values, rs -> {
|
Util.sqlRS(ds, sql.toString(), values, rs -> {
|
||||||
@@ -661,7 +661,7 @@ public class ESSyncService {
|
|||||||
entry.getKey().getColumn().getColumnName());
|
entry.getKey().getColumn().getColumnName());
|
||||||
String fieldName = fieldItem.getFieldName();
|
String fieldName = fieldItem.getFieldName();
|
||||||
// 判断是否是主键
|
// 判断是否是主键
|
||||||
if (fieldName.equals(mapping.get_id())) {
|
if (fieldName.equals(mapping.getId())) {
|
||||||
fieldName = "_id";
|
fieldName = "_id";
|
||||||
}
|
}
|
||||||
paramsTmp.put(fieldName, value);
|
paramsTmp.put(fieldName, value);
|
||||||
@@ -673,7 +673,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Join table update es index by query sql, destination:{}, table: {}, index: {}",
|
logger.trace("Join table update es index by query sql, destination:{}, table: {}, index: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
||||||
}
|
}
|
||||||
@@ -721,7 +721,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Join table update es index by query whole sql, destination:{}, table: {}, index: {}, sql: {}",
|
logger.trace("Join table update es index by query whole sql, destination:{}, table: {}, index: {}, sql: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
sql.toString().replace("\n", " "));
|
sql.toString().replace("\n", " "));
|
||||||
}
|
}
|
||||||
Util.sqlRS(ds, sql.toString(), rs -> {
|
Util.sqlRS(ds, sql.toString(), rs -> {
|
||||||
@@ -775,7 +775,7 @@ public class ESSyncService {
|
|||||||
.getValFromRS(mapping, rs, fieldItem.getFieldName(), fieldItem.getFieldName());
|
.getValFromRS(mapping, rs, fieldItem.getFieldName(), fieldItem.getFieldName());
|
||||||
String fieldName = fieldItem.getFieldName();
|
String fieldName = fieldItem.getFieldName();
|
||||||
// 判断是否是主键
|
// 判断是否是主键
|
||||||
if (fieldName.equals(mapping.get_id())) {
|
if (fieldName.equals(mapping.getId())) {
|
||||||
fieldName = "_id";
|
fieldName = "_id";
|
||||||
}
|
}
|
||||||
paramsTmp.put(fieldName, value);
|
paramsTmp.put(fieldName, value);
|
||||||
@@ -787,7 +787,7 @@ public class ESSyncService {
|
|||||||
"Join table update es index by query whole sql, destination:{}, table: {}, index: {}",
|
"Join table update es index by query whole sql, destination:{}, table: {}, index: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index());
|
mapping.getIndex());
|
||||||
}
|
}
|
||||||
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
esTemplate.updateByQuery(config, paramsTmp, esFieldData);
|
||||||
}
|
}
|
||||||
@@ -817,7 +817,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table update to es index, destination:{}, table: {}, index: {}, id: {}",
|
logger.trace("Main table update to es index, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.update(mapping, idVal, esFieldData);
|
esTemplate.update(mapping, idVal, esFieldData);
|
||||||
@@ -840,7 +840,7 @@ public class ESSyncService {
|
|||||||
logger.trace("Main table update to es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
logger.trace("Main table update to es index by query sql, destination:{}, table: {}, index: {}, sql: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
sql.replace("\n", " "));
|
sql.replace("\n", " "));
|
||||||
}
|
}
|
||||||
Util.sqlRS(ds, sql, rs -> {
|
Util.sqlRS(ds, sql, rs -> {
|
||||||
@@ -854,7 +854,7 @@ public class ESSyncService {
|
|||||||
"Main table update to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
"Main table update to es index by query sql, destination:{}, table: {}, index: {}, id: {}",
|
||||||
config.getDestination(),
|
config.getDestination(),
|
||||||
dml.getTable(),
|
dml.getTable(),
|
||||||
mapping.get_index(),
|
mapping.getIndex(),
|
||||||
idVal);
|
idVal);
|
||||||
}
|
}
|
||||||
esTemplate.update(mapping, idVal, esFieldData);
|
esTemplate.update(mapping, idVal, esFieldData);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ esac
|
|||||||
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
||||||
str=`file -L $JAVA | grep 64-bit`
|
str=`file -L $JAVA | grep 64-bit`
|
||||||
|
|
||||||
JAVA_OPTS="$JAVA_OPTS -Xss256k -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
JAVA_OPTS="$JAVA_OPTS -Xss1m -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
||||||
if [ $JavaVersion -ge 11 ] ; then
|
if [ $JavaVersion -ge 11 ] ; then
|
||||||
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
||||||
JAVA_OPTS="$JAVA_OPTS"
|
JAVA_OPTS="$JAVA_OPTS"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>canal client adapter module for otter ${project.version}</name>
|
<name>canal client adapter module for otter ${project.version}</name>
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.postgresql</groupId>
|
<groupId>org.postgresql</groupId>
|
||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
<version>42.3.3</version>
|
<version>42.5.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.oracle.database.jdbc</groupId>
|
<groupId>com.oracle.database.jdbc</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -164,7 +164,8 @@ public class RdbMirrorDbSyncService {
|
|||||||
logger.trace("Execute DDL sql: {} for database: {}", ddl.getSql(), ddl.getDatabase());
|
logger.trace("Execute DDL sql: {} for database: {}", ddl.getSql(), ddl.getDatabase());
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
logger.error("Execute DDL sql failed sql: {} for database: {} cause: {}",
|
||||||
|
ddl.getSql(), ddl.getDatabase(), e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,5 @@
|
|||||||
package com.alibaba.otter.canal.client.adapter.rdb.service;
|
package com.alibaba.otter.canal.client.adapter.rdb.service;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.ResultSetMetaData;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Types;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.alibaba.druid.pool.DruidDataSource;
|
import com.alibaba.druid.pool.DruidDataSource;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONWriter.Feature;
|
import com.alibaba.fastjson2.JSONWriter.Feature;
|
||||||
@@ -30,6 +10,27 @@ import com.alibaba.otter.canal.client.adapter.rdb.support.SingleDml;
|
|||||||
import com.alibaba.otter.canal.client.adapter.rdb.support.SyncUtil;
|
import com.alibaba.otter.canal.client.adapter.rdb.support.SyncUtil;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.Dml;
|
import com.alibaba.otter.canal.client.adapter.support.Dml;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.Util;
|
import com.alibaba.otter.canal.client.adapter.support.Util;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSetMetaData;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Types;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RDB同步操作业务
|
* RDB同步操作业务
|
||||||
@@ -272,7 +273,7 @@ public class RdbSyncService {
|
|||||||
len = insertSql.length();
|
len = insertSql.length();
|
||||||
insertSql.delete(len - 1, len).append(")");
|
insertSql.delete(len - 1, len).append(")");
|
||||||
|
|
||||||
Map<String, Integer> ctype = getTargetColumnType(batchExecutor.getConn(), config);
|
Map<String, Integer> ctype = getTargetColumnTypeByColumns(batchExecutor.getConn(), config, columnsMap);
|
||||||
|
|
||||||
List<Map<String, ?>> values = new ArrayList<>();
|
List<Map<String, ?>> values = new ArrayList<>();
|
||||||
for (Map.Entry<String, String> entry : columnsMap.entrySet()) {
|
for (Map.Entry<String, String> entry : columnsMap.entrySet()) {
|
||||||
@@ -328,7 +329,7 @@ public class RdbSyncService {
|
|||||||
String backtick = SyncUtil.getBacktickByDbType(dataSource.getDbType());
|
String backtick = SyncUtil.getBacktickByDbType(dataSource.getDbType());
|
||||||
Map<String, String> columnsMap = SyncUtil.getColumnsMap(dbMapping, data);
|
Map<String, String> columnsMap = SyncUtil.getColumnsMap(dbMapping, data);
|
||||||
|
|
||||||
Map<String, Integer> ctype = getTargetColumnType(batchExecutor.getConn(), config);
|
Map<String, Integer> ctype = getTargetColumnTypeByColumns(batchExecutor.getConn(), config, columnsMap);
|
||||||
|
|
||||||
StringBuilder updateSql = new StringBuilder();
|
StringBuilder updateSql = new StringBuilder();
|
||||||
updateSql.append("UPDATE ").append(SyncUtil.getDbTableName(dbMapping, dataSource.getDbType())).append(" SET ");
|
updateSql.append("UPDATE ").append(SyncUtil.getDbTableName(dbMapping, dataSource.getDbType())).append(" SET ");
|
||||||
@@ -410,6 +411,57 @@ public class RdbSyncService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain metadata for the corresponding table columns of the target data source
|
||||||
|
* Check if the metadata of the columns in the src is consistent with the metadata cache of the columns in the cache
|
||||||
|
* (first determine the number of columns and then determine if each column is consistent).
|
||||||
|
* If not, reload
|
||||||
|
* @param conn
|
||||||
|
* @param config
|
||||||
|
* @param columnsMap
|
||||||
|
* @date 2024/6/17 14:45
|
||||||
|
*/
|
||||||
|
private Map<String, Integer> getTargetColumnTypeByColumns(Connection conn, MappingConfig config,
|
||||||
|
Map<String, String> columnsMap) {
|
||||||
|
DbMapping dbMapping = config.getDbMapping();
|
||||||
|
String cacheKey = config.getDestination() + "." + dbMapping.getDatabase() + "." + dbMapping.getTable();
|
||||||
|
Map<String, Integer> columnType = getTargetColumnType(conn, config);
|
||||||
|
if(null != columnType && null != columnsMap &&
|
||||||
|
!checkCloumnConsistent(columnType.keySet(), columnsMap.keySet())){
|
||||||
|
logger.info("column meta data not match, reload the column meta data from target db. key:{}", cacheKey);
|
||||||
|
columnsTypeCache.remove(cacheKey);
|
||||||
|
columnType = getTargetColumnType(conn, config);
|
||||||
|
if(null != columnType && null != columnsMap &&
|
||||||
|
!checkCloumnConsistent(columnType.keySet(), columnsMap.keySet())) {
|
||||||
|
logger.info("the column meta data from db still not match. dbdata:{}", columnType.keySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return columnType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断binlog的中的列的数据和缓存的列数据是否一致
|
||||||
|
*
|
||||||
|
* @param <T> 集合元素类型
|
||||||
|
* @param column
|
||||||
|
* @param anotherColumn
|
||||||
|
* @return {@link Boolean}
|
||||||
|
*/
|
||||||
|
public static<T> Boolean checkCloumnConsistent(Collection<T> column, Collection<T> anotherColumn) {
|
||||||
|
if(null == column || null == anotherColumn || column.size() != anotherColumn.size()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Map<T, T> anotherColumnMap = column.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
|
||||||
|
|
||||||
|
for (T t : column) {
|
||||||
|
if(null == anotherColumnMap.get(t)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取目标字段类型
|
* 获取目标字段类型
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class SyncUtil {
|
|||||||
public static Map<String, String> getColumnsMap(MappingConfig.DbMapping dbMapping, Collection<String> columns) {
|
public static Map<String, String> getColumnsMap(MappingConfig.DbMapping dbMapping, Collection<String> columns) {
|
||||||
Map<String, String> columnsMap;
|
Map<String, String> columnsMap;
|
||||||
if (dbMapping.getMapAll()) {
|
if (dbMapping.getMapAll()) {
|
||||||
if (dbMapping.getAllMapColumns() != null) {
|
if (dbMapping.getAllMapColumns() != null && columns.size() == dbMapping.getAllMapColumns().size() ) {
|
||||||
return dbMapping.getAllMapColumns();
|
return dbMapping.getAllMapColumns();
|
||||||
}
|
}
|
||||||
columnsMap = new LinkedHashMap<>();
|
columnsMap = new LinkedHashMap<>();
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.client-adapter</artifactId>
|
<artifactId>canal.client-adapter</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>client-adapter.tablestore</artifactId>
|
<artifactId>client-adapter.tablestore</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>canal client adapter rdb module for otter ${project.version}</name>
|
<name>canal client adapter tablestore module for otter ${project.version}</name>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>canal.common</artifactId>
|
<artifactId>canal.common</artifactId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>canal connector module for otter ${project.version}</name>
|
<name>canal connector module for otter ${project.version}</name>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -72,12 +72,23 @@ public class CanalRabbitMQProducer extends AbstractMQProducer implements CanalMQ
|
|||||||
try {
|
try {
|
||||||
connect = factory.newConnection();
|
connect = factory.newConnection();
|
||||||
channel = connect.createChannel();
|
channel = connect.createChannel();
|
||||||
channel.queueDeclare(rabbitMQProperties.getQueue(), true, false, false, null);
|
String queue=rabbitMQProperties.getQueue();
|
||||||
channel.exchangeDeclare(rabbitMQProperties
|
String exchange=rabbitMQProperties.getExchange();
|
||||||
.getExchange(), rabbitMQProperties.getDeliveryMode(), true, false, false, null);
|
String deliveryMode=rabbitMQProperties.getDeliveryMode();
|
||||||
channel.queueBind(rabbitMQProperties.getQueue(),
|
String routingKey=rabbitMQProperties.getRoutingKey();
|
||||||
rabbitMQProperties.getExchange(),
|
if(!StringUtils.isEmpty(queue))
|
||||||
rabbitMQProperties.getRoutingKey());
|
{
|
||||||
|
channel.queueDeclare(queue, true, false, false, null);
|
||||||
|
}
|
||||||
|
if(!StringUtils.isEmpty(queue)
|
||||||
|
&&!StringUtils.isEmpty(exchange)
|
||||||
|
&&!StringUtils.isEmpty(deliveryMode)
|
||||||
|
&&!StringUtils.isEmpty(routingKey))
|
||||||
|
{
|
||||||
|
channel.exchangeDeclare(exchange, deliveryMode, true, false, false, null);
|
||||||
|
channel.queueBind(queue,exchange,routingKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} catch (IOException | TimeoutException ex) {
|
} catch (IOException | TimeoutException ex) {
|
||||||
throw new CanalException("Start RabbitMQ producer error", ex);
|
throw new CanalException("Start RabbitMQ producer error", ex);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal.connector</artifactId>
|
<artifactId>canal.connector</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ esac
|
|||||||
|
|
||||||
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
||||||
str=`file -L $JAVA | grep 64-bit`
|
str=`file -L $JAVA | grep 64-bit`
|
||||||
JAVA_OPTS="$JAVA_OPTS -Xss256k -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
JAVA_OPTS="$JAVA_OPTS -Xss1m -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
||||||
|
|
||||||
if [ $JavaVersion -ge 11 ] ; then
|
if [ $JavaVersion -ge 11 ] ; then
|
||||||
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ rabbitmq.exchange =
|
|||||||
rabbitmq.username =
|
rabbitmq.username =
|
||||||
rabbitmq.password =
|
rabbitmq.password =
|
||||||
rabbitmq.deliveryMode =
|
rabbitmq.deliveryMode =
|
||||||
|
rabbitmq.queue =
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
|
|||||||
@@ -185,6 +185,9 @@
|
|||||||
<!--表结构相关-->
|
<!--表结构相关-->
|
||||||
<property name="enableTsdb" value="${canal.instance.tsdb.enable:true}"/>
|
<property name="enableTsdb" value="${canal.instance.tsdb.enable:true}"/>
|
||||||
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
||||||
|
<property name="tsdbJdbcUrl" value="${canal.instance.tsdb.url:}"/>
|
||||||
|
<property name="tsdbJdbcUserName" value="${canal.instance.tsdb.dbUsername:}"/>
|
||||||
|
<property name="tsdbJdbcPassword" value="${canal.instance.tsdb.dbPassword:}"/>
|
||||||
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
||||||
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
||||||
|
|
||||||
|
|||||||
@@ -171,6 +171,9 @@
|
|||||||
<!--表结构相关-->
|
<!--表结构相关-->
|
||||||
<property name="enableTsdb" value="${canal.instance.tsdb.enable:true}"/>
|
<property name="enableTsdb" value="${canal.instance.tsdb.enable:true}"/>
|
||||||
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
||||||
|
<property name="tsdbJdbcUrl" value="${canal.instance.tsdb.url:}"/>
|
||||||
|
<property name="tsdbJdbcUserName" value="${canal.instance.tsdb.dbUsername:}"/>
|
||||||
|
<property name="tsdbJdbcPassword" value="${canal.instance.tsdb.dbPassword:}"/>
|
||||||
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
||||||
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
||||||
|
|
||||||
|
|||||||
@@ -159,6 +159,9 @@
|
|||||||
<!--表结构相关-->
|
<!--表结构相关-->
|
||||||
<property name="enableTsdb" value="${canal.instance.tsdb.enable:false}"/>
|
<property name="enableTsdb" value="${canal.instance.tsdb.enable:false}"/>
|
||||||
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
<property name="tsdbSpringXml" value="${canal.instance.tsdb.spring.xml:}"/>
|
||||||
|
<property name="tsdbJdbcUrl" value="${canal.instance.tsdb.url:}"/>
|
||||||
|
<property name="tsdbJdbcUserName" value="${canal.instance.tsdb.dbUsername:}"/>
|
||||||
|
<property name="tsdbJdbcPassword" value="${canal.instance.tsdb.dbPassword:}"/>
|
||||||
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
<property name="tsdbSnapshotInterval" value="${canal.instance.tsdb.snapshot.interval:24}" />
|
||||||
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
<property name="tsdbSnapshotExpire" value="${canal.instance.tsdb.snapshot.expire:360}" />
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
FROM canal/osbase:v2
|
FROM canal/osbase:v3-amd64
|
||||||
|
#FROM canal/osbase:v3-arm64
|
||||||
|
|
||||||
LABEL agapple (jianghang115@gmail.com)
|
LABEL agapple (jianghang115@gmail.com)
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ RUN \
|
|||||||
/bin/rm -f /home/admin/canal.deployer-*.tar.gz && \
|
/bin/rm -f /home/admin/canal.deployer-*.tar.gz && \
|
||||||
|
|
||||||
tar zxvf /tmp/node_exporter.tar.gz -C /home/admin && \
|
tar zxvf /tmp/node_exporter.tar.gz -C /home/admin && \
|
||||||
ln -s /home/admin/node_exporter-0.18.1.linux-arm64 /home/admin/node_exporter && \
|
ln -s /home/admin/node_exporter-1.6.1* /home/admin/node_exporter && \
|
||||||
|
|
||||||
mkdir -p home/admin/canal-server/logs && \
|
mkdir -p home/admin/canal-server/logs && \
|
||||||
chmod +x /home/admin/*.sh && \
|
chmod +x /home/admin/*.sh && \
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
FROM canal/osadmin:v1
|
FROM canal/osadmin:v3-amd64
|
||||||
|
#FROM canal/osadmin:v3-arm64
|
||||||
|
|
||||||
MAINTAINER agapple (jianghang115@gmail.com)
|
MAINTAINER agapple (jianghang115@gmail.com)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
FROM canal/osbase:v1
|
|
||||||
|
|
||||||
MAINTAINER agapple (jianghang115@gmail.com)
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
groupadd -r mysql && useradd -r -g mysql mysql && \
|
|
||||||
yum -y install wget mysql-server --nogpgcheck && \
|
|
||||||
yum clean all && \
|
|
||||||
true
|
|
||||||
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
FROM canal/osbase:v1
|
|
||||||
|
|
||||||
MAINTAINER agapple (jianghang115@gmail.com)
|
|
||||||
|
|
||||||
env NODE_EPORTER_LINK="https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-arm64.tar.gz"
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
wget "$NODE_EPORTER_LINK" -O /tmp/node_exporter.tar.gz && \
|
|
||||||
true
|
|
||||||
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
6
docker/base/README.md
Normal file
6
docker/base/README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
# osbase
|
||||||
|
cd amd64 && docker build --no-cache -t canal/osbase ./ -f Dockerfile
|
||||||
|
|
||||||
|
# osadmin
|
||||||
|
cd amd64 && docker build --no-cache -t canal/osadmin ./ -f ./Dockerfile_admin
|
||||||
60
docker/base/amd64/Dockerfile
Normal file
60
docker/base/amd64/Dockerfile
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# amd64
|
||||||
|
FROM centos:centos7.9.2009@sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f
|
||||||
|
|
||||||
|
ARG jdk_rpm
|
||||||
|
ARG platform_env
|
||||||
|
|
||||||
|
MAINTAINER agapple (jianghang115@gmail.com)
|
||||||
|
# env DOWNLOAD_AMD_LINK="https://download.oracle.com/otn/java/jdk/8u361-b09/0ae14417abb444ebb02b9815e2103550/jdk-8u361-linux-x64.rpm"
|
||||||
|
# env DOWNLOAD_ARM_LINK="https://download.oracle.com/otn/java/jdk/8u361-b09/0ae14417abb444ebb02b9815e2103550/jdk-8u361-linux-aarch64.rpm"
|
||||||
|
env NODE_EPORTER_LINK="https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
# install system
|
||||||
|
# update yum config, fix "centos6.x yum install failure && Determining fastest mirrors slow" problems
|
||||||
|
COPY yum/ /tmp/
|
||||||
|
RUN \
|
||||||
|
/bin/cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
|
||||||
|
/bin/cp -f /tmp/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo && \
|
||||||
|
/bin/cp /etc/yum/pluginconf.d/fastestmirror.conf /etc/yum/pluginconf.d/fastestmirror.conf.bak && \
|
||||||
|
awk '{ if($0=="enabled=1"){print "enabled=0";} else{print $0;} }' /etc/yum/pluginconf.d/fastestmirror.conf.bak > /etc/yum/pluginconf.d/fastestmirror.conf && \
|
||||||
|
/bin/cp /etc/yum.conf /etc/yum.conf.bak && \
|
||||||
|
echo 'minrate=1' >> /etc/yum.conf && echo 'timeout=600' >> /etc/yum.conf && \
|
||||||
|
yum clean all && yum makecache
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
/bin/cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
|
||||||
|
echo 'root:Hello1234' | chpasswd && \
|
||||||
|
groupadd -r admin && useradd -g admin admin && \
|
||||||
|
yum install -y man && \
|
||||||
|
yum install -y dstat && \
|
||||||
|
yum install -y unzip && \
|
||||||
|
yum install -y nc && \
|
||||||
|
yum install -y openssh-server && \
|
||||||
|
yum install -y tar && \
|
||||||
|
yum install -y which && \
|
||||||
|
yum install -y wget && \
|
||||||
|
yum install -y perl && \
|
||||||
|
yum install -y file && \
|
||||||
|
ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key && \
|
||||||
|
ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key && \
|
||||||
|
sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd && \
|
||||||
|
sed -i -e 's/^#Port 22$/Port 2222/' /etc/ssh/sshd_config && \
|
||||||
|
mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh && \
|
||||||
|
yum install -y cronie && \
|
||||||
|
sed -i '/session required pam_loginuid.so/d' /etc/pam.d/crond && \
|
||||||
|
true
|
||||||
|
|
||||||
|
COPY ${jdk_rpm} /tmp/
|
||||||
|
RUN \
|
||||||
|
touch /var/lib/rpm/* && \
|
||||||
|
#if [ "$BUILDPLATFORM" == "linux/amd64" ] ; then wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=xxx; oraclelicense=accept-securebackup-cookie" "$DOWNLOAD_AMD_LINK" -O /tmp/jdk-8-linux.rpm ; fi && \
|
||||||
|
#if [ "$BUILDPLATFORM" == "linux/arm64" ] ; then wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=xxx; oraclelicense=accept-securebackup-cookie" "$DOWNLOAD_ARM_LINK" -O /tmp/jdk-8-linux.rpm ; fi && \
|
||||||
|
yum -y install /tmp/jdk-*.rpm && \
|
||||||
|
/bin/rm -f /tmp/jdk-*.rpm && \
|
||||||
|
echo "export JAVA_HOME=/usr/java/latest" >> /etc/profile && \
|
||||||
|
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile && \
|
||||||
|
wget "$NODE_EPORTER_LINK" -O /tmp/node_exporter.tar.gz && \
|
||||||
|
yum clean all && \
|
||||||
|
true
|
||||||
|
|
||||||
|
CMD ["/bin/bash"]
|
||||||
15
docker/base/amd64/Dockerfile_admin
Normal file
15
docker/base/amd64/Dockerfile_admin
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# amd64
|
||||||
|
FROM canal/osbase:v3-amd64
|
||||||
|
|
||||||
|
MAINTAINER agapple (jianghang115@gmail.com)
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
groupadd -r mysql && useradd -r -g mysql mysql && \
|
||||||
|
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
rpm -ivh mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
yum install sudo mysql-community-server --nogpgcheck -y && \
|
||||||
|
rm -f mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
yum clean all && \
|
||||||
|
true
|
||||||
|
|
||||||
|
CMD ["/bin/bash"]
|
||||||
43
docker/base/amd64/yum/CentOS-Base.repo
Normal file
43
docker/base/amd64/yum/CentOS-Base.repo
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# CentOS-Base.repo
|
||||||
|
#
|
||||||
|
# The mirror system uses the connecting IP address of the client and the
|
||||||
|
# update status of each mirror to pick mirrors that are updated to and
|
||||||
|
# geographically close to the client. You should use this for CentOS updates
|
||||||
|
# unless you are manually picking other mirrors.
|
||||||
|
#
|
||||||
|
# If the mirrorlist= does not work for you, as a fall back you can try the
|
||||||
|
# remarked out baseurl= line instead.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
[base]
|
||||||
|
name=CentOS-7 - Base
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=$basearch&repo=os&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/7/os/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
#released updates
|
||||||
|
[updates]
|
||||||
|
name=CentOS-7 - Updates
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=$basearch&repo=updates&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/7/updates/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
#additional packages that may be useful
|
||||||
|
[extras]
|
||||||
|
name=CentOS-7 - Extras
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=$basearch&repo=extras&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/7/extras/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
|
||||||
|
#additional packages that extend functionality of existing packages
|
||||||
|
[centosplus]
|
||||||
|
name=CentOS-7 - Plus
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=$basearch&repo=centosplus&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/centos/7/centosplus/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
enabled=0
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
@@ -1,10 +1,15 @@
|
|||||||
FROM centos:centos6.10
|
# arm64
|
||||||
|
FROM centos:centos7.9.2009@sha256:73f11afcbb50d8bc70eab9f0850b3fa30e61a419bc48cf426e63527d14a8373b
|
||||||
|
|
||||||
|
ARG jdk_rpm
|
||||||
|
ARG platform_env
|
||||||
|
|
||||||
MAINTAINER agapple (jianghang115@gmail.com)
|
MAINTAINER agapple (jianghang115@gmail.com)
|
||||||
|
# env DOWNLOAD_AMD_LINK="https://download.oracle.com/otn/java/jdk/8u361-b09/0ae14417abb444ebb02b9815e2103550/jdk-8u361-linux-x64.rpm"
|
||||||
|
# env DOWNLOAD_ARM_LINK="https://download.oracle.com/otn/java/jdk/8u361-b09/0ae14417abb444ebb02b9815e2103550/jdk-8u361-linux-aarch64.rpm"
|
||||||
|
env NODE_EPORTER_LINK="https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-arm64.tar.gz"
|
||||||
|
|
||||||
env DOWNLOAD_LINK="https://download.oracle.com/otn-pub/java/jdk/8u281-b09/89d678f2be164786b292527658ca1605/jdk-8u281-linux-x64.rpm"
|
|
||||||
# install system
|
# install system
|
||||||
|
|
||||||
# update yum config, fix "centos6.x yum install failure && Determining fastest mirrors slow" problems
|
# update yum config, fix "centos6.x yum install failure && Determining fastest mirrors slow" problems
|
||||||
COPY yum/ /tmp/
|
COPY yum/ /tmp/
|
||||||
RUN \
|
RUN \
|
||||||
@@ -39,13 +44,14 @@ RUN \
|
|||||||
sed -i '/session required pam_loginuid.so/d' /etc/pam.d/crond && \
|
sed -i '/session required pam_loginuid.so/d' /etc/pam.d/crond && \
|
||||||
true
|
true
|
||||||
|
|
||||||
|
COPY ${jdk_rpm} /tmp/
|
||||||
RUN \
|
RUN \
|
||||||
touch /var/lib/rpm/* && \
|
touch /var/lib/rpm/* && \
|
||||||
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=xxx; oraclelicense=accept-securebackup-cookie" "$DOWNLOAD_LINK" -O /tmp/jdk-8-linux-x64.rpm && \
|
yum -y install /tmp/jdk-*.rpm && \
|
||||||
yum -y install /tmp/jdk-8-linux-x64.rpm && \
|
/bin/rm -f /tmp/jdk-*.rpm && \
|
||||||
/bin/rm -f /tmp/jdk-8-linux-x64.rpm && \
|
|
||||||
echo "export JAVA_HOME=/usr/java/latest" >> /etc/profile && \
|
echo "export JAVA_HOME=/usr/java/latest" >> /etc/profile && \
|
||||||
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile && \
|
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile && \
|
||||||
|
wget "$NODE_EPORTER_LINK" -O /tmp/node_exporter.tar.gz && \
|
||||||
yum clean all && \
|
yum clean all && \
|
||||||
true
|
true
|
||||||
|
|
||||||
15
docker/base/arm64/Dockerfile_admin
Normal file
15
docker/base/arm64/Dockerfile_admin
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# arm64
|
||||||
|
FROM canal/osbase:v3-arm64
|
||||||
|
|
||||||
|
MAINTAINER agapple (jianghang115@gmail.com)
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
groupadd -r mysql && useradd -r -g mysql mysql && \
|
||||||
|
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
rpm -ivh mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
yum install sudo mysql-community-server-8.0.32 --nogpgcheck -y && \
|
||||||
|
rm -f mysql80-community-release-el7-3.noarch.rpm && \
|
||||||
|
yum clean all && \
|
||||||
|
true
|
||||||
|
|
||||||
|
CMD ["/bin/bash"]
|
||||||
48
docker/base/arm64/yum/CentOS-Base.repo
Normal file
48
docker/base/arm64/yum/CentOS-Base.repo
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# CentOS-Base.repo
|
||||||
|
#
|
||||||
|
# The mirror system uses the connecting IP address of the client and the
|
||||||
|
# update status of each mirror to pick mirrors that are updated to and
|
||||||
|
# geographically close to the client. You should use this for CentOS updates
|
||||||
|
# unless you are manually picking other mirrors.
|
||||||
|
#
|
||||||
|
# If the mirrorlist= does not work for you, as a fall back you can try the
|
||||||
|
# remarked out baseurl= line instead.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
[base]
|
||||||
|
name=CentOS-$releasever - Base
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/altarch/$releasever/os/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-aarch64
|
||||||
|
|
||||||
|
#released updates
|
||||||
|
[updates]
|
||||||
|
name=CentOS-$releasever - Updates
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/altarch/$releasever/updates/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-aarch64
|
||||||
|
|
||||||
|
#additional packages that may be useful
|
||||||
|
[extras]
|
||||||
|
name=CentOS-$releasever - Extras
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/altarch/$releasever/extras/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-aarch64
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
#additional packages that extend functionality of existing packages
|
||||||
|
[centosplus]
|
||||||
|
name=CentOS-$releasever - Plus
|
||||||
|
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
|
||||||
|
#baseurl=http://mirror.centos.org/altarch/$releasever/centosplus/$basearch/
|
||||||
|
gpgcheck=1
|
||||||
|
enabled=0
|
||||||
|
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||||
|
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7-aarch64
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# CentOS-Base.repo
|
|
||||||
#
|
|
||||||
# The mirror system uses the connecting IP address of the client and the
|
|
||||||
# update status of each mirror to pick mirrors that are updated to and
|
|
||||||
# geographically close to the client. You should use this for CentOS updates
|
|
||||||
# unless you are manually picking other mirrors.
|
|
||||||
#
|
|
||||||
# If the mirrorlist= does not work for you, as a fall back you can try the
|
|
||||||
# remarked out baseurl= line instead.
|
|
||||||
#
|
|
||||||
|
|
||||||
[base]
|
|
||||||
name=CentOS-$releasever - Base
|
|
||||||
failovermethod=priority
|
|
||||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
|
|
||||||
baseurl=https://mirrors.aliyun.com/centos-vault/centos/$releasever/os/$basearch/
|
|
||||||
https://mirrors.cloud.tencent.com/centos/$releasever/os/$basearch/
|
|
||||||
https://vault.centos.org/centos/$releasever/os/$basearch/
|
|
||||||
gpgcheck=1
|
|
||||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
||||||
|
|
||||||
#released updates
|
|
||||||
[updates]
|
|
||||||
name=CentOS-$releasever - Updates
|
|
||||||
failovermethod=priority
|
|
||||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
|
|
||||||
baseurl=https://mirrors.aliyun.com/centos-vault/centos/$releasever/updates/$basearch/
|
|
||||||
https://mirrors.cloud.tencent.com/centos/$releasever/updates/$basearch/
|
|
||||||
https://vault.centos.org/centos/$releasever/updates/$basearch/
|
|
||||||
gpgcheck=1
|
|
||||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
||||||
|
|
||||||
#additional packages that may be useful
|
|
||||||
[extras]
|
|
||||||
name=CentOS-$releasever - Extras
|
|
||||||
failovermethod=priority
|
|
||||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
|
|
||||||
baseurl=https://mirrors.aliyun.com/centos-vault/centos/$releasever/extras/$basearch/
|
|
||||||
https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/
|
|
||||||
https://vault.centos.org/centos/$releasever/extras/$basearch/
|
|
||||||
gpgcheck=1
|
|
||||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
||||||
|
|
||||||
#additional packages that extend functionality of existing packages
|
|
||||||
[centosplus]
|
|
||||||
name=CentOS-$releasever - Plus
|
|
||||||
failovermethod=priority
|
|
||||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
|
|
||||||
baseurl=https://mirrors.aliyun.com/centos-vault/centos/$releasever/centosplus/$basearch/
|
|
||||||
https://mirrors.cloud.tencent.com/centos/6.0/centosplus/$basearch/
|
|
||||||
https://vault.centos.org/centos/$releasever/centosplus/$basearch/
|
|
||||||
gpgcheck=1
|
|
||||||
enabled=0
|
|
||||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
||||||
|
|
||||||
#contrib - packages by Centos Users
|
|
||||||
[contrib]
|
|
||||||
name=CentOS-$releasever - Contrib
|
|
||||||
failovermethod=priority
|
|
||||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
|
|
||||||
baseurl=https://mirrors.aliyun.com/centos-vault/centos/$releasever/contrib/$basearch/
|
|
||||||
https://mirrors.cloud.tencent.com/centos/$releasever/contrib/$basearch/
|
|
||||||
https://vault.centos.org/centos/$releasever/contrib/$basearch/
|
|
||||||
gpgcheck=1
|
|
||||||
enabled=0
|
|
||||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
||||||
@@ -14,20 +14,16 @@ case "`uname`" in
|
|||||||
esac
|
esac
|
||||||
BASE=${bin_abs_path}
|
BASE=${bin_abs_path}
|
||||||
|
|
||||||
if [ "$1" == "base" ] ; then
|
if [ "$1" == "admin" ] ; then
|
||||||
docker build --no-cache -t canal/osbase $BASE/base
|
|
||||||
elif [ "$1" == "base_v2" ] ; then
|
|
||||||
docker build --no-cache -t canal/osbase $BASE/base -f $BASE/base/Dockerfile_v2
|
|
||||||
elif [ "$1" == "base_admin" ] ; then
|
|
||||||
docker build --no-cache -t canal/osadmin $BASE/base -f $BASE/base/Dockerfile_admin
|
|
||||||
elif [ "$1" == "admin" ] ; then
|
|
||||||
rm -rf $BASE/canal.*.tar.gz ;
|
rm -rf $BASE/canal.*.tar.gz ;
|
||||||
cd $BASE/../ && mvn clean package -Dmaven.test.skip -Denv=release && cd $current_path ;
|
cd $BASE/../ && mvn clean package -Dmaven.test.skip -Denv=release && cd $current_path ;
|
||||||
cp $BASE/../target/canal.admin-*.tar.gz $BASE/
|
cp $BASE/../target/canal.admin-*.tar.gz $BASE/
|
||||||
docker build --no-cache -t canal/canal-admin $BASE/ -f $BASE/Dockerfile_admin
|
docker build --no-cache -t canal/canal-admin $BASE/ -f $BASE/Dockerfile_admin
|
||||||
|
# docker build --platform linux/arm64 --no-cache -t canal/canal-admin $BASE/ -f $BASE/Dockerfile_admin
|
||||||
else
|
else
|
||||||
rm -rf $BASE/canal.*.tar.gz ;
|
rm -rf $BASE/canal.*.tar.gz ;
|
||||||
cd $BASE/../ && mvn clean package -Dmaven.test.skip -Denv=release && cd $current_path ;
|
cd $BASE/../ && mvn clean package -Dmaven.test.skip -Denv=release && cd $current_path ;
|
||||||
cp $BASE/../target/canal.deployer-*.tar.gz $BASE/
|
cp $BASE/../target/canal.deployer-*.tar.gz $BASE/
|
||||||
docker build --no-cache -t canal/canal-server $BASE/
|
docker build --no-cache -t canal/canal-server $BASE/
|
||||||
|
# docker build -platform linux/arm64 --no-cache -t canal/canal-server $BASE/
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ for e in $(ls /alidata/init/*) ; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo "==> INIT DEFAULT"
|
echo "==> INIT DEFAULT"
|
||||||
service sshd start
|
systemctl start sshd
|
||||||
service crond start
|
systemctl start crond
|
||||||
|
|
||||||
#echo "check hostname -i: `hostname -i`"
|
#echo "check hostname -i: `hostname -i`"
|
||||||
#hti_num=`hostname -i|awk '{print NF}'`
|
#hti_num=`hostname -i|awk '{print NF}'`
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set +e
|
||||||
|
|
||||||
source /etc/profile
|
source /etc/profile
|
||||||
export JAVA_HOME=/usr/java/latest
|
export JAVA_HOME=/usr/java/latest
|
||||||
@@ -87,7 +87,7 @@ function start_canal() {
|
|||||||
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh local 1>>/tmp/start.log 2>&1'
|
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh local 1>>/tmp/start.log 2>&1'
|
||||||
sleep 5
|
sleep 5
|
||||||
#check start
|
#check start
|
||||||
checkStart "canal" "nc 127.0.0.1 $adminPort -w 1 -z | wc -l" 30
|
checkStart "canal" "nc 127.0.0.1 $adminPort -w 1 -zv 2> /tmp/nc.out && cat /tmp/nc.out | grep -c Connected" 30
|
||||||
else
|
else
|
||||||
metricsPort=`perl -le 'print $ENV{"canal.metrics.pull.port"}'`
|
metricsPort=`perl -le 'print $ENV{"canal.metrics.pull.port"}'`
|
||||||
if [ -z "$metricsPort" ] ; then
|
if [ -z "$metricsPort" ] ; then
|
||||||
@@ -120,7 +120,7 @@ function start_canal() {
|
|||||||
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh 1>>/tmp/start.log 2>&1'
|
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh 1>>/tmp/start.log 2>&1'
|
||||||
sleep 5
|
sleep 5
|
||||||
#check start
|
#check start
|
||||||
checkStart "canal" "nc 127.0.0.1 $metricsPort -w 1 -z | wc -l" 30
|
checkStart "canal" "nc 127.0.0.1 $metricsPort -w 1 -zv 2> /tmp/nc.out && cat /tmp/nc.out | grep -c Connected" 30
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set +e
|
||||||
|
|
||||||
source /etc/profile
|
source /etc/profile
|
||||||
export JAVA_HOME=/usr/java/latest
|
export JAVA_HOME=/usr/java/latest
|
||||||
@@ -94,37 +94,45 @@ function start_mysql() {
|
|||||||
MYSQL_ROOT_PASSWORD=Hello1234
|
MYSQL_ROOT_PASSWORD=Hello1234
|
||||||
# connect local mysql
|
# connect local mysql
|
||||||
if [ -z "$(ls -A /var/lib/mysql)" ]; then
|
if [ -z "$(ls -A /var/lib/mysql)" ]; then
|
||||||
mysql_install_db --user=mysql --datadir=/var/lib/mysql 1>>/tmp/start.log 2>&1
|
|
||||||
# These statements _must_ be on individual lines, and _must_ end with
|
|
||||||
# semicolons (no line breaks or comments are permitted).
|
|
||||||
# TODO proper SQL escaping on ALL the things D:
|
|
||||||
TEMP_FILE='/tmp/init.sql'
|
TEMP_FILE='/tmp/init.sql'
|
||||||
echo "update mysql.user set password=password('${MYSQL_ROOT_PASSWORD}') where user='root';" >> $TEMP_FILE
|
echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';" >> $TEMP_FILE
|
||||||
echo "grant all privileges on *.* to 'root'@'%' WITH GRANT OPTION ;" >> $TEMP_FILE
|
/usr/sbin/mysqld --initialize --user=mysql --datadir=/var/lib/mysql --init-file=/tmp/init.sql --default-authentication-plugin=mysql_native_password 1>>/tmp/start.log 2>&1
|
||||||
|
echo "default-authentication-plugin=mysql_native_password" >> /etc/my.cnf
|
||||||
|
# systemctl start mysqld
|
||||||
|
sudo -u mysql /usr/sbin/mysqld &
|
||||||
|
sleep 5
|
||||||
|
checkStart "mysql" "echo 'show status' | mysql -b -s -h127.0.0.1 -P3306 -uroot -p${MYSQL_ROOT_PASSWORD} | grep -c Uptime" 30
|
||||||
|
# init file
|
||||||
|
rm -f $TEMP_FILE
|
||||||
echo "create database if not exists $MYSQL_DATABASE ;" >> $TEMP_FILE
|
echo "create database if not exists $MYSQL_DATABASE ;" >> $TEMP_FILE
|
||||||
echo "create user $MYSQL_USER identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
|
echo "create user $MYSQL_USER identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
|
||||||
echo "grant all privileges on $MYSQL_DATABASE.* to '$MYSQL_USER'@'%' identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
|
echo "grant all privileges on $MYSQL_DATABASE.* to '$MYSQL_USER'@'%' ;" >> $TEMP_FILE
|
||||||
echo "grant all privileges on $MYSQL_DATABASE.* to '$MYSQL_USER'@'localhost' identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
|
|
||||||
echo "flush privileges;" >> $TEMP_FILE
|
echo "flush privileges;" >> $TEMP_FILE
|
||||||
service mysqld start
|
# init user
|
||||||
checkStart "mysql" "echo 'show status' | mysql -s -h127.0.0.1 -P3306 -uroot | grep -c Uptime" 30
|
cmd="mysql -h127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD} -e 'source $TEMP_FILE' 1>>/tmp/start.log 2>&1"
|
||||||
mysql -h127.0.0.1 -uroot -e "source $TEMP_FILE" 1>>/tmp/start.log 2>&1
|
eval $cmd
|
||||||
|
/bin/rm -f /tmp/init.sql
|
||||||
|
# init table
|
||||||
cmd="mysql -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_USER_PASSWORD $MYSQL_DATABASE -e 'source /home/admin/canal-admin/conf/canal_manager.sql' 1>>/tmp/start.log 2>&1"
|
cmd="mysql -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_USER_PASSWORD $MYSQL_DATABASE -e 'source /home/admin/canal-admin/conf/canal_manager.sql' 1>>/tmp/start.log 2>&1"
|
||||||
eval $cmd
|
eval $cmd
|
||||||
/bin/rm -f /home/admin/canal-admin/conf/canal_manager.sql
|
/bin/rm -f /home/admin/canal-admin/conf/canal_manager.sql
|
||||||
else
|
else
|
||||||
|
echo "recover mysql ..."
|
||||||
chown -R mysql:mysql /var/lib/mysql
|
chown -R mysql:mysql /var/lib/mysql
|
||||||
service mysqld start
|
# systemctl start mysqld
|
||||||
|
rm -f /var/lib/mysql/mysql.sock.lock
|
||||||
|
sudo -u mysql /usr/sbin/mysqld &
|
||||||
|
sleep 5
|
||||||
#check start
|
#check start
|
||||||
checkStart "mysql" "echo 'show status' | mysql -b -s -h127.0.0.1 -P3306 -uroot -p$MYSQL_ROOT_PASSWORD | grep -c Uptime" 30
|
checkStart "mysql" "echo 'show status' | mysql -b -s -h127.0.0.1 -P3306 -uroot -p${MYSQL_ROOT_PASSWORD} | grep -c Uptime" 30
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop_mysql() {
|
function stop_mysql() {
|
||||||
echo "stop mysql ..."
|
echo "stop mysql ..."
|
||||||
# stop mysql
|
# stop mysql
|
||||||
service mysqld stop
|
# systemctl stop mysqld
|
||||||
|
ps auxf | grep mysqld | grep -v grep | awk '{print $2}' | xargs kill
|
||||||
echo "stop mysql successful ..."
|
echo "stop mysql successful ..."
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +145,7 @@ function start_admin() {
|
|||||||
su admin -c 'cd /home/admin/canal-admin/bin/ && sh restart.sh 1>>/tmp/start.log 2>&1'
|
su admin -c 'cd /home/admin/canal-admin/bin/ && sh restart.sh 1>>/tmp/start.log 2>&1'
|
||||||
sleep 5
|
sleep 5
|
||||||
#check start
|
#check start
|
||||||
checkStart "canal" "nc 127.0.0.1 $serverPort -w 1 -z | wc -l" 30
|
checkStart "canal" "nc 127.0.0.1 $serverPort -w 1 -zv 2>/tmp/nc.out && cat /tmp/nc.out | grep -c Connected" 30
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop_admin() {
|
function stop_admin() {
|
||||||
|
|||||||
@@ -97,6 +97,6 @@ fi
|
|||||||
|
|
||||||
MEMORY="-m 4096m"
|
MEMORY="-m 4096m"
|
||||||
LOCALHOST=`getMyIp`
|
LOCALHOST=`getMyIp`
|
||||||
cmd="docker run -d -it -h $LOCALHOST $CONFIG --name=canal-server $VOLUMNS $NET_MODE $PORTS $MEMORY canal/canal-server"
|
cmd="docker run -d --privileged=true -it -h $LOCALHOST $CONFIG --name=canal-server $VOLUMNS $NET_MODE $PORTS $MEMORY canal/canal-server"
|
||||||
echo $cmd
|
echo $cmd
|
||||||
eval $cmd
|
eval $cmd
|
||||||
@@ -86,6 +86,6 @@ fi
|
|||||||
|
|
||||||
MEMORY="-m 1024m"
|
MEMORY="-m 1024m"
|
||||||
LOCALHOST=`getMyIp`
|
LOCALHOST=`getMyIp`
|
||||||
cmd="docker run -d -it -h $LOCALHOST $CONFIG --name=canal-admin $VOLUMNS $NET_MODE $PORTS $MEMORY canal/canal-admin"
|
cmd="docker run -d --privileged=true -it -h $LOCALHOST $CONFIG --name=canal-admin $VOLUMNS $NET_MODE $PORTS $MEMORY canal/canal-admin"
|
||||||
echo $cmd
|
echo $cmd
|
||||||
eval $cmd
|
eval $cmd
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ esac
|
|||||||
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
JavaVersion=`$JAVA -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }' | awk -F '.' '{print $1}'`
|
||||||
str=`file -L $JAVA | grep 64-bit`
|
str=`file -L $JAVA | grep 64-bit`
|
||||||
|
|
||||||
JAVA_OPTS="$JAVA_OPTS -Xss256k -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
JAVA_OPTS="$JAVA_OPTS -Xss1m -XX:+AggressiveOpts -XX:-UseBiasedLocking -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$base/logs"
|
||||||
if [ $JavaVersion -ge 11 ] ; then
|
if [ $JavaVersion -ge 11 ] ; then
|
||||||
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
#JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$base_log/gc.log:time "
|
||||||
JAVA_OPTS="$JAVA_OPTS"
|
JAVA_OPTS="$JAVA_OPTS"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>canal.instance.core</artifactId>
|
<artifactId>canal.instance.core</artifactId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -24,13 +24,7 @@ import com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter;
|
|||||||
import com.alibaba.otter.canal.instance.core.AbstractCanalInstance;
|
import com.alibaba.otter.canal.instance.core.AbstractCanalInstance;
|
||||||
import com.alibaba.otter.canal.instance.manager.model.Canal;
|
import com.alibaba.otter.canal.instance.manager.model.Canal;
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter;
|
import com.alibaba.otter.canal.instance.manager.model.CanalParameter;
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.DataSourcing;
|
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.*;
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.HAMode;
|
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.IndexMode;
|
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.MetaMode;
|
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.SourcingType;
|
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.StorageMode;
|
|
||||||
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.StorageScavengeMode;
|
|
||||||
import com.alibaba.otter.canal.meta.FileMixedMetaManager;
|
import com.alibaba.otter.canal.meta.FileMixedMetaManager;
|
||||||
import com.alibaba.otter.canal.meta.MemoryMetaManager;
|
import com.alibaba.otter.canal.meta.MemoryMetaManager;
|
||||||
import com.alibaba.otter.canal.meta.PeriodMixedMetaManager;
|
import com.alibaba.otter.canal.meta.PeriodMixedMetaManager;
|
||||||
@@ -46,12 +40,7 @@ import com.alibaba.otter.canal.parse.inbound.mysql.rds.RdsBinlogEventParserProxy
|
|||||||
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DefaultTableMetaTSDBFactory;
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DefaultTableMetaTSDBFactory;
|
||||||
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
||||||
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDBBuilder;
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDBBuilder;
|
||||||
import com.alibaba.otter.canal.parse.index.CanalLogPositionManager;
|
import com.alibaba.otter.canal.parse.index.*;
|
||||||
import com.alibaba.otter.canal.parse.index.FailbackLogPositionManager;
|
|
||||||
import com.alibaba.otter.canal.parse.index.MemoryLogPositionManager;
|
|
||||||
import com.alibaba.otter.canal.parse.index.MetaLogPositionManager;
|
|
||||||
import com.alibaba.otter.canal.parse.index.PeriodMixedLogPositionManager;
|
|
||||||
import com.alibaba.otter.canal.parse.index.ZooKeeperLogPositionManager;
|
|
||||||
import com.alibaba.otter.canal.parse.support.AuthenticationInfo;
|
import com.alibaba.otter.canal.parse.support.AuthenticationInfo;
|
||||||
import com.alibaba.otter.canal.protocol.position.EntryPosition;
|
import com.alibaba.otter.canal.protocol.position.EntryPosition;
|
||||||
import com.alibaba.otter.canal.sink.entry.EntryEventSink;
|
import com.alibaba.otter.canal.sink.entry.EntryEventSink;
|
||||||
@@ -338,6 +327,8 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
|
|||||||
mysqlEventParser.setTsdbSnapshotExpire(parameters.getTsdbSnapshotExpire());
|
mysqlEventParser.setTsdbSnapshotExpire(parameters.getTsdbSnapshotExpire());
|
||||||
}
|
}
|
||||||
boolean tsdbEnable = BooleanUtils.toBoolean(parameters.getTsdbEnable());
|
boolean tsdbEnable = BooleanUtils.toBoolean(parameters.getTsdbEnable());
|
||||||
|
// manager启动模式默认使用mysql tsdb机制
|
||||||
|
final String tsdbSpringXml = "classpath:spring/tsdb/mysql-tsdb.xml";
|
||||||
if (tsdbEnable) {
|
if (tsdbEnable) {
|
||||||
mysqlEventParser.setTableMetaTSDBFactory(new DefaultTableMetaTSDBFactory() {
|
mysqlEventParser.setTableMetaTSDBFactory(new DefaultTableMetaTSDBFactory() {
|
||||||
|
|
||||||
@@ -353,9 +344,12 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
|
|||||||
System.setProperty("canal.instance.tsdb.url", parameters.getTsdbJdbcUrl());
|
System.setProperty("canal.instance.tsdb.url", parameters.getTsdbJdbcUrl());
|
||||||
System.setProperty("canal.instance.tsdb.dbUsername", parameters.getTsdbJdbcUserName());
|
System.setProperty("canal.instance.tsdb.dbUsername", parameters.getTsdbJdbcUserName());
|
||||||
System.setProperty("canal.instance.tsdb.dbPassword", parameters.getTsdbJdbcPassword());
|
System.setProperty("canal.instance.tsdb.dbPassword", parameters.getTsdbJdbcPassword());
|
||||||
|
System.setProperty("canal.instance.destination", destination);
|
||||||
|
|
||||||
return TableMetaTSDBBuilder.build(destination, "classpath:spring/tsdb/mysql-tsdb.xml");
|
return TableMetaTSDBBuilder.build(destination, tsdbSpringXml);
|
||||||
} finally {
|
} finally {
|
||||||
|
// reset
|
||||||
|
System.setProperty("canal.instance.destination", "");
|
||||||
System.setProperty("canal.instance.tsdb.url", "");
|
System.setProperty("canal.instance.tsdb.url", "");
|
||||||
System.setProperty("canal.instance.tsdb.dbUsername", "");
|
System.setProperty("canal.instance.tsdb.dbUsername", "");
|
||||||
System.setProperty("canal.instance.tsdb.dbPassword", "");
|
System.setProperty("canal.instance.tsdb.dbPassword", "");
|
||||||
@@ -363,6 +357,10 @@ public class CanalInstanceWithManager extends AbstractCanalInstance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
mysqlEventParser.setTsdbJdbcUrl(parameters.getTsdbJdbcUrl());
|
||||||
|
mysqlEventParser.setTsdbJdbcUserName(parameters.getTsdbJdbcUserName());
|
||||||
|
mysqlEventParser.setTsdbJdbcPassword(parameters.getTsdbJdbcPassword());
|
||||||
|
mysqlEventParser.setTsdbSpringXml(tsdbSpringXml);
|
||||||
mysqlEventParser.setEnableTsdb(tsdbEnable);
|
mysqlEventParser.setEnableTsdb(tsdbEnable);
|
||||||
}
|
}
|
||||||
eventParser = mysqlEventParser;
|
eventParser = mysqlEventParser;
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ public class PlainCanalInstanceGenerator implements CanalInstanceGenerator {
|
|||||||
throw new CanalException(e);
|
throw new CanalException(e);
|
||||||
} finally {
|
} finally {
|
||||||
System.setProperty("canal.instance.destination", "");
|
System.setProperty("canal.instance.destination", "");
|
||||||
|
com.alibaba.otter.canal.instance.spring.support.PropertyPlaceholderConfigurer.propertiesLocal.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>canal.parse</artifactId>
|
<artifactId>canal.parse</artifactId>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.alibaba.otter.canal.parse.inbound.mysql;
|
package com.alibaba.otter.canal.parse.inbound.mysql;
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Properties;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
import com.alibaba.otter.canal.filter.CanalEventFilter;
|
import com.alibaba.otter.canal.filter.CanalEventFilter;
|
||||||
@@ -16,7 +17,6 @@ import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DefaultTableMetaTSDBFact
|
|||||||
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
||||||
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDBFactory;
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDBFactory;
|
||||||
import com.alibaba.otter.canal.protocol.position.EntryPosition;
|
import com.alibaba.otter.canal.protocol.position.EntryPosition;
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
|
|
||||||
public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
||||||
|
|
||||||
@@ -24,6 +24,9 @@ public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
|||||||
|
|
||||||
protected TableMetaTSDBFactory tableMetaTSDBFactory = new DefaultTableMetaTSDBFactory();
|
protected TableMetaTSDBFactory tableMetaTSDBFactory = new DefaultTableMetaTSDBFactory();
|
||||||
protected boolean enableTsdb = false;
|
protected boolean enableTsdb = false;
|
||||||
|
protected String tsdbJdbcUrl;
|
||||||
|
protected String tsdbJdbcUserName;
|
||||||
|
protected String tsdbJdbcPassword;
|
||||||
protected int tsdbSnapshotInterval = 24;
|
protected int tsdbSnapshotInterval = 24;
|
||||||
protected int tsdbSnapshotExpire = 360;
|
protected int tsdbSnapshotExpire = 360;
|
||||||
protected String tsdbSpringXml;
|
protected String tsdbSpringXml;
|
||||||
@@ -149,14 +152,7 @@ public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
|||||||
if (enableTsdb) {
|
if (enableTsdb) {
|
||||||
if (tableMetaTSDB == null) {
|
if (tableMetaTSDB == null) {
|
||||||
synchronized (CanalEventParser.class) {
|
synchronized (CanalEventParser.class) {
|
||||||
try {
|
buildTableMetaTSDB(tsdbSpringXml);
|
||||||
// 设置当前正在加载的通道,加载spring查找文件时会用到该变量
|
|
||||||
System.setProperty("canal.instance.destination", destination);
|
|
||||||
// 初始化
|
|
||||||
tableMetaTSDB = tableMetaTSDBFactory.build(destination, tsdbSpringXml);
|
|
||||||
} finally {
|
|
||||||
System.setProperty("canal.instance.destination", "");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -173,6 +169,30 @@ public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
|||||||
super.stop();
|
super.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected synchronized void buildTableMetaTSDB(String tsdbSpringXml) {
|
||||||
|
if (tableMetaTSDB != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 设置当前正在加载的通道,加载spring查找文件时会用到该变量
|
||||||
|
System.setProperty("canal.instance.tsdb.url", tsdbJdbcUrl);
|
||||||
|
System.setProperty("canal.instance.tsdb.dbUsername", tsdbJdbcUserName);
|
||||||
|
System.setProperty("canal.instance.tsdb.dbPassword", tsdbJdbcPassword);
|
||||||
|
// 初始化
|
||||||
|
this.tableMetaTSDB = tableMetaTSDBFactory.build(destination, tsdbSpringXml);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
logger.warn("failed to build TableMetaTSDB ",e);
|
||||||
|
throw new CanalParseException(e);
|
||||||
|
} finally {
|
||||||
|
// reset
|
||||||
|
Properties props = System.getProperties();
|
||||||
|
props.remove("canal.instance.tsdb.url");
|
||||||
|
props.remove("canal.instance.tsdb.dbUsername");
|
||||||
|
props.remove("canal.instance.tsdb.dbPassword");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected MultiStageCoprocessor buildMultiStageCoprocessor() {
|
protected MultiStageCoprocessor buildMultiStageCoprocessor() {
|
||||||
MysqlMultiStageCoprocessor mysqlMultiStageCoprocessor = new MysqlMultiStageCoprocessor(parallelBufferSize,
|
MysqlMultiStageCoprocessor mysqlMultiStageCoprocessor = new MysqlMultiStageCoprocessor(parallelBufferSize,
|
||||||
parallelThreadSize,
|
parallelThreadSize,
|
||||||
@@ -255,22 +275,10 @@ public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
|||||||
|
|
||||||
public void setEnableTsdb(boolean enableTsdb) {
|
public void setEnableTsdb(boolean enableTsdb) {
|
||||||
this.enableTsdb = enableTsdb;
|
this.enableTsdb = enableTsdb;
|
||||||
if (this.enableTsdb) {
|
|
||||||
if (tableMetaTSDB == null) {
|
|
||||||
// 初始化
|
|
||||||
tableMetaTSDB = tableMetaTSDBFactory.build(destination, tsdbSpringXml);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTsdbSpringXml(String tsdbSpringXml) {
|
public void setTsdbSpringXml(String tsdbSpringXml) {
|
||||||
this.tsdbSpringXml = tsdbSpringXml;
|
this.tsdbSpringXml = tsdbSpringXml;
|
||||||
if (this.enableTsdb) {
|
|
||||||
if (tableMetaTSDB == null) {
|
|
||||||
// 初始化
|
|
||||||
tableMetaTSDB = tableMetaTSDBFactory.build(destination, tsdbSpringXml);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTableMetaTSDBFactory(TableMetaTSDBFactory tableMetaTSDBFactory) {
|
public void setTableMetaTSDBFactory(TableMetaTSDBFactory tableMetaTSDBFactory) {
|
||||||
@@ -301,4 +309,15 @@ public abstract class AbstractMysqlEventParser extends AbstractEventParser {
|
|||||||
this.tsdbSnapshotExpire = tsdbSnapshotExpire;
|
this.tsdbSnapshotExpire = tsdbSnapshotExpire;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTsdbJdbcUrl(String tsdbJdbcUrl) {
|
||||||
|
this.tsdbJdbcUrl = tsdbJdbcUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTsdbJdbcUserName(String tsdbJdbcUserName) {
|
||||||
|
this.tsdbJdbcUserName = tsdbJdbcUserName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTsdbJdbcPassword(String tsdbJdbcPassword) {
|
||||||
|
this.tsdbJdbcPassword = tsdbJdbcPassword;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
|||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<name>canal module for otter ${project.version}</name>
|
<name>canal module for otter ${project.version}</name>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<url>https://github.com/alibaba/canal</url>
|
<url>https://github.com/alibaba/canal</url>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.sonatype.oss</groupId>
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal.prometheus</artifactId>
|
<artifactId>canal.prometheus</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<name>canal prometheus module for otter ${project.version}</name>
|
<name>canal prometheus module for otter ${project.version}</name>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>canal.server</artifactId>
|
<artifactId>canal.server</artifactId>
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C
|
|||||||
if (!isStart()) {
|
if (!isStart()) {
|
||||||
super.start();
|
super.start();
|
||||||
// 如果存在provider,则启动metrics service
|
// 如果存在provider,则启动metrics service
|
||||||
if(metricsPort < 0) {
|
if(metricsPort > 0) {
|
||||||
loadCanalMetrics();
|
loadCanalMetrics();
|
||||||
metrics.setServerPort(metricsPort);
|
metrics.setServerPort(metricsPort);
|
||||||
metrics.initialize();
|
metrics.initialize();
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
<artifactId>canal</artifactId>
|
<artifactId>canal</artifactId>
|
||||||
<version>1.1.7-SNAPSHOT</version>
|
<version>1.1.7</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<groupId>com.alibaba.otter</groupId>
|
<groupId>com.alibaba.otter</groupId>
|
||||||
|
|||||||
Reference in New Issue
Block a user