10.5 特色功能

虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表性的功能,分别为大表左连接以及数据过期与批量删除。

10.5.1 大表左连接" class="reference-link">10.5.1 大表左连接

大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时间浏览收藏项,也可以对收藏项按照价格、人气排序。

自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能力也将受限。

另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是不可接受的。

这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如下:

1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。

2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果中。

3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到第2)步的结果中。

4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回给客户端。

OceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和collect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询服务。