京东把 Elasticsearch 到底用的有多牛?日均5亿订单查询完美解决!
点击“开发者技术前线”,选择“星标????”
在看|星标|留言, 真爱
来源:京东技术(ID: jingdongjishu)
京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。
我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的查询是不可取的。同时对于一些复杂的查询,MySQL支持得不够友好,所以订单中心系统使用了Elasticsearch来承载订单查询的主要压力。
Elasticsearch作为一款功能强大的分布式搜索引擎,支持近实时的存储、搜索数据,在京东到家订单系统中发挥着巨大作用,目前订单中心ES集群存储数据量达到10亿个文档,日均查询量达到5亿。
随着京东到家近几年业务的快速发展,订单中心ES架设方案也不断演进,发展至今ES集群架设是一套实时互备方案,很好地保障了ES集群读写的稳定性,下面就给大家介绍一下这个历程以及过程中遇到的一些坑。
ES 集群架构演进之路
1、初始阶段
订单中心ES初始阶段如一张白纸,架设方案基本没有,很多配置都是保持集群默认配置。整个集群部署在集团的弹性云上,ES集群的节点以及机器部署都比较混乱。同时按照集群维度来看,一个ES集群会有单点问题,显然对于订单中心业务来说也是不被允许的。
2、集群隔离阶段
和很多业务一样,ES集群采用的混布的方式。但由于订单中心ES存储的是线上订单数据,偶尔会发生混布集群抢占系统大量资源,导致整个订单中心ES服务异常。
显然任何影响到订单查询稳定性的情况都是无法容忍的,所以针对于这个情况,先是对订单中心ES所在的弹性云,迁出那些系统资源抢占很高的集群节点,ES集群状况稍有好转。但随着集群数据不断增加,弹性云配置已经不太能满足ES集群,且为了完全的物理隔离,最终干脆将订单中心ES集群部署到高配置的物理机上,ES集群性能又得到提升。
3、节点副本调优阶段
ES的性能跟硬件资源有很大关系,当ES集群单独部署到物理机器上时,集群内部的节点并不是独占整台物理机资源,在集群运行的时候同一物理机上的节点仍会出现资源抢占的问题。所以在这种情况下,为了让ES单个节点能够使用最大程度的机器资源,采用每个ES节点部署在单独一台物理机上方式。
但紧接着,问题又来了,如果单个节点出现瓶颈了呢?我们应该怎么再优化呢?
ES查询的原理,当请求打到某号分片的时候,如果没有指定分片类型(Preference参数)查询,请求会负载到对应分片号的各个节点上。而集群默认副本配置是一主一副,针对此情况,我们想到了扩容副本的方式,由默认的一主一副变为一主二副,同时增加相应物理机。
订单中心ES集群架设示意图
如图,整个架设方式通过VIP来负载均衡外部请求:
整个集群有一套主分片,二套副分片(一主二副),从网关节点转发过来的请求,会在打到数据节点之前通过轮询的方式进行均衡。集群增加一套副本并扩容机器的方式,增加了集群吞吐量,从而提升了整个集群查询性能。
下图为订单中心ES集群各阶段性能示意图,直观地展示了各阶段优化后ES集群性能的显著提升:
当然分片数量和分片副本数量并不是越多越好,在此阶段,我们对选择适当的分片数量做了进一步探索。分片数可以理解为MySQL中的分库分表,而当前订单中心ES查询主要分为两类:单ID查询以及分页查询。
分片数越大,集群横向扩容规模也更大,根据分片路由的单ID查询吞吐量也能大大提升,但聚合的分页查询性能则将降低;分片数越小,集群横向扩容规模也更小,单ID的查询性能也会下降,但分页查询的性能将会提升。
所以如何均衡分片数量和现有查询业务,我们做了很多次调整压测,最终选择了集群性能较好的分片数。
4、主从集群调整阶段
到此,订单中心的ES集群已经初具规模,但由于订单中心业务时效性要求高,对ES查询稳定性要求也高,如果集群中有节点发生异常,查询服务会受到影响,从而影响到整个订单生产流程。很明显这种异常情况是致命的,所以为了应对这种情况,我们初步设想是增加一个备用集群,当主集群发生异常时,可以实时的将查询流量降级到备用集群。
那备用集群应该怎么来搭?主备之间数据如何同步?备用集群应该存储什么样的数据?
考虑到ES集群暂时没有很好的主备方案,同时为了更好地控制ES数据写入,我们采用业务双写的方式来搭设主备集群。每次业务操作需要写入ES数据时,同步写入主集群数据,然后异步写入备集群数据。同时由于大部分ES查询的流量都来源于近几天的订单,且订单中心数据库数据已有一套归档机制,将指定天数之前已经关闭的订单转移到历史订单库。
所以归档机制中增加删除备集群文档的逻辑,让新搭建的备集群存储的订单数据与订单中心线上数据库中的数据量保持一致。同时使用ZK在查询服务中做了流量控制开关,保证查询流量能够实时降级到备集群。在此,订单中心主从集群完成,ES查询服务稳定性大大提升。
5、现今:实时互备双集群阶段
期间由于主集群ES版本是较低的1.7,而现今ES稳定版本都已经迭代到6.x,新版本的ES不仅性能方面优化很大,更提供了一些新的好用的功能,所以我们对主集群进行了一次版本升级,直接从原来的1.7升级到6.x版本。
集群升级的过程繁琐而漫长,不但需要保证线上业务无任何影响,平滑无感知升级,同时由于ES集群暂不支持从1.7到6.x跨越多个版本的数据迁移,所以需要通过重建索引的方式来升级主集群,具体升级过程就不在此赘述了。
主集群升级的时候必不可免地会发生不可用的情况,但对于订单中心ES查询服务,这种情况是不允许的。所以在升级的阶段中,备集群暂时顶上充当主集群,来支撑所有的线上ES查询,保证升级过程不影响正常线上服务。同时针对于线上业务,我们对两个集群做了重新的规划定义,承担的线上查询流量也做了重新的划分。
备集群存储的是线上近几天的热点数据,数据规模远小于主集群,大约是主集群文档数的十分之一。集群数据量小,在相同的集群部署规模下,备集群的性能要优于主集群。
然而在线上真实场景中,线上大部分查询流量也来源于热点数据,所以用备集群来承载这些热点数据的查询,而备集群也慢慢演变成一个热数据集群。之前的主集群存储的是全量数据,用该集群来支撑剩余较小部分的查询流量,这部分查询主要是需要搜索全量订单的特殊场景查询以及订单中心系统内部查询等,而主集群也慢慢演变成一个冷数据集群。
同时备集群增加一键降级到主集群的功能,两个集群地位同等重要,但都可以各自降级到另一个集群。双写策略也优化为:假设有AB集群,正常同步方式写主(A集群)异步方式写备(B集群)。A集群发生异常时,同步写B集群(主),异步写A集群(备)。
ES 订单数据的同步方案
MySQL数据同步到ES中,大致总结可以分为两种方案:
方案1:监听MySQL的Binlog,分析Binlog将数据同步到ES集群中。
方案2:直接通过ES API将数据写入到ES集群中。
考虑到订单系统ES服务的业务特殊性,对于订单数据的实时性较高,显然监听Binlog的方式相当于异步同步,有可能会产生较大的延时性。且方案1实质上跟方案2类似,但又引入了新的系统,维护成本也增高。所以订单中心ES采用了直接通过ES API写入订单数据的方式,该方式简洁灵活,能够很好的满足订单中心数据同步到ES的需求。
由于ES订单数据的同步采用的是在业务中写入的方式,当新建或更新文档发生异常时,如果重试势必会影响业务正常操作的响应时间。
所以每次业务操作只更新一次ES,如果发生错误或者异常,在数据库中插入一条补救任务,有Worker任务会实时地扫这些数据,以数据库订单数据为基准来再次更新ES数据。通过此种补偿机制,来保证ES数据与数据库订单数据的最终一致性。
遇到的一些坑
1、实时性要求高的查询走DB
推荐阅读:腾讯万亿级 Elasticsearch 技术解密
对于ES写入机制的有了解的同学可能会知道,新增的文档会被收集到Indexing Buffer,然后写入到文件系统缓存中,到了文件系统缓存中就可以像其他的文件一样被索引到。
然而默认情况文档从Indexing Buffer到文件系统缓存(即Refresh操作)是每秒分片自动刷新,所以这就是我们说ES是近实时搜索而非实时的原因:文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。
当前订单系统ES采用的是默认Refresh配置,故对于那些订单数据实时性比较高的业务,直接走数据库查询,保证数据的准确性。
2、避免深分页查询
ES集群的分页查询支持from和size参数,查询的时候,每个分片必须构造一个长度为from+size的优先队列,然后回传到网关节点,网关节点再对这些优先队列进行排序找到正确的size个文档。
假设在一个有6个主分片的索引中,from为10000,size为10,每个分片必须产生10010个结果,在网关节点中汇聚合并60060个结果,最终找到符合要求的10个文档。
由此可见,当from足够大的时候,就算不发生OOM,也会影响到CPU和带宽等,从而影响到整个集群的性能。所以应该避免深分页查询,尽量不去使用。
3、FieldData与Doc Values
FieldData
线上查询出现偶尔超时的情况,通过调试查询语句,定位到是跟排序有关系。排序在es1.x版本使用的是FieldData结构,FieldData占用的是JVM Heap内存,JVM内存是有限,对于FieldData Cache会设定一个阈值。
如果空间不足时,使用最久未使用(LRU)算法移除FieldData,同时加载新的FieldData Cache,加载的过程需要消耗系统资源,且耗时很大。所以导致这个查询的响应时间暴涨,甚至影响整个集群的性能。针对这种问题,解决方式是采用Doc Values。
Doc Values
Doc Values是一种列式的数据存储结构,跟FieldData很类似,但其存储位置是在Lucene文件中,即不会占用JVM Heap。随着ES版本的迭代,Doc Values比FieldData更加稳定,Doc Values在2.x起为默认设置。
总结
架构的快速迭代源于业务的快速发展,正是由于近几年到家业务的高速发展,订单中心的架构也不断优化升级。
而架构方案没有最好的,只有最合适的,相信再过几年,订单中心的架构又将是另一个面貌,但吞吐量更大,性能更好,稳定性更强,将是订单中心系统永远的追求。
最后
跟大家推荐个 Linux 命令行教程:《The Linux Command Line》,中文译名:《Linux 命令行大全》。
该书作者出自自美国一名开发者,兼知名 Linux 博客 LinuxCommand.org 创始人:William Shotts 之手。
在很早以前,该书便基于 CC 3.0 许可免费对外界开放阅读,发展到今天,已帮助无数开发者习得并掌握 Linux 命令行的使用技巧。
作者编著这本书的目的,主要是因为,通过命令行跟计算机进行交流沟通,是一种非常高效的方式,正像人类社会使用文字互通信息一样。懂得如何跟计算机好好相处,是每个程序员的必经之路。
“图形用户界面让简单的任务更容易完成, 而命令行界面使完成复杂的任务成为可能”,这句话到今天,仍然很正确。
该书将教授你如何与命令行友好相处。让你从本质上了解命令行是怎样工作的?能做什么?使用它的最好方法是什么?
《Linux 命令行大全》共分为五部分,37 个章节,每个章节会对应一个 Linux 知识点的讲解。
第一部分:命令行发展历史
第二部分:命令行的基本语言 Shell
第三部分:熟悉 Linux 的环境配置与文件处理
第四部分:命令行处理真实场景的任务
第五部分:学习 Shell 编程
此外,对于其它如 Unix、macOS 等操作系统,该书也会有所涉猎,但不会过于深入,毕竟其整体基调,还是主要围绕 Linux 展开叙述的。
如果你是一名 Linux 新手,那这个教程对你来说再合适不过了,你可以轻松从这本教程里面,学到关于 Linux 文件操作、权限配置、进程管理、归档备份、正则表达式、文本处理、Shell 脚本设计等一系列知识。
英文原版、中文版及PDF以为大家整理好 !
如何获取?
1. 识别并关注公众号「下面的二维码」;
2. 在下面公众号后台回复关键字「命令行」。
????长按上方二维码 2 秒
回复「命令行」即可获取资料
END
关注回复关键词回复“Java中台”获得大厂中台架构和微服务 大数据文章锦集合集
END
后台回复“电子书” “资料” 领取一份干货,数百技术电子书等你
开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。
历史推荐
腾讯万亿级 Elasticsearch 技术解密
微信13亿日活下,微信支付 Elasticsearch 调优实践
2020 ,6 种不死的编程语言!
Java 动态调试技术原理及实践
深入理解 Java 多线程核心技术
http://www.taodudu.cc/news/show-2106802.html
相关文章:
- 天池性能挑战赛-高性能分析型查询引擎复赛12名赛后方案分享
- Mysql数据库查询优化日常笔记
- 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能
- 查询系统css portal,详细论述 Portal 的样式单 --- Portal.css
- [es7]es查询实践示例
- springboot 分页查询参数_SpringBoot整合Mybatis关于分页查询的方法
- 工程实践线切割3B代码参考
- 计算机编程培训莱阳,莱阳数控编程培训班
- iOS5编程--官方例子代码的研究--2.UICatalog-6
- UG编程技巧
- CNC编程工程师如何炼成?要哪些必备技能?
- tp-801bs单板微型计算机,线切割应知应会
- hlws如何修改服务器密码,线切割hl控制系统输入法操作说明
- 编程基础知识之浮点型
- c语言简单系统实例,简单的c语言编程实例
- c语言怎么编程机器人,移动机器人(电子球)编程(c语言)
- 国二C语言用编译器做题,C语言编程实例100题——国二国三题库大全(必过).doc
- 脚本c语言编程实例,AVR C语言编程通用脚本.doc
- c语言助手,C语言代码实例助手
- c语言求阶乘和的流程图_C语言编程实例
- linux下c语言编程实例
- c语言编程数的平方,C语言编程实例:由两个平方三位数获得三个平方二位数
- C语言编程实例(一)
- 51单片机c语言编程20个实例,51单片机C语言编程,20个实例..pdf
- c语言编程界面优化输出图形,C语言编程实例—输出指定图形
- c语言编程分数化简,C语言编程实例:将真分数分解为埃及分数
- c语言立体爱心会跳动,c语言编程实例——小球跳动
- 电子表程序c语言,单片机c语言编程实例:电子表
- C语言编程实例——百钱买百鸡
- c语言 mongodb,MongoDB的C语言编程实例
京东把 Elasticsearch 到底用的有多牛?日均5亿订单查询完美解决!相关推荐
- es 根据_id查询_京东把 Elasticsearch 用得真牛逼!日均5亿订单查询完美解决
来源:京东技术(ID: jingdongjishu) 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订 ...
- 京东把 Elasticsearch 用的真牛逼!
来源:京东技术(ID: jingdongjishu) 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订 ...
- 日均5亿查询量的京东订单中心,为什么舍MySQL用ElasticSearch?
导读:京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订单数据存储在MySQL中,但显然只通过DB来支撑 ...
- 大白话告诉你Elasticsearch到底是干嘛的?
编程界的小学生 一.什么是搜索 二.检索方式 1.数据库 2.倒排索引 三.什么是Elasticsearch 四.Elasticsearch能干嘛 五.Elasticsearch使用场景 一.什么是搜 ...
- 5.6.50 mysql 用什么驱动_日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?
京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的 ...
- 京东到家订单订单查询服务演进
背景: 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况.京东到家的订单数据存储在Mysql中,但显然只通过DB来 ...
- 日均5亿查询量,京东到家订单中心的ES架构演进
点击上方蓝色"猿芯"关注我们,输入1024,你懂的 来源:https://blog.csdn.net/zhuguanghalo/article/details/86552394 京 ...
- 日均5亿查询量,京东到家订单中心ES架构演进
我们把订单数据存储在 MySQL 中,但显然只通过 DB 来支撑大量的查询是不可取的. 同时对于一些复杂的查询,MySQL 支持得不够友好,所以订单中心系统使用了 Elasticsearch 来承载订 ...
- 京东智联云:2019年云综合收入9.0亿元,波澜不惊
云排名分析: 京东智联云,2019年云综合收入 9.0亿元. 自京东云出现以来,似乎从来没有被京东财报所独立提到过. 京东财报显示,2019年,京东实现净收入5769亿元人民币,同比增长24.9%,2 ...
- 日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
<strong style="color: rgb(19, 139, 213); font-family: -apple-system-font, BlinkMacSystemFont ...
最新文章
- Visual Studio 2005 2008 2010样式
- oracle登录时无效的参数,oracle – 使用bash变量时出现Sqlplus登录错误:SP2-0306:无效选项...
- 碰到一个微软的bug:CWinAppEx::GetString
- 解决Failed to connect session for conifg 故障
- matlab使用tic 和 toc记录程序执行时间
- react循环的值为什么要有key_糊盒粘箱为什么要检查表面覆膜电晕值
- Three.js中的矩阵
- 计算机组成与体系结构——存储器分层体系结构
- WhereHows 数据发现和管理工具
- Struts2默认拦截器
- HTTP中的status code什么意思
- 看aps高级排产如何实现生产计划智能排产
- Unity3D热更设计:一款基于 HybridCLR的C#热更方案
- 群晖nas存储系统原理_今夜来谈群晖----缓存、NAS和SSD那些事
- 图形编辑器——Graph Editor(树图必备)
- 汽车标志国内品牌国际品牌列表
- pku 2251 Dungeon Master 基本BFS
- 马上着手开发 iOS 应用程序 (Start Developing iOS Apps Today)(中文)
- 计算机网口限制,局域网如何远程禁用电脑USB接口?如何限制U口使用?
- Vulkan Cascade Shadow Map的故事