elasticsearch1.6升级到2.0
es1.6以上版本(1.x)升级到2.0过程:
1.停掉当前es集群,删除当前es/lib目录下的所有文件,并将官方2.0发布包中lib目录下的所有文件(都是jar文件)拷贝至es/lib目录;
2.删除当前es/bin目录下的所有文件,并将官方2.0发布包中bin目录下的所有文件拷贝至es/bin目录,因为es2.0的启动方式已经不同于es1.x;
3.es/config目录下的*yml文件配置保持不变,但可能需要稍微修改,比如ik分词器配置项,因为可能之前的版本配置为index.analysis.analyzer.ik.type: ik,由于ik插件对于es2.0版本已经做升级,这里需要去掉此配置项,并从https://github.com/medcl/elasticsearch-analysis-ik下载适配es2.0的版本,按照readme文档放入es/plugins目录即可,es启动时候会自动加载,不需要额外再elasticsearch.yml文件中额外指定。若es升级到了2.0,但elasticsearch.yml文件中仍有index.analysis.analyzer.ik.type: ik配置项,es将启动报错。
4.删除es/plugins目录下的所有插件,因为es2.0不能够识别1.x版本的插件,因为es2.0的插件相关类变化比较大,所有es插件必须是针对es2.0版本才能被加载,否则es启动将报错。
5.若之前es集群使用模板,这里可能需要检查下模板中的mapping,因为es2.0remove了一些属性字段,若不去掉则es在创建新索引的时候会报错,如field属性index_name。所以这里建议,在es2.0集群升级完并起来后,执行template update 操作,先删除所有模板,然后在重新创建修改后的所有模板。
6.重启es集群,升级完毕。
升级过程中非common问题:
1.之前es集群一直使用root用户运行,升级到es2.0后,root用户无法启动es。
由于es2.0默认源码中对root用户进行了异常过滤,所以无法直接用root用户运行,但es2.0源码中留了后门,解决办法也很简单,在启动的时候加上jvm参数-Des.insecure.allow.root=true,就可以正常启动es。
2.es2.0 默认开启了java 安全管理,所以如果业务项目中需要关闭此安全管理,在es启动的时候加jvm参数 -Des.security.manager.enabled=false。比如es目录中有些文件可能使用了软连接,那么就有可能报java.lang.SecurityException: access denied ("java.io.FilePermission"......的异常错误。
3.之前es系统在索引的时候同一index不同type之间有相同的field,并且mapping不一样,这时候升级完es,启动的时候报错,无法启动es。这是因为es2.0开启了mapping一致性校验,也就是说同一index下的所有type所有相同的field,那么field的mapping必须一致,否则将无法启动es。那么老的索引数据难道就不能升级到es2.0吗?官方给出的解决方案是重新建索引,但是实际的生产环境可能并不是那么方便去重新再索引一边数据,这里给出一种解决办法,那就是修改源码再重新打包,其实也就注释一行代码而已,找到MapperService类的private DocumentMapper merge(DocumentMapper mapper, boolean updateAllTypes) 方法,找到如下代码块:
......
MapperUtils.collect(mapper.mapping().root, newObjectMappers, newFieldMappers);
checkNewMappersCompatibility(newObjectMappers, newFieldMappers, updateAllTypes);
addMappers(newObjectMappers, newFieldMappers);
......
注释掉 checkNewMappersCompatibility(newObjectMappers, newFieldMappers, updateAllTypes);即可。
4.network.host问题
由于es2.0强制需要在启用es的时候指定network.host,也就是es服务器需要绑定ip,若不指定则默认为127.0.0.1,这时候如果集群是内网中的几台机器组成,那么集群是不能够建立起来的,所以需要在启动的时候指定network.host,或者直接在elasticsearch.yml文件中指定network.host: $ip。但这时候又有一个问题,那就是集群中的每台服务器都不能通过localhost:9200或者127.0.0.1:9200来访问了,这就有点不太方便,解决办法有一个,就是在es源码中稍作修改,让ServerBootstrap再额外绑定一个127.0.0.1的ip地址,具体做法如下:
找到NetworkUtils类的static InetAddress[] getAllByName(String host) throws UnknownHostException 方法,找到如下代码块:
......
List<InetAddress> unique = new ArrayList<>(new HashSet<>(Arrays.asList(addresses)));
if (host != null && !host.startsWith("localhost") && !host.equals("127.0.0.1")){
InetAddress addr_local[] = InetAddress.getAllByName("127.0.0.1");
unique.addAll(Arrays.asList(addr_local));
}
sortAddresses(unique);
......
加入上面红色代码块即可。

浙公网安备 33010602011771号