线上Elasticsearch集群升级到5.X版本

本文记录了将Elasticserach集群从2.3.3升级到5.0.2过程当中的一些坑。

Elasticsearch

官方提供了升级Elasticsearch的详细文档

集群的升级可以细化到每个节点的升级过程,也有相关的帮助文档
官方还非常周到的提供了一个迁移助手elasticsearch-migration,以插件的形式检测升级过程中需要注意的事项。
首先通过插件来做一些准备工作:

主要包含了:Cluster Checkup、Reindex Helper、Deprecation Logging 3个工具,分别点击可以查看对应的需要处理的事项。

配置项变更

配置项的变化非常大,我主要涉及到下面几点:

  • 索引相关属性都不再在集群范围定义,而是细化到各个索引当中,涵盖了分词器:indexindex.analysis.analyzer.default.typeindex.analysis.analyzer.default.tokenizerindex.analysis.analyzer.default.filter和分片信息:index.number_of_shardsindex.number_of_replicas等;
  • 网络层的配置更加考虑安全性,需要通过http.cors.enabled: truehttp.cors.allow-origin: *“来启用非本地请求,network.host也移除了_non_loopback_,需要详细配置允许的域名列表;
  • deprecate了groovy语言支持,推荐painless。
  • max_map_count需要262144:
    • 写入vm.max_map_count=262144/etc/sysctl.conf后执行sysctl -p
  • max_file limit需要至少65536:
    • 修改/etc/security/limits.conf中的相应值为65536

新的配置项准备完成之后就可以开始升级了。

禁用自动分片

通过执行:

1
2
3
4
5
6
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "none"
}
}

禁用自动部署分片到节点上。

将内存数据同步到磁盘(可选)

执行:

1
POST _flush/synced

关闭节点、执行升级

如果你现有使用的jdk版本非1.8,需要升级jdk版本
我是通过修改符号链接指向的方式指定elasticsearch版本的:

将符号链接指向新的tar包解压文件,将老的configdata目录也同步过去,进行必要的配置项变更即可。

启用节点,开启自动分片

由于新老节点版本不同,启动节点之后会出现以下报错提示,忽略即可:

执行:

1
2
3
4
5
6
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}

依次在每个节点执行以上步骤即可。

elasticsearch-head

head本来是以插件形式嵌入到elasticsearch中,5.0之后只能通过独立方式运行,所以需要elasticsearch配置中添加:http.cors.enabled: truehttp.cors.allow-origin: *“
安装步骤为:

  • 安装依赖:
    • 添加epel源:sudo yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    • 安装node:sudo yum -y install nodejs npm --enablerepo=epel
    • 可以通过命令:PROJECT_NAME="node" PROJECT_URL="https://npm.taobao.org/mirrors/node/" n project stable快速升级node
    • 可以通过命令:PHANTOMJS_CDNURL=https://npm.taobao.org/dist/phantomjs npm install phantomjs --registry=https://registry.npm.taobao.org --no-proxy加快PHANTOMJS安装
  • 拉取代码:git clone git://github.com/mobz/elasticsearch-head.git
  • npm install。可以通过npm config set registry https://registry.npm.taobao.org添加淘宝npm源加快速度。
  • grunt server即可运行。如果需要在断开ssh链接后继续运行,需要通过tmux

logstash

logstash主要用于同步数据库数据到搜索,详见MySQL到Elasticsearch的同步之路
安装的时候遇到的问题就是无法安装插件,表现为执行./logstash-plugin install logstash-input-jdbc时提示:

Could not find gem ‘logstash-plugin (>= 0) java’ in any of the gem sources listed in your Gemfile or installed on this machine

尝试通过其他装有插件的机器执行./logstash-plugin pack --tgz导出gem文件,在需要安装的节点执行./logstash-plugin install --local logstash-input-jdbc依然失败。

这似乎是logstash的一个bug,可以参见这个issue

纠结了好久之后,直接从其他装有插件的机器上把logstash整个文件夹迁移了过来。

java-api

java-api 也又很大变化,主要有:

  • 抽离出transtaparent client的独立jar包
  • netty升级到4
  • 传入的日期字符串需要通过jodatime来格式化
  • function score 函数需要组装为数组

需要注意的就是项目出现:

1
java.lang.NoClassDefFoundError: org/jboss/netty/channel/ReceiveBufferSizePredictorFactory

等相关的NoClassDefFoundError异常,大都是jar包版本冲突导致的,在idea中可以通过Maven Helper插件快速查看。