日均5亿查询量的京东订单中心舍弃MySQL而选择Elasticsearch(ES),主要基于以下原因:
1. 应对读多写少的业务场景- 订单中心业务中,订单查询调用量极大,数据呈现明显的读多写少特征。MySQL作为关系型数据库,在高并发读场景下性能受限,而ES作为分布式搜索引擎,专为海量数据的高效检索设计,能够更好地支撑大规模查询压力。
- 示例:订单中心ES集群日均查询量达5亿,存储数据量超10亿文档,需通过ES的横向扩展能力满足需求。
2. 支持复杂查询需求- MySQL对复杂查询(如全文搜索、模糊匹配、多条件组合查询)的支持不够友好,而ES通过倒排索引、分布式计算等技术,能够快速响应复杂查询,提升用户体验。
- 示例:订单查询可能涉及商家名称、订单状态、时间范围等多维度组合条件,ES的灵活查询语法可高效处理此类需求。
3. 高可用性与稳定性保障4. 性能优化与资源隔离5. 应对业务时效性要求- 近实时搜索能力:ES默认每秒执行一次Refresh操作,文档变化在1秒内对搜索可见。对于实时性要求高的查询(如订单状态变更),仍需通过MySQL保障数据准确性,但ES可满足大部分近实时场景需求。
- 热点数据优化:备集群仅存储近几天的热点数据,文档量约为主集群的1/10,在相同部署规模下性能更优,可快速响应高频查询。
6. 版本升级与功能迭代- 主集群从ES 1.7升级至6.x版本,利用新版本性能优化和功能增强(如Doc Values替代FieldData)。Doc Values将排序数据存储在Lucene文件中,避免占用JVM Heap内存,解决线上查询超时问题。
7. 避免深分页查询陷阱- ES分页查询通过from和size参数实现,但深分页(如from=10000, size=10)会导致每个分片构造长优先队列,消耗大量CPU和带宽。订单中心通过优化查询逻辑避免此类问题。
总结京东订单中心选择ES替代MySQL,核心原因在于ES的分布式架构、高效检索能力、高可用性设计以及灵活的资源扩展方案,能够更好地满足海量订单数据的复杂查询需求。同时,通过双集群架构、热点数据优化和版本升级等手段,ES集群在稳定性、性能和实时性方面达到业务要求,支撑了日均5亿查询量的高并发场景。