导读:滴滴 ElasticSearch 团队经过 7 个月的奋斗,将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 6.6.1。完成ES版本升级的过程中,也完成了滴滴 ElasticSearch 平台的架构升级,如此大规模的跨大版本升级,在 ES 业内也很少见,从开始准备到实际执行,遇到了很多困难,踩了一些坑,期间也有很多我们的思考,为此我们准备一系列的总结和分享。
2019 年 1 月到 2019 年 7 月滴滴 ElasticSearch 团队( Arius )将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 6.6.1。
在对用户查询写入基本零影响和改动的前提下,解决了ES跨大版本协议不兼容、mapping 不兼容等业内难题,整个过程对绝大部分用户完全透明。
团队同学经过 7 个月的奋斗,完成ES版本升级的过程中,也完成了滴滴 ElasticSearch 平台的架构升级,取得了单机查询性能提升 40%,整体集群 cpu 下降 10%,写入 tps 提升 30%,归还物理机近 400 台,成本节约 80w/月、0 故障的成绩,并在引擎上向社区贡献了4 个 PR,一位同学升级为 ES Contributor。
如此大规模的跨大版本升级,在 ES 业内也很少见,从开始准备到实际执行,遇到了很多困难,踩了一些坑,期间也有很多我们的思考,为此我们准备本期的总结和分享,主要从以下几个方面展开:
1. 背景 - 推石头的西西弗斯
2. 困难 - 拔剑四顾心茫然
3. 思考 - 天生我材必有用
4. 实战 - 百战沙场碎铁衣
5. 收益 - 长风破浪会有时
6. 展望 - 直挂云帆济沧海
1.
背景:推石头的西西弗斯
滴滴 ElasticSearch 团队从 2016 年开始建设 Elasticsearch 平台,在 16 年 6 月份的时候开始对外提供服务,当时选择了 Elasticsearch 最新的 2.3 版本。
如今3年过去了,Elasticsearch 生态经历了飞速的增长,elastic 公司完成了上市,Elasticsearch 在 db-engines 的分数从 88 上涨到 148,排名从 11 名上升到第 7 名。这期间 ES 发布了 3 个大版本,几十个中版本,而最近 Elasticsearch 已经发布了 7.x 版本。
在这三年中滴滴 ElasticSearch 平台基于 Elasticsearch 推出了日志检索、Mysql 实时数据库快照、分布式文档数据库、搜索引擎等四大服务,四大业务均快速发展。
目前滴滴 ElasticSearch 平台服务了集团里面 1200 个应用,其中:订单、客服、金融、把脉、新政等业务核心实时场景也运行在 Elasticsearch 之上,运维 ES 集群 30+,写入 tps 峰值到达 1500w,查询 qps 达到 2w。
业务的快速发展既是滴滴 ElasticSearch 团队工作的肯定,但随之而来也有巨大的挑战和压力,其中版本过低是未来 ElasticSearch 平台发展最大制约因素,其中主要有以下几点:
社区不再维护老版本
Elasticsearch 2.3.3版本过于陈旧,ES 社区早已不再进行维护,在 2.x 上遇到的问题社区不解决,提交的 issue 也不处理,提交代码也不被接收。基于 2.3.3 我们也解决了很多 ES 自身的问题,如:master 更新元数据超时导致内存泄露、tcp 协议字段溢出等。由于无法和社区互动,团队同学的价值也得不到社区的认可,长此以往只会和 ES 生态越来越远,我们在 ES 技术圈中的声音也会越来越弱。新版本特性很难被使用
最近 3 年是 ES 生态大发展的 3 年,ES 自身在功能、性能上都有非常大提升,如:默认使用 BM25 评分算法,效果更佳;lucene docvalues 稀疏区域改进,更节约磁盘空间;新增 Frozen indices 能力,可以显著降低 ES 内存开销。很多特性也非常适合 ElasticSearch 平台的场景,但是版本差距过大一直制约着我们,无法享受技术进步的红利。
一边是业务快速发展要求更丰富的功能、更强大的性能、更低的成本、更稳定的服务;一边离最新的业内技术越来越远,团队价值越来越弱,逐渐沦为一支只能做业务的伪引擎团队,整个团队的现状就如同推石头的西西弗斯。
要么我们迎难而上,克服困难,一口气把整个集群升级到最新的版本,把石头推过山顶,再轻装前行;
要么就是继续独自勉力支撑,在业务和引擎的双重压力下蹒跚而行。
滴滴 ElasticSearch 团队最终选择对滴滴 ElasticSearch 平台进行重构并将维护的所有ES集群升级到最新版本。
2.
困难:拔剑四顾心茫然
理想很丰满,现实很骨感,下决心很容易,然而实际执行很困难。
"2.3.3 和 6.6.1 协议不兼容啊,6.6.1 都不支持 tcp 协议了,那些通过 tcp 查的用户怎么办,让他们一个一个改代码,那要改到什么时候?"
"2.3.3 和 6.6.1 有些返回的字段都不一样了,有些查询语法也不兼容,怎么做到对用户的透明,还是直接强迫用户接受改变?"
"2.3.3 和 6.6.1 lucene 文件格式都不一样,没办法原地直接升级,要再搞个集群全部双写一遍"
"2.3.3 和 6.6.1 的 mapping 格式不统一,6.6.1 不支持多 type,现有的那些数据搬迁都没办法搬"
"滴滴 ElasticSearch 平台现在不支持索引多版本同时查询,用户查询习惯也千奇百怪,很多带*查询你根本控制不了"
"用户那么多,使用差异很大,怎么和用户进行沟通和宣导,怎么屏蔽用户影响和管理用于预期?"