由于在使用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配置中复制一份即可,有几个需要注意的地方:

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

    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结束),再进行下一个节点的升级。

  10. ElasticSearch Rolling upgrades
  11. ElasticSearch Download
  12. Elasticsearch 2.2.0 插件篇:插件清单