前言
适配elasticsearch不同版本的过程,是一个了解adapter整体架构的过程,但是同样也很想吐槽elasticsearch的版本间的不兼容问题,不过既然要用,就怂怂的接受好了。
适配
注:adapter使用版本为1.1.5-alpha
在1.1.5版本的adapter中es的同步,将不同大版本的es打成了不同的jar包,然后再通过配置文件去调用相应版本的包去同步数据,官方提供了es6和es7版本的同步,这样的话,我们就可以照葫芦画瓢的使用相同方式去处理es2和es5的同步了。
我们直接复制一份es6x的工程代码到同级目录,然后将其改成5x、2x,代码文件不多,将所有6x的文件名和代码部分统一改成5x、2x之后,咱们再慢慢解决版本之间的bug
canal工程结构涉及es部分如下,图中标注的部分,都是我们需要修改的,相信我,这些文件打开一看就知道该怎么改了,直接上图
工程涉及es部分:
dev.xml/release.xml
adapter工程pom.xml
launcher工程pom.xml
然后将nX部分的pom文件中的elasticsearch的依赖替换成相应的版本,在做最小改动的基础上经过测试,es2.x和5.x统一使用transport方式进行同步,所以修改代码的时候,涉及mode的判断语句,我们只需要关注transport部分,rest部分的错误直接注释掉就可以。真正需要修改的代码其实只有连接这一部分
ESConnection.java
修改为如下部分:
if (mode == ESClientMode.TRANSPORT) {
Settings.Builder settingBuilder = Settings.builder();
settingBuilder.put("cluster.name", properties.get("cluster.name"));
Settings settings = settingBuilder.build();
transportClient = TransportClient.builder().settings(settings)
.build();
for (String host : hosts) {
int i = host.indexOf(":");
transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host.substring(0, i)),
Integer.parseInt(host.substring(i + 1))));
// transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(host.substring(0, i)),
// Integer.parseInt(host.substring(i + 1))));
}
}
修改完这部分,基本上就是把各种rest部分的错误注释掉就可以了,然后工程根目录mvn clean install -Denv=release打包即可
总结
因为是后续做的记录,适配过程中一些小细节记不太清楚了,如果适配过程中有问题可以随时沟通!
欢迎关注我的个人微信公众号,一个菜鸟程序猿的技术分享和奔溃日常