elasticsearch2.3.1升级到2.3.5过程

由于在使用2.3.1版本elasticsearch过程中发现经常出现异常RemoteTransportException - AlreadyClosedException[this IndexReader is closed],发现是在2.3.0中引入的一个bug,在2.3.3中进行了修复,所以对其进行了升级。在小版本之间升级可以进行滚动升级(Rolling upgrades),但大版本之间就只能集群重启升级(Full cluster restart upgrade)。

异常相关信息可以参考https://discuss.elastic.co/t/remotetransportexception-alreadyclosedexception-this-indexreader-is-closed/49577

先决准备

下载解压

ElasticSearch Download页面下载最新的稳定版本,当前是2.3.5。

我们的服务一般放置在/opt/fs目录下,并使用fssvc0035用户启动,所以将下载的tar包解压到/opt/fs目录下即可。

1
2
3
4
5
[fssvc0035@machine fs]$ ll
total 68216
lrwxrwxrwx 1 fssvc0035 fsgrp0023 19 Aug 31 18:39 elasticsearch -> elasticsearch-2.3.1
drwxr-sr-x 8 fssvc0035 fsgrp0023 4096 Aug 31 18:38 elasticsearch-2.3.1
drwxr-sr-x 7 fssvc0035 fsgrp0023 4096 Aug 31 19:57 elasticsearch-2.3.5

为了便于升级和supervisor托管,我们使用软链的方式,使elasticsearch保持指向最新的版本。当前未升级之前指向2.3.1版本,升级完之后需要手动修改软链到2.3.5版本。

bin/elasticsearch.in.sh配置

  1. es默认xms是256m,xmx是1g,在生产环境中太局促了,需要修改。

    1
    2
    3
    4
    5
    6
    if [ "x$ES_MIN_MEM" = "x" ]; then
    ES_MIN_MEM=6g
    fi
    if [ "x$ES_MAX_MEM" = "x" ]; then
    ES_MAX_MEM=6g
    fi
  2. 修改gc算法,由CMS改为G1

    1
    2
    3
    4
    5
    6
    7
    8
    if [ "x$ES_GC_OPTS" = "x" ]; then
    # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseParNewGC"
    # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseConcMarkSweepGC"
    # ES_GC_OPTS="$ES_GC_OPTS -XX:CMSInitiatingOccupancyFraction=75"
    # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
    ES_GC_OPTS="$ES_GC_OPTS -XX:+UseG1GC"
    ES_GC_OPTS="$ES_GC_OPTS -XX:MaxGCPauseMillis=200"
    fi

conf/elasticsearch.yml配置

从之前的es配置中复制一份即可,有几个需要注意的地方:

  1. cluster.name与之前保持一致
  2. node.name根据需要修改,新增节点或者迁移机器需要注意
  3. path.data
  4. path.logs
  5. discovery.zen.ping.unicast.hosts根据需要修改,新增节点或者迁移机器需要注意
  6. 去除marvel插件配置,不再使用marvel来做监控
  7. 其他一些配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    script.engine.groovy.inline.aggs: on
    script.engine.groovy.inline.update: on
    discovery.zen.ping_timeout: 20s
    discovery.zen.ping_retries: 6
    discovery.zen.ping.multicast.enabled: false
    index.cache.field.type: soft
    index.cache.field.max_size: 10000000
    index.cache.field.expire: 10m
    index.unassigned.node_left.delayed_timeout: 5m
    cluster.routing.allocation.node_initial_primaries_recoveries: 10
    cluster.routing.allocation.node_concurrent_recoveries: 5
    indices.recovery.max_bytes_per_sec: 100mb
    indices.recovery.concurrent_streams: 5
    index.search.slowlog.threshold.query.warn: 10s
    index.search.slowlog.threshold.query.info: 5s
    index.search.slowlog.threshold.query.debug: 2s
    index.search.slowlog.threshold.query.trace: 500ms
    index.search.slowlog.threshold.fetch.warn: 1s
    index.search.slowlog.threshold.fetch.info: 800ms
    index.search.slowlog.threshold.fetch.debug: 500ms
    index.search.slowlog.threshold.fetch.trace: 200ms
    index.indexing.slowlog.threshold.index.warn: 10s
    index.indexing.slowlog.threshold.index.info: 5s
    index.indexing.slowlog.threshold.index.debug: 2s
    index.indexing.slowlog.threshold.index.trace: 500ms

安装插件

插件清单可以参考:Elasticsearch 2.2.0 插件篇:插件清单

我们主要使用这两个插件,在es目录下执行下面两个命令

1
2
$ bin/plugin install license
$ bin/plugin install lmenezes/elasticsearch-kopf

elasticsearch有很多优秀的插件,根据需要添加。注意插件在升级elasticsearch时需要一起升级。另外,有些插件需要自己编译,不能单纯使用上面的命令安装。

supervisor托管

我们使用supervisor对elasticsearch进行托管,老的elasticsearch目录下已经存在service.sh,将此文件复制到新的elasticsearch目录下即可,使用此脚本可以对服务进行启停等操作。

滚动安装

基本按照官网Rolling upgrades来操作,有些细节根据我们的环境做了相应改变。

Step 1: Disable shard allocation

1
2
3
4
5
$ curl -XPUT localhost:9200/_cluster/settings -d '{
"transient": {
"cluster.routing.allocation.enable" : "none"
}
}'

Step 2: Stop non-essential indexing and perform a synced flush (Optional)

1
$ curl -XPOST localhost:9200/_flush/synced

执行时间略长,稍作等待。

Step 3: Stop and upgrade a single node

前面已经说过,使用supervisor托管,所以直接执行sh service.sh stop即可。

Step 4: Start the upgraded node

此时需要修改elasticsearch软链的指向位置,使其指向新的版本。

1
2
3
4
5
[fssvc0035@machine fs]$ ll
total 68216
lrwxrwxrwx 1 fssvc0035 fsgrp0023 19 Aug 31 18:39 elasticsearch -> elasticsearch-2.3.5
drwxr-sr-x 8 fssvc0035 fsgrp0023 4096 Aug 31 18:38 elasticsearch-2.3.1
drwxr-sr-x 7 fssvc0035 fsgrp0023 4096 Aug 31 19:57 elasticsearch-2.3.5

然后进入elasticsearch目录(不可以是elasticsearch-2.3.5目录,这与supervisor中elasticsearch配置有关,指向的路径是elasticsearch,而不是elasticsearch-2.3.5),与停止elasticsearch类似,使用sh service.sh start即可启动服务。

可以使用下面的命令查看本机状态

1
curl -XGET localhost:9200

可以使用下面的命令查看此节点是否已经加入到集群中。

1
curl -XGET localhost:9200/_cat/nodes

启动时遇到过异常No custom metadata prototype registered for type [licenses], node like missing plugins],经查是没有license插件引起的,只需按准备阶段步骤安装相关插件即可。

Step 5: Reenable shard allocation

1
2
3
4
5
6
7
8
$ curl -XPUT localhost:9200/_cluster/settings -d '{
"transient": {
"cluster.routing.allocation.enable" : "all"
}
}'
## result
{"acknowledged":true,"persistent":{},"transient":{"cluster":{"routing":{"allocation":{"enable":"all"}}}}}

Step 6: Wait for the node to recover

使用以下命令检查集群状态,分为red, yellow, green三种状态。

1
curl -XGET localhost:9200/_cat/health

使用以下命令查看恢复情况

1
curl -XGET localhost:9200/_cat/recovery

Step 7: Repeat

等到集群完全恢复后(集群状态为green,reshard结束),再进行下一个节点的升级。

参考

  1. ElasticSearch Rolling upgrades
  2. ElasticSearch Download
  3. Elasticsearch 2.2.0 插件篇:插件清单