es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路

前不久,滴滴ES团队将维护的30多个ES集群,3500多个ES节点,8PB的数据,从2.3.3跨大版本无缝升级到6.6.1。在对用户查询写入基本零影响和改动的前提下,解决了ES跨大版本协议不兼容、文件格式不兼容、mapping不兼容等难题,整个过程对绝大部分用户完全透明。同时还完成了Arius的架构升级,取得了单机查询性能提升40%,整体集群cpu下降10%,写入tps提升30%,集群资源使用率提升20%、0故障、运维成本下降60%的成绩。

本文将系统的介绍滴滴在从2.3.3跨大版本升级到6.6.1过程中的遇到的问题和解决方案,以及在搜索平台建设过程中的体系化思考。

01

背景介绍

1. 集群规模

47caeab0df1b4f0ae438bfcd49a574ab.png

目前滴滴使用的ES版本是2.3.3,集群个数有40多个,节点规模有3500+,集群总容量有8PB。

2. 业务规模

681bd17ef4302dbe10123bfbd1f2dc64.png

1200多个平台应用方在使用ES,30多个核心应用在使用ES,写入的TPS有1500W,查询的QPS有25W。

02

问题分析

针对以上规模的ES集群,从2.3.3升级到6.X版本,小版本会根据最后分析的结果确定,需要对潜在可能的问题进行分析和区分。

1. 问题分析

c8e6d425ef42373ba938e6619fcf8121.png

主要先从四大问题域进行区分分析:

  • 引擎侧:由于从2.3.3升级到6.X版本,版本差距过大,在文件格式和协议上都不兼容,因此无法进行原地滚动直接升级,需要双写搬迁升级,这样会耗费大量的机器去参与其中
  • 用户侧:6.X版本开始逐渐的不支持TCP接口,因此需要用户适配和升级;查询和返回值也有一定差异,如果用户侧做适配,会极大影响升级的进度
  • 资源侧:由于无法直接原地滚动直接升级,需要双写使用大量的机器,但是无法提供升级所需要的机器,如果升级过程中资源无法得到保障,那也会极大影响升级的进度
  • 操作侧:新版本的多集群如何进行运维管控?升级的结果如何验证?查询的效率和质量如何保障和保证的?这些问题都需要考虑

2. 升级思路

c50d491a175f21fd07738c11c3330aa6.png

根据上一部分问题的汇总和分类,形成了一个大致的升级思路并会根据这四大步骤来解决具体的问题。

  • 架构设计:平台支持多版本支持,查询网关上进行多版本兼容,在查询和插入使用SDK时候要做到SDK接口的透明,最后要做一个平台数据采集和分析用于后续做升级的分析对比
  • 资源准备:进行合理的多集群容量规划来提高资源使用率,尽可能的节省机器;设计索引分级存储来提升资源的利用率;还针对大索引迁移开发了一个插件FastIndex也用来提升资源利用率
  • 运维绩效:开发ES集群管控平台,将ES集群管控平台化和图表化;通过Docker的方式来提升部署和运维的效率
  • 实操:在实际操作中,需要实现批量双写以及查询回放的功能;需要对业务进行区分,实现日志和核心集群的分步推进;最后就是升级过程中会遇到一些坑,需要把坑都填满,后续会详细介绍一下这些坑

3. 升级方案

171ac479e8675e585a0fb2169dc6f6a5.png

上面是升级思路,接下来介绍一下升级方案:

  • 架构:ES多版本支持的架构改造,同时支持2.3.3以及6.X版本;开发一套多集群管控平台,用于滴滴内部ES多个集群的管控;同时还开发了一套ES服务元数据体系建设
  • 资源:设计ES分级存储体系;开发ES-FastIndex离线数据导入的插件;最后构建了一套ES集群容量规划方案来提升集群的资源使用率,节约资源成本
  • 实操:通过ES多集群搭建、ES流量回放对比系统、ES版本升级采坑分享来完成升级和对比的一个过程

03

方案介绍

1. 架构

① 架构重构

b5e58d68b6dfa88abf2ff4a64f6e6fed.png

介绍一下滴滴搜索平台(Arius)的架构,业务方使用ES搜索进行读写请求时都会经过网关;运维的时候会根据集群的重要程度进行划分,会将四十多个集群划分为VIP、Important、Normal、Backup四类,开发了一个DCDR工具用于跨集群的数据同步;在ES集群运维之上开发了三大组件,一个是ES Cluster Manager,用于集群的搭建、重启和升级混合操作的平台;第二个是集群ES的数据分析构建了一个Arius Metadata Service的元数据管理服务,用于做DSL分析、成本优化和查询回放;在这两个系统之上有一套Arius Admin管控系统,包含索引管控、权限管控、DSL运维、多版本支持、资源管控以及容量规划等功能;基于Arius Admin,构建了两套面向运维和用户的管控平台前端工程。

以上就是滴滴搜索平台的整体架构,然后基于此来做ES的版本升级。

② 升级流程

8427b9b996865b5c79c5eeb4ced518e1.png

上图为升级的流程,首先是要升级对ES集群的管控,要支持2.3.3和6.6.1两个版本;对每个要升级的索引要进行主备索引的创建,创建完毕后通过双写的形式对主和备都同时写入到新的索引中,对于历史索引采取的是这样一个策略:在双写之前,主备创建之后,会暂停历史数据的写入,把历史数据通过migration的方式从低版本迁移到高版本中,迁移完后再进行双写;在迁移完成,双写链路打开之后,做一个DSL数据回放,由于用户的读写都是通过gateway进行的,所以可以拿到用户的DSL语句和返回数据来进行一个高低版本的查询、对比和分析,如果最后比对结果是数据一致、性能也一致,那就认为该索引在高低版本中迁移是成功的。如果迁移成功,会在网关层完成用户查询的向高版本的切换,如果切换完成后,业务方运行没有问题就会将低版本的索引下线掉,最终就完成了索引由低版本向高版本升级的过程。

③ GateWay兼容性

cd5dbcb67bcb1b42fd073c2751eb19fa.png

升级是一个比较漫长的过程,高低版本集群会并行运行一段时间,用户使用的SDK也会高低版本共存,这样就需要解决高低版本兼容性的问题。查询可能会分为上图六条线标识的六种情况,蓝色线表明不需要进行改造直接进行查询的,2.3.3的http和tcp sdk查询2.3.3ES集群,6.6.1 high sdk查询6.6.1的ES集群都是没有问题的;红色线表明是需要考虑兼容性问题进行改造的,例如2.3.3的sdk查询6.6.1的ES集群时候语法的差异性问题等,然后ES高版本中会逐渐取消掉tcp的查询接口,但是滴滴内部还是有很多用户是使用tcp方式查询的,如果需要用户进行代码改造的话流程会非常漫长,因此在Gateway层面做了一些兼容性处理:在2.3.3http api和6.6.1 high sdk查询6.6.1集群和2.3.3集群时候,做了请求DSL的兼容性处理和响应结果兼容,解决了用户的痛点;对于使用tcp方式查询的用户,开发了一个elasticsearch-didi-java-client的sdk,用户替换一下pom即可,表面上还是使用tcp的方式,但是在网关层面已经将其转换为了http查询的方式。这样就做到了用户透明。

④ ES集群管控平台

1a7527260979f5bd000d053f9890097c.png

同时搭建了一套ES集群管控平台,用于进行集群搭建、集群扩容、集群升级、集群监控以及集群诊断等工作,为升级过程中的运维赋能,提升升级推进进度。

⑤ 元数据服务

6013d1ba2a8e2fbf05e2ba4698e05aa0.png

前面介绍的时候有讲到元数据服务,该模块的作用就是提供一个ES集群和业务方的数据的分析,然后获取cluster/stats、node/stats、日志、监控数据等信息进行分析,最后可以得到节点磁盘使用状况、DSL查询情况(慢查、错误查询),基于此来做容量规划、分级存储、查询回放等数据驱动型工作。

⑥ DSL服务

803df7de125dafb10152431ca479a6f8.png
5db2f9a983c64b3ed88b9097b3ba0dc8.png

此处着重介绍一下DSL服务,用户所有请求都会通过网关,经过网关时会收集到kafka,然后用flink做一些分析,如DSL模板提取(具体查询参数去掉,抽象为模板)、DSL统计、DSL慢查分析、DSL异常分析等,然后将分析结果回写到ES集群中;然后根据这些分析的数据来做DSL审核(用户可能会查询滴滴的核心索引,此处需要审核才能查询)、DSL限流(有的DSL里面会有大量的聚合查询,此处会进行一定限流)、DSL分析(首先会对DSL语句进行语法树的解析,解析后会生成一个无参的查询模板)等。

2. 资源

① 容量规划

dc9200c2c661520eeee8b8b039a9817c.png

接下来将一些如何在升级过程中解决资源问题,为此开发了一个容量规划的算法,ES缺乏一个多节点之间索引均匀分布的功能;在滴滴内部最大的集群是在两百多个节点,承载容量在PB级别,索引有上千个,在写入索引时候可能流量分布式不均匀的,很有可能有索引节点的热点存在。

解决思路为将两百多个节点进行划分为五个region,一个region都会有很多节点组成,如r1、r2、r3组成,划分之后就可以计算每个region中节点磁盘的使用情况,设置一个高水位线和低水位线,通过分析每个region的数据情况,region超过高水位就会通过rack变更进行扩容,region内部会监控不同节点的使用情况,通过rack建索引mockShard进行均衡,从而整体提升资源利用率,通过该算法后集群磁盘的使用率从百分之四十提升到百分之六十,这样就节省了大量的资源。

② 分级存储

0db7708ce9caa42ae6b1b41ed249b624.png

基于用户查询和保存的操作进行一个数据分析,开发了一个ES分级存储的体系,搭建ES集群时候主要基于两种磁盘进行搭建的,一种是SSD磁盘,另一种是Ceph(可以理解为HDD磁盘组成的网络磁盘);SSD磁盘非常贵,但是查询性能特别好,会存储一些查询频繁的数据,Ceph磁盘比较便宜,但是查询IO性能比较低,存储查询不是那么频繁的数据;根据用户查询的频率,将数据区分为冷数据和热数据,根绝查询的DSL来分析索引的保留期限,在滴滴内部基本上索引都是按天保存的(举个例子:日志都是按天建索引保存的),三天之内的放到SSD上保存,三天之前的数据会放到Ceph上存储,这样可以大量存储的成本,同等成本情况下,把集群存储容量从5PB提升到了8PB。

在分级存储之上,还开发了一些特性,专门开发了high level和low level的水位线,这是基于冷存和热存系统消耗是不一样的,冷存的时候high level可能会更高一点,以上就是分级存储的内容。

③ FastIndex

f095a02f42c474b9370134c398faefb8.png

另外还为离线数据导入ES开发了一个FastIIndex的组件,该组件开发主要是基于滴滴内部用于分析乘客的标签系统,从离线系统导入ES集群而开发的;标签系统每天都会重新计算,数据总量在40TB左右,原始数据在hadoop上,计算好之后通过kafka然后实时链路写入到ES,以前把40TB数据导入到ES需要40台高配物理机,基于这样一个案例开发了FastIndex组件,利用hive进行一个mapreduce的过程,在reduce阶段使用FastIndex组件启用ES local这样的模式将数据写到lucene data中,然后再把lucene文件加载到ES集群中,这样就完成了把离线数据导入ES集群的操作,资源从40台下降到10台高配物理机,时间也从6小时下降到1.5小时,节省了大量的成本。

3. 升级

① 查询回放

066eeaff7d139c6952b93fbfd1ac73c0.png

机器资源优化好了之后,开始升级,升级过程前面有讲过了,这里主要介绍一下查询回放流程,因为要保证升级后对用户的查询是没有影响的;基于gateway网关层DSL的分析,将用户查询的DSL全部在高低版本上进行一个回放,最后得出一份查询性能报告和查询结果报告,通过分析两篇报告,如果是一致的就认为升级完成;如果不一致,就分析2.3.3和6.6.1哪些查询导致的问题,然后做兼容性适配,适配完成后再进行查询回放,循环往复直至最后所有的报告都一致,这样就认为ES集群升级成功。

② 采坑

b0d05da1b5aba612833e199faa882b05.png

接下来介绍一下升级过程中遇到的坑:

  • Mapping:选择6.6.1的理由是代码里面暂时还是支持多type的;还有就是布尔类型数据的兼容,分词不分词的mapping修改,这些内容都会提前帮助用户修改好mapping。
  • 查询兼容:聚合查询term size不能为0,网关兼容默认返回1000条;match不支持type关键字,网关兼容查询type处理逻辑;not/or/and关键字不兼容,网关转换must/should/must_not;不支持关键字fields,网关转换为store_fields
  • 性能:数值字段改为BKD,枚举字段会从Long类型改为keyword类型;否则long类型在BKD查询时候还有问题的
  • SDK:使用高版本ES会有堆外内存消耗过大的问题,需要开启jdk,nio.maxCachedBudderSize参数来保障堆外内存不会消耗过大。

04

升级收益

1. 平台升级

bfcd43c477a491ff0a2497b8657c05f8.png
d1729d8ad44a68435e875cdc6e2dd186.png

构建了一个完善的管控的平台,大大降低了使用成本。

2. 成本下降

5b8d01402d2cd51670a1f8cd5dd0759f.png

机器数量下降了400台,每月成本节约了80万左右。

3. 性能提升

b4684f2283d776a55908c98f25b4b814.png

高版本的ES查询性能提升还是很明显的,请求耗时下降40%,集群写入提升30%。

4. 特性应用

使用了高版本特性带来的一些优势:

  • Sequence Number提升了集群升级速度
  • Ingest Node索引模板和限流从网关层下放到引擎层
  • DCDR滴滴跨集群数据同步,相比CCR性能提升2倍
  • Cluster reroute冷热节点shard搬迁更均匀
  • Cluster allocation explain降低集群状态运维成本

05

总结与展望

1. 总结

fecee2e978af87f6618ebcbb2c9b3979.png

针对搜索平台进行大版本的升级时,一定要做到:

  • 架构要可控:服务化(网关服务、管控服务、元数据服务、FastIndex服务)、高内聚、一定优先保证稳定性
  • 平台要易用:平台化、自动化、可视化
  • 成本要低廉:数据驱动、技术改造、业务配合
  • 引擎要深入:深入理解版本差异、深入理解ES原理、深入定位问题根因

2. 规划

0d0effbcb0cf71d5642a24e40f7fbabf.png

最后对滴滴搜索平台做一个整体的规划:

  • 更大的集群:在滴滴现有的目前40多个集群的规模下,做得更大,由于master元数据管理的限制导致对集群的管控是无法做到非常大的,目前滴滴希望做到单集群支持50万下载、1500节点的支撑;同时需要做好多租户能力的支持
  • 更易用的平台:ES云平台建设、ES专家服务
  • 更强的引擎:CBO/RBO查询优化、提升写入性能
  • 更多的贡献:加强和开源社区的互动、深入引擎开发

作者:赵情融 滴滴出行专家工程师,负责滴滴搜索平台建设工作,曾在阿里工作多年,有丰富平台建设经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子工程可以报考二建_非工程类专业也能报考二建吗?

非工程类专业也能报考二建吗?2020年非工程类专业能考二级建造师的省份汇总整理!2020年二级建造师考试报名公告陆续公布中,目前江西、陕西、江苏三省公布了报名时间,其他省份报名时间暂时未确定。四川省已经受疫情影响推迟五月的考…

计算机考试中英文打字题,计算机信息技术(五笔及中英文打字测试试题)

计算机信息技术(五笔及中英文打字测试试题) (14页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.9 积分第一章基本知识习题答案一、填空题1. 计算机信息高新技术考试划分为五、四、三、二、_ 5个等…

pil python 安装_20行Python代码给微信头像戴帽子

作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者。朋友圈里微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然后可高兴地表示“哎呀好神奇hhhh”,呆…

arcgis 属性表 汇总_Arcgis中遥感影像地理配准、矢量化与地图制作

目的:将遥感图像进行地理配准、矢量化,并且制作地图。要求:对的遥感图像进行地理配准;矢量化建筑物、绿地、道路、水体等主要地物要素;对各类地物要素进行符号化设置并对其名称进行标注;添加指北针、比例尺…

怎么查看计算机的系统内存大小,Windows10系统怎么查看电脑内存大小

很多用户在升级到windows10系统之后,因为很多界面和操作都跟之前的Windows系统不一样,所以很多操作都不知道要如何下手,比如想要查看电脑内存大小的时候却不知道要怎么操作,其实方法很简单,下面给大家介绍一下Windows1…

java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象

Java是面向对象的高级编程语言,面向对象的特征如下:面向对象具有抽象、封装、继承、多态等特性;面向对象可以将复杂的业务逻辑简单化,增强代码复用性;面向对象是一种常见的思想,比较符合人们的思考习惯。面…

计算机开机时间停在上次关机,怎么在电脑开机的时候查看上次关机前的操作

满意答案wencai242013.09.05采纳率:51% 等级:12已帮助:12606人1.看计算机在哪天运行过~运行了多久!(系统安装在c盘)找到c:\windows\SchedLgU.txt文件 里面有你自这个系统产生以来曾经工作过的时间,包括哪天开了机 开机时间 关机…

php 递归实现无限极分类和排序_PHP实现选择排序

这次说说选择排序。 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找…

idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍

IDEA是目前市场上最好用的IDE,公认的!前几年eclipse在市场上非常流行,因此大多数人都习惯了eclipse的一些快捷键。近年来,随着IDEA的兴起,很多人都放弃了exlipse,进而选择了IDEA,但是有些人习惯…

从物联网到 3D 打印:硬件相关的开源项目概览 | 开源专题 No.52

arendst/Tasmota Stars: 20.4k License: GPL-3.0 Tasmota 是一款为 ESP8266 和 ESP32 设备提供的替代固件,具有易于配置的 webUI、OTA 更新、定时器或规则驱动的自动化功能以及通过 MQTT、HTTP、串口或 KNX 进行完全本地控制。该项目主要特点包括: 支持…

helm安装postgres_Helm 入门介绍 Kubernetes 上的包管理软件

这篇文章介绍一下云原生应用在 Kubernetes 上安装时,经常会用到的一个重要工具,Helm。Helm 是 Kubernetes 的包管理软件。提到包管理软件,很多人都不陌生。Maven、Gradle、pip、RubyGems 和 npm 都是包管理软件。作为一个包管理软件&#xff…

flutter 分割线_Flutter 底部弹框 showModalBottomSheet 使用Demo

题记—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。Flutter是谷歌推出的最新的移动开发框架。【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过 文章底部扫码关注【x2】各种系列的视频教程 免费开源 关注 你不会迷路【x3】系…

饥荒进地洞服务器无响应,饥荒联机洞穴设置及常见问题的解决方法

进阶篇服务端mod设置:首先(1)下载好要用mod,然后下载通用工具,解压放到DST的mod文件夹里运行(2)此时在文档\Klei\DoNotStarveTogether会多出一个文件modoverrides,把它复制到文档\klei\DoNotStarveTogether_EasyConfigCaves&#…

魔兽对战平台修改服务器数据,《魔兽争霸3》1.29补丁上线官方对战平台:平衡性大做改动...

IT之家3月1日消息 今天《魔兽争霸》官方微博宣布《魔兽争霸3》的最新补丁也就是1.29补丁已经登陆官方对战平台的PTR服务器上,想要尝鲜的用户可以前往官方对战平台进行更新和游玩。1.29补丁除了增加对于宽屏游戏的支持之外,还针对英雄单位进行平衡性的改动…

查询列名在哪张表_探索SQL-多表查询

一、表的加法(Union)1、用法:将两个表合并成一个表2、语句:select 查询结果 from 从哪张表查询 union select 查询结果 from 从哪张表查询*需保留重复行*select 查询结果 from 从哪张表查询 union all select 查询结果 from 从哪张…

使用未初始化的内存是什么意思_他们都说JVM能实际使用的内存比-Xmx指定的少?这是为什么呢...

这确实是个挺奇怪的问题,特别是当最常出现的几种解释理由都被排除后,看来JVM并没有耍一些明显的小花招:-Xmx和-Xms是相等的,因此检测结果并不会因为堆内存增加而在运行时有所变化。通过关闭自适应调整策略(-XX:-UseAdaptiveSizePo…

定义整型数组_C语言基础-数组怎么用

到目前为止,我们了解到C语言中可以使用整型,浮点型和字符型的数据类型来描述我们人类世界的各种数据,但是这些还远远不够……我们在IOT领域经常会遇到这样一个数据使用场景:某天的固定时间内,会有多台(我们…

找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)

在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。针对top K类问题,通常比较好的方案是分治Trie树/hash小顶堆(就是上面提到的最小堆),即先将数据集…

crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset

1.Contribution(1)主要是提出了基于GTA5的GCC数据集数据集下载地址:https://gjy3035.github.io/GCC-CL/​gjy3035.github.io(2)提出了在如何在GCC上train,然后在传统的通用数据集上test的迁移学习方案&…

代码更换ui图片_用技术的方式,在UI设计稿中设置随机码,保证高清

本文首发于:行者AI 在工作中会遇到批量给图片添加文字,随机码等需求,当数据码数量较大时,UI的工作量就会非常大,这时候我们可以用python来帮我们提高工作效率。1. 需求分析我们有这样一张图片,我们需要将一…