Elasticsearch 1.7 热更新
搜索是一个需要不停改进的项目,有时我们需要更新分词插件,有时我们想升级ES版本,这些动作的生效都需要重启ES服务。我们当然不希望重启线上服务导致用户无法使用搜索功能,好在ES支持rolling upgrade的方式进行热更新,以下是操作步骤建议:
[bash] // 1.确保每个Index至少有一份复制分片 // 2.禁止ES的分片动态平衡机制(shard reallocation) curl -XPUT localhost:9200/_cluster/settings -d '{ "transient" : { "cluster.routing.allocation.enable" : "none" } }' // 3.将translog持久化到硬盘上(flush translog) curl -XPOST "http://localhost:9200/_flush?wait_for_ongoing" // 4.登录到一个节点上,停止ES服务 service elasticsearch stop // 5.执行更新操作 // 6.启动ES服务 service elasticsearch start // 7.重新开启shard reallocation curl -XPUT localhost:9200/_cluster/settings -d '{ "transient" : { "cluster.routing.allocation.enable" : "all" } }' // 8.等待cluster的状态重新变为green之后,在下一个节点上重复2~7的操作 [/bash] 值得注意的是:
- 确保每个Index都有复制分片,这样当关闭一个节点的ES服务之后,用户能使用到的数据仍然是全的,集群状态不会出现red
- 如果不禁止shard reallocation,每次一关闭一个节点的服务,剩余节点就会开始数据重平衡,如果索引量巨大,那将消耗大量的时间和IO性能
- 每次启动时ES都要重新执行translog中记录记录的操作,所以我们提前通过flush执行完translog,能够缩短服务启动的时间
- 稳妥起见,每次更新一个节点都等到数据重新平衡之后,集群状态变回green再操作下一个节点,这样保证不会丢失数据
本文参考了官方文档: upgrading Making Changes 曾经没仔细考虑就重启了线上服务/重新开启索引,因为线上索引量确实很大,等了五六分钟服务才恢复,在那五六分钟里我的内心是奔溃的……痛定思痛,整理了该文档,希望大家可以安心顺利地进行热更新。