日均5亿查询量的京东订单中心,为什么舍MySQL用ES?
阅读本文大概需要 8 分钟。
京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。
我们把订单数据存储在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集群中。
遇到的一些坑
总结
往期精彩回顾
图解 Java 垃圾回收机制,写得非常好!
什么是整洁的代码?什么是肮脏的代码?
16 个超级实用的 Java 工具类
后端开发都应该掌握的Redis基础
前后端分离模式下的权限设计方案
只要花 12 块钱,就能让女孩对你投怀送抱?
漫画:互联网公司面试图鉴,个个是人才!
朕已阅
日均5亿查询量的京东订单中心,为什么舍MySQL用ES?相关推荐
- 5.6.50 mysql 用什么驱动_日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?
京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的 ...
- 日均5亿查询量的京东订单中心,为什么舍MySQL用ElasticSearch?
导读:京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订单数据存储在MySQL中,但显然只通过DB来支撑 ...
- mysql 5亿数据 查询_日均5亿查询量的京东订单中心,为什么舍MySQL用ES?
来源:京东技术订阅号(ID:jingdongjishu) 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况.我们把 ...
- 日均 5 亿查询量的京东订单中心,为什么舍 MySQL 用 ES ?
京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况. 我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的 ...
- 日均5亿查询量,京东到家订单中心的ES架构演进
点击上方蓝色"猿芯"关注我们,输入1024,你懂的 来源:https://blog.csdn.net/zhuguanghalo/article/details/86552394 京 ...
- 日均5亿查询量,京东到家订单中心ES架构演进
我们把订单数据存储在 MySQL 中,但显然只通过 DB 来支撑大量的查询是不可取的. 同时对于一些复杂的查询,MySQL 支持得不够友好,所以订单中心系统使用了 Elasticsearch 来承载订 ...
- 日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
<strong style="color: rgb(19, 139, 213); font-family: -apple-system-font, BlinkMacSystemFont ...
- 日均7亿交易量,如何设计高可用的MySQL架构?
点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人 作者:林承军.51CTO技术栈整编 来自:微信公众号大数据技术标准推进委员会 将围绕如下 ...
- 仿京东或淘宝的订单中心页面
因为最近有用到类似京东订单中心的功能,遂决定写篇博客做个Demo,如有问题可留言探讨. 先上效果图: 评价和删除订单功能都做了简单的实现. 开发这个功能主要用到了安卓中的ExpandlistView. ...
最新文章
- CUDA,C++,Java,Python,Fortran运行速度比较
- 科大星云诗社动态20220113
- c语言 傲娇的十六进制,语言拟人向:来自Python、JAVA、C语言的“傲娇”自我介绍...
- 插件式架构设计实践一:插件式系统架构设计简介
- 经典的0.001秒,让程序回复正常的0.001秒。
- 按照长度递减的方式打印 字符串 BackSpace
- Android 音视频开发学习思路大纲
- ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台
- P9813驱动RGB灯珠
- 中标麒麟linux配置网卡,中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程...
- 【渝粤教育】广东开放大学 质量认证认可 形成性考核 (31)
- ceph-创建使用rule-ssd规则的存储池
- java学习笔记第三部分
- 《中国管理信息化》期刊简介及投稿要求
- B模式超声成像仿真(MATLAB k-Wave仿真)
- 火灾报警设计multisim仿真
- 【13】2016.12.13 周二--《小结2016》
- 华为云学院-人人学loT学习笔记及扩展- 第二章 物联网平台OceanConnect
- 为hexo添加hexo-admin组件
- 钉钉---氚云常规表格数据操作 -----记录贴
热门文章
- 软件行业和饭店惊人的相似
- python搞笑语句_云计算开发学习笔记:Python3 import语句
- PMI-ACP练习题(1)
- GD32F303固件库开发(14)----IIC之配置OLED
- 【字符串】生成每种字符都是奇数个的字符串
- 农村20年前割麦图曝光!那时的端午节后竟是这样过...
- 计算机二级证书怎么查真假,计算机二级证书怎么查真假?
- 稻盛和夫(日本世界著名实业家、哲学家)
- 20170702 正阳门下
- Windows10任务管理器中的内存用量的使用中(已压缩)、已提交、可用、分页缓冲池、非分页缓冲池是什么意思?