Elasticsearch

ElasticSearch大版本升级踩坑记

2018-07-30  本文已影响44人  达微
image.png

大版本升级,从ES 2.1到ES5.5,两年的数据,每天15GB,5个节点,前后历时一个月左右。

限制条件:

  1. 升级过程有新的数据不断进来,不能停止整个集群,否则会丢失数据。
  2. 没有额外的机器搭建一个全新的ES5集群,只有一个机器供缓冲使用。
  3. 一个临时的ES5节点cpu 8核,内存32GB,10T 磁盘,升级完成后需要释放掉这台机器。
  4. 很多线上的服务依赖于目前的ES2提供服务,线上服务不能中断。

记录一下整个流程。

首先是做决定到底是采用全集群方式升级还是平滑方式升级。

升级方案选择

全集群升级

1.关闭shard分配,防止关闭一个节点后ES集群误认为node故障,在剩余节点上执行 shard 恢复,如果数据过多,可能会由于产生大量IO造成ES集群挂起。

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}

2.执行同步刷新, 这样集群重新启动后shard恢复更快。

POST _flush/synced

3.关闭集群中所有的ES进程。

4.安装ES5,并且修改配置文件,配置好data路径。不要直接指向2.x的路径,否则一旦升级失败,老数据无法恢复。

5.配置好路径后将2.x的data目录copy到新的路径下。

6.启动ES5 集群,等待集群状态变为green即可

优点

简单,速度快,一步到位

缺点

Reindex 平滑升级

这种升级方式其实就是对所有的数据做一次重新处理然后自己通过http接口重新写入到新的 ES5缓冲节点,然后再将原来的ES2的节点逐台加入的新的集群,之前的数据和配置都清空。

程序大致流程

ES2 -> scanner -> redis -> reindex -> ES5

引入Redis作为中间缓冲的考虑:

  1. 数据量巨大,索引过程很难保证一次成功,基于scroll方式取数据无法保证顺序,所以一旦中途失败无法判断offset,为了不丢不重复,只能从头再来
  2. 需要对每一个doc进行特有字段的部分处理, Redis中缓存的是处理后的doc
  3. ES的查询速度和索引速度不一致,从ES2读取数据经过处理后写入ES5整个流水线耗时太长,容易网络超时失败

升级方案踩坑记

经过内部讨论决定采用平滑升级的方式。

知识点总结

整个过程涉及到的知识点如下:

  1. python requests库使用。
  2. es scroll API使用。
  3. yum 安装特定版本软件包以及配置清华源。
  4. 阿里云系统盘镜像创建以及替换部署。
  5. lvm管理多个磁盘。
  6. systemctl 使用以及service配置文件。
  7. es index template 配置。
  8. nginx basic auth反向代理配置。
  9. es hadoop map reduce API使用。
  10. python redis 使用。
  11. Logstash,ES,Kibana 安装部署以及配置。

作者:大胡桃夹子
链接:https://www.jianshu.com/p/dc6b4e84a673
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇下一篇

猜你喜欢

热点阅读