ElasticSearch大版本升级踩坑记

大版本升级,从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即可

优点

简单,速度快,一步到位

缺点

  • 由于ES2.x到ES5.x内部结构变化较大,升级过程不可控,中间可能会有大坑或者升级失败
  • 目前ES存储的数据结构有需要改进的部分(比如某些字段类型,analyzed等),这样升级后还是原来的结构,后续可能还需要对数据进行reindex。

Reindex 平滑升级

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

程序大致流程

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

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

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

升级方案踩坑记

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

  • 使用python将每天的数据从ES2->ES5,每天大概2000万条数据,使用官方的elasticsearch python库每次到几百万数据的时候就会出现连接超时,由于没有offset机制,所以只能删除从头再来。后来基于requests库自己封装scroll API来进行reindex,有时发现1000多万的时候scroll API就返回没有谁了,后来经过调试发现不能只是简单的根据hits的条数是否为0来判断数据是否全都读取完毕。这里官方文档中并没有提及,最终添加了好几个判断条件和错误处理,终于可以完整的读完所有数据,一条不差。

  • 中间引入了redis作为缓存,防止reindex程序中间挂了,从头再来。es2->redis->es5,由于读的速度远远大于写的速度,而且只有一台es5节点,所以需要开多个进程往es5中写。突然有一天发现es5挂掉了,查找原因,发现redis的内存已经占满了所有机器的内存,操作系统自动杀掉了es5节点。于是加入流控机制,一旦redis中的数据超过限制,那么读取程序需要挂起。

  • 数据全都写入到ES5的临时节点后,开始一台一台的升级ES2。之前在ES2的升级过程中通过yum安装ES时发现ES已经从5.5.1升级到了5.5.2,ES对于版本的控制非常严格,虽然可以同时正常的查询工作,但是之前的数据都是5.5.1版本,无法在5.5.2版本的node上写入数据,没办法,只能先升级原先的es5tmp节点到5.5.2版本,由于是小版本升级,直接yum update然后重新启动节点即可。

  • 数据的存储之前并没有采用LVM管理,所以添加一块磁盘,需要修改ES的配置文件,然后重新启动机器,这次升级顺便将所有的ES的数据盘配置为LVM方式。由于之前已经有一部分数据写入到了新加入的非LVM节点上,所以需要将其中的shards再写回到es5tmp临时节点,查看文档,发现使用cluster.routing.allocation.exclude._ip设置可以达到要求,设置完成后分片会自动写回到临时节点上。LVM磁盘配置好后,重新加入集群,使用cluster.routing.allocation.include._ip设置后发现并没有作用,经过尝试发现,必须cluster.routing.allocation.exclude._ip设置为空字符串,同时cluster.routing.allocation.include._ip也必须设置为空。等待所有的ES2的节点都加入集群后,将临时节点的ip设置到exclude中,这样所有的shards和副本都会自动转移到新的节点上。

  • 由于内存和资源限制,整个升级过程是每次打开一个月的index,所有的主分片都从临时节点转移后,再设置replica个数为1,等所有副本都完成后,close这个月的所有index,然后开始下一个月。这样整个过程只保留了当前最新的一个月的数据(供在线服务使用)和正在进行中的那个月的数据,整个集群压力较小。

  • 升级完成后安装Kibana,发现ES已经升级到5.6了,不想折腾ES的各个节点升级到5.6,所以通过yum安装5.5.2的Kibana。

  • 升级完成后http query的接口已经完全变了,所有之前依赖es2的查询接口都需要重写。

  • 所以的kibana和ES节点都监听内网地址,不安装x-pack,通过部署一个nginx的代理和简单的用户名密码认证来做简单的安全验证。使用cerebro(之前的kopf)来对集群的状态进行简单的监控和更新配置。

  • 中间还包括了logstash配置更新,kibana配置更新,ES->Hadoop的代码更新不再一一细说。

知识点总结

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

  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 安装部署以及配置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容