01淘宝交易订单系统介绍
天猫和淘宝之间的实物和虚拟商品日交易额达到亿级。考虑到一次成功交易的整个环节,会涉及会员信息验证、商品库信息查询、订单创建、库存抵扣、折扣抵扣、订单支付、物流信息更新、确认支付等等。
链接中的每个链接都涉及数据库中记录的创建和状态的更新。一个成功的交易可能对应后台信息系统的数百个数据库交易,支撑交易系统的整个数据库集群每天将承担数百亿次交易。这不仅给数据库系统带来了巨大的性能挑战,而且由于每天不断增加的海量数据,也带来了巨大的存储成本压力。
订单作为最关键的信息,需要用户随时查询,必须永久记录在数据库中,因为可能涉及处理交易纠纷。淘宝成立近17年,所有与订单相关的数据库记录总量已经达到万亿级别,淘宝占用的磁盘空早已超过PB级别。
在如此庞大的数据集上,满足用户随时查询的低延迟要求,实现极低的存储成本,在技术上是一个巨大的挑战。
用户的历史订单记录数据庞大,不能丢失。
02淘宝交易订单库架构沿革历史
淘宝从2003年成立至今,将近17年。随着交易量的增加,交易订单数据库的结构也经历了几次演变。
第一阶段,由于流量较小,使用一组Oracle数据存储所有订单信息,新订单创建和历史订单查询都在同一个数据库中进行。
第二阶段,由于历史订单的数据量越来越大,单套数据库已经不能满足性能和容量两方面的要求,于是对交易订单数据库进行拆分,单独建立一个Oracle历史数据库,将三个月前的订单迁移到历史数据库中。同时由于数据量巨大,查询性能无法满足需求,所以当时的历史订单并没有提供查询功能。用户只能查询三个月内的订单信息。
第三阶段,为了解决可扩展性和存储成本问题,将交易历史数据库整体迁移到HBase方案,很好地解决了当时存储成本和业务查询需求两个需求。总体方案是使用主表结合索引表,通过主表查询订单的详细信息,通过买家或卖家的ID查询订单,需要先通过索引表获取订单号。
但是这个方案遗留了一个问题:订单没有严格按照90天进行迁移,很多类型的订单没有迁移到历史数据库中,导致有序列表失序,有序列表没有严格按照时间从近到远进行排序。如果用户按照订单列表一页一页往下翻,会发现自己最近的订单“突然丢了”(其实不是丢了,只是顺序不对,然后就是。
第四阶段,历史数据库采用基于X-Engine引擎的PolarDB-X集群,可以为同事提供和在线数据库一样的索引能力,解决无序问题。
03淘宝交易订单库业务痛点
回顾淘宝交易数据库的演进历史,在拆分出独立的交易历史数据库后,十年来,业务团队和数据库团队一直在应对几个核心挑战:
2018年,由于数据库存储导致订单排序混乱,接到的投诉越来越多,给用户带来了极大的困扰,商家决定根除这一问题。从前面的分析总结来看,理想的交易历史数据库方案需要同时满足三个条件:低成本、低延迟、功能丰富。像在线库那样使用InnoDB引擎无法满足存储成本的要求,而使用HBase则无法满足二级索引一致的要求。
基于X-Engine引擎的04历史库方案
2018年,阿里研发的X-Engine引擎逐渐在集团落地。它根据阿里巴巴交易业务的流水线化特点设计了冷热分离的独创架构。X-Engine引擎中的冷数据记录紧密排列在数据页中,默认情况下所有数据块都被压缩。这种架构兼顾了性能和成本,很快在很多内部业务落地,比如X-Engine。
在考察交易历史数据库的方案时,一个思路是将在线数据库和历史数据库结合起来,依靠X-Engine自身的冷热分离能力,实现90天内交易订单的高性能访问和90天前交易订单记录的低成本存储。在的同时,一套统一的交易订单数据库可以提供二级索引等功能,用户订单无法按时间排序的问题将得到解决,业务层面的代码将非常简单。
但是交易订单系统在联机/历史数据库分离的框架下迭代了十年,很多业务系统的代码都兼容这个框架。考虑到业务代码转换和迁移的风险,我们在初始阶段继承了以前的在线和历史分离的框架。只有原来的HBase集群被PolarDB-X集群(基于X-Engine引擎的版本)所取代:
实施该架构后,交易历史数据库的存储成本与使用HBase相比并没有增加。同时,由于历史数据库和在线数据库具有相同的能力,可以创建完全相同的索引,历史订单恢复了按时间排序的支持,其读取延迟也得到了保证。
05数据库模式参考
在淘宝交易历史数据库的方案中,考虑到业务层面历史代码架构的连续性,采用了InnoDB引擎在线数据库与X-Engine历史数据库分离的方案。在这个架构中,X-Engine历史库实际上既承担了从在线库迁移过来的写入,也承担了90天前记录的读写流量。
实际上,考虑到淘宝交易订单记录的流水线访问特性(最近写入的记录会被大量访问,访问频率会随着时间的推移而急剧下降),X-Engine引擎内部的冷热分离机制可以很好的处理这种流水线业务,因此单个X-Engine数据库集群完全可以满足需求。
对于新开业务或现有业务有大量流水线式记录存储需求,且业务层面尚未冷热分离的,我们建议直接使用一套X-Engine引擎,在降低存储成本的同时,使DB层的访问代码更加简单。基于X-Engine引擎的PolarDB-X分布式数据库可以同时解决向外扩展问题和成本问题。
目前X-Engine引擎已经在阿里云上线。经过阿里内部业务验证,欢迎有性价比需求的用户购买使用。详情点击“阅读原文”