由于在使用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
目录下即可。
|
|
为了便于升级和supervisor托管,我们使用软链的方式,使elasticsearch保持指向最新的版本。当前未升级之前指向2.3.1版本,升级完之后需要手动修改软链到2.3.5版本。
bin/elasticsearch.in.sh配置
es默认xms是256m,xmx是1g,在生产环境中太局促了,需要修改。
123456if [ "x$ES_MIN_MEM" = "x" ]; thenES_MIN_MEM=6gfiif [ "x$ES_MAX_MEM" = "x" ]; thenES_MAX_MEM=6gfi修改gc算法,由CMS改为G1
12345678if [ "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配置中复制一份即可,有几个需要注意的地方:
cluster.name
与之前保持一致node.name
根据需要修改,新增节点或者迁移机器需要注意path.data
path.logs
discovery.zen.ping.unicast.hosts
根据需要修改,新增节点或者迁移机器需要注意- 去除marvel插件配置,不再使用marvel来做监控
其他一些配置
123456789101112131415161718192021222324252627script.engine.groovy.inline.aggs: onscript.engine.groovy.inline.update: ondiscovery.zen.ping_timeout: 20sdiscovery.zen.ping_retries: 6discovery.zen.ping.multicast.enabled: falseindex.cache.field.type: softindex.cache.field.max_size: 10000000index.cache.field.expire: 10mindex.unassigned.node_left.delayed_timeout: 5mcluster.routing.allocation.node_initial_primaries_recoveries: 10cluster.routing.allocation.node_concurrent_recoveries: 5indices.recovery.max_bytes_per_sec: 100mbindices.recovery.concurrent_streams: 5index.search.slowlog.threshold.query.warn: 10sindex.search.slowlog.threshold.query.info: 5sindex.search.slowlog.threshold.query.debug: 2sindex.search.slowlog.threshold.query.trace: 500msindex.search.slowlog.threshold.fetch.warn: 1sindex.search.slowlog.threshold.fetch.info: 800msindex.search.slowlog.threshold.fetch.debug: 500msindex.search.slowlog.threshold.fetch.trace: 200msindex.indexing.slowlog.threshold.index.warn: 10sindex.indexing.slowlog.threshold.index.info: 5sindex.indexing.slowlog.threshold.index.debug: 2sindex.indexing.slowlog.threshold.index.trace: 500ms
安装插件
插件清单可以参考:Elasticsearch 2.2.0 插件篇:插件清单
我们主要使用这两个插件,在es目录下执行下面两个命令
|
|
elasticsearch有很多优秀的插件,根据需要添加。注意插件在升级elasticsearch时需要一起升级。另外,有些插件需要自己编译,不能单纯使用上面的命令安装。
supervisor托管
我们使用supervisor对elasticsearch进行托管,老的elasticsearch目录下已经存在service.sh
,将此文件复制到新的elasticsearch目录下即可,使用此脚本可以对服务进行启停等操作。
滚动安装
基本按照官网Rolling upgrades来操作,有些细节根据我们的环境做了相应改变。
Step 1: Disable shard allocation
|
|
Step 2: Stop non-essential indexing and perform a synced flush (Optional)
|
|
执行时间略长,稍作等待。
Step 3: Stop and upgrade a single node
前面已经说过,使用supervisor托管,所以直接执行sh service.sh stop
即可。
Step 4: Start the upgraded node
此时需要修改elasticsearch软链的指向位置,使其指向新的版本。
|
|
然后进入elasticsearch目录(不可以是elasticsearch-2.3.5目录,这与supervisor中elasticsearch配置有关,指向的路径是elasticsearch,而不是elasticsearch-2.3.5),与停止elasticsearch类似,使用sh service.sh start
即可启动服务。
可以使用下面的命令查看本机状态
|
|
可以使用下面的命令查看此节点是否已经加入到集群中。
|
|
启动时遇到过异常No custom metadata prototype registered for type [licenses], node like missing plugins]
,经查是没有license
插件引起的,只需按准备阶段步骤安装相关插件即可。
Step 5: Reenable shard allocation
|
|
Step 6: Wait for the node to recover
使用以下命令检查集群状态,分为red, yellow, green三种状态。
|
|
使用以下命令查看恢复情况
|
|
Step 7: Repeat
等到集群完全恢复后(集群状态为green,reshard结束),再进行下一个节点的升级。