日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?

京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。

我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的查询是不可取的。同时对于一些复杂的查询,MySQL支持得不够友好,所以订单中心系统使用了Elasticsearch来承载订单查询的主要压力。

日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?

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节点部署在单独一台物理机上方式。

但紧接

京东数据库设计 Revised on November 25, 2020 Revised on November 25, 2020 京东数据库设计全文共118页,当前为第1页。京东数据库设计 京东数据库设计全文共118页,当前为第1页。 Table of Contents 京东数据库设计全文共118页,当前为第2页。The 'Table of Contents' field needs to be updated! 京东数据库设计全文共118页,当前为第2页。 京东数据库设计全文共118页,当前为第3页。表的清单 京东数据库设计全文共118页,当前为第3页。 名称 注释 account_info中信账户管理 中信账户管理 activity_record活动记录信息 活动记录信息 activity_statements 活动结算表 活动结算表 bace_type bank_settle_detail 第三方支付结算excel表 第三方支付结算excel表 base_consulting_sms咨询表 咨询表 base_dictionary 物流信息表 物流信息表 base_jms_listener消息记录表 消息记录表 base_msg_record基础信息记录 基础信息记录 base_send_message TDK设置表 TDK设置表 base_sms_config基础邮件配置 基础邮件配置 base_tdk_config基础信息TDK设置 基础信息TDK设置 base_user_favorite用户收藏 base_website_message基础网站消息 基础网站消息 central_purchasing_activites_details集采详情表 集采详情表 central_purchasing_activites集采活动表 集采活动表 central_purchasing_enterprise参与集采单位信息表 参与集采单位信息表 central_purchasing_ref_enterprise集采商品与集采单位关联表 集采商品与集采单位关联表 central_purchasing_ref_order集采订单关联表 集采订单关联表 citic_pay_journal 中信支付记录数据交互表 中信支付记录数据交互表 company_pay_job 存放企业用户自动支付的记录表 存放企业用户自动支付的记录表 complain 仲裁信息表 仲裁信息表 contract_info 协议表 协议表 contract_mat 协议明细表 协议明细表 contract_order 协议订单表 协议订单表 contract_payment_term 协议付款合同表 协议付款合同表 contract_url_show 协议附件地址表 协议附件地址表 coupon_info优惠券主表 优惠券主表 coupon_user优惠券与用户的关联表 优惠券和所领此优惠券的用户的关联表 coupon_using_range优惠券使用范围表 优惠券使用范围表 date_dic 静态日期表 静态日期表(广告统计使用) delivery 快递信息表 快递信息表 delivery_addressbase交货地址 delivery_express_company交付快递公司 delivery_fee_info交付费用信息 delivery_info交付信息 delivery_status订单配送状态表 订单配送状态表 原注释:发货状态表(扫描状态用) delivery_useful_address_info用户地址信息 factorage_journal 第三方支付的手续费记录表 第三方支付的手续费记录表 field_certification_attachment认证附件 field_certification认证信息 field_identification_audi实地认证审核表 实地认证审核表 field_identification_picture实地认证图片表 实地认证图片表 finance_account_info 金融帐号配置表 金融帐号配置表 finance_withdraw_apply提现申请 finance_withdraw_record提现记录 inquiry_info 询价表 询价表 inquiry_mat 询价明细表 询价明细表 inquiry_order 询价订单表 询价订单表 integral_config 积分配置表 积分配置表 invoice 发票表 发票表 invoice_pic 发票对应图片表 发票对应图片表 item_attr_value_item(属性属性值和商品关系表) 属性属性值和商品关系表 item_a
<think>嗯,用户问的是MySQL能支撑OA系统的庞大数据。首先,我需要了解OA系统的典型数据和访问模式。OA系统通常包括流程审批、文档管理、通讯录、日程安排等功能,数据可能因公司规模而异。中小型企业的数据可能大,但大型企业可能有百万级甚至更多的数据。 接下来,得考虑MySQL的处理能力。MySQL在处理结构化数据方面表现错,支持事务和复杂查询。InnoDB引擎提供了ACID事务支持,适合需要高一致性的OA系统。分区表、读写分离、主从复制这些功能可以帮助提升性能和数据可靠性。 然后,数据庞大的定义是什么?如果用户指的是单表数据过亿,可能需要分库分表,或者使用中间件如MyCat。过大多数OA系统可能会达到这个级别,单表千万级的话,通过索引优化和硬件升级,MySQL还是可以应对的。 还要考虑高并发情况。OA系统的并发通常会像电商那么高,但如果有大用户同时操作,可能需要缓存机制如Redis,或者数据库集群来分担压力。MySQL的读写分离和连接池配置也能帮助缓解并发压力。 另外,存储引擎的选择也很重要。InnoDB适合写操作多的场景,而MyISAM在读多写少的情况下可能更快,但OA系统通常需要事务支持,所以InnoDB更合适。 横向扩展方面,MySQL的集群方案如Group Replication或InnoDB Cluster可以提供高可用性。如果数据真的非常大,可能需要考虑分片技术,或者结合云数据库的弹性扩展能力。 还需要提醒用户实际应用中的优化措施,比如定期维护表、优化查询语句、使用查询日志分析性能瓶颈。硬件资源如SSD、足够的内存和CPU也是关键因素。 最后,总结一下,MySQL在大多数情况下能够支撑OA系统的数据需求,但具体要看数据规模和访问模式。如果数据特别大,可能需要结合其他技术或升级架构。应该建议用户评估自身的数据和访问,合理设计数据库结构,并采取适当的优化措施。</think>MySQL完全有能力支撑OA系统的数据需求,但需要结合具体场景进行合理设计。以下是分步骤分析: 1. **数据承载能力评估** - 单表容:InnoDB引擎理论上支持64TB数据(MySQL 8.0),实际场景中单表建议控制在千万级(<5000万行) - 典型OA数据示例: $$ \begin{cases} 用户表 & \approx 10^4 \sim 10^5 \text{行} \\ 审批流程表 & \approx 10^6 \sim 10^7 \text{行/年} \\ 文件索引表 & \approx 10^5 \sim 10^6 \text{行} \\ \end{cases} $$ 2. **关键支撑技术** - 事务支持:通过InnoDB引擎实现ACID特性,保障审批流程等核心业务数据一致性 - 读写分离:使用主从复制架构,主库处理写操作,多个从库处理读请求 ```sql SHOW REPLICA STATUS\G -- 查看复制状态 ``` - 分区表:对历史数据按时间分区,提升查询效率 ```sql CREATE TABLE workflow_log ( id INT, create_time DATETIME ) PARTITION BY RANGE (YEAR(create_time)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024) ); ``` 3. **性能优化方案** - 索引策略:组合索引需遵循最左匹配原则 $$ \text{查询} \ WHERE\ a=1\ AND\ b>5 \Rightarrow \text{索引应设计为}(a,b) $$ - 连接池配置:建议使用连接池管理工具(如HikariCP) ```ini # 建议配置参数 minimumIdle=10 maximumPoolSize=100 connectionTimeout=30000 ``` 4. **扩展方案对比** | 方案类型 | 适用场景 | 实现方式示例 | |----------------|-------------------------|----------------------| | 垂直扩展 | 单机性能瓶颈 | 升级CPU/内存/SSD | | 水平扩展 | 数据超过单机存储极限 | 使用Vitess分片 | | 混合扩展 | 高并发+大数据 | 读写分离+缓存+分片 | 5. **实际部署建议** - 硬件配置基准(500人规模): $$ \text{内存} \geq 32GB,\ \text{CPU核心} \geq 8,\ \text{SSD存储} \geq 1TB $$ - 监控指标预警值: $$ \begin{cases} QPS > 2000 \\ 连接数使用率 > 80\% \\ 磁盘IO延迟 > 20ms \\ \end{cases} $$ **结论**:MySQL可支撑日均百万级操作的OA系统。对于超大规模企业(如10万+用户),建议: 1. 采用Galera Cluster实现多活架构 2. 使用ProxySQL实现智能路由 3. 历史数据归档策略:$$ \frac{\text{在线数据}}{\text{归档数据}} \leq 1:5 $$ 4. 结合Elasticsearch优化全文检索功能 最后建议通过`EXPLAIN`分析慢查询,定期执行`OPTIMIZE TABLE`维护数据碎片,可保证系统长期稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值