|
10.5 特色功能
( Q8 A( @4 [, y6 P虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过
Z: A ^+ L; W' J- X" V程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很
7 q8 D9 t3 o- R, P# i常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表7 g" b' I" b; B: X, x- Q/ l
性的功能,分别为大表左连接以及数据过期与批量删除。# C" i; J P/ u/ y! H
10.5.1 大表左连接
+ ~6 ^( M1 ~" k8 p: {大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表: M& L& D7 E6 N6 h, W
格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收- _: ^2 e, ]: k$ R& A+ Z
藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信( s, \* }" F0 X8 ~
息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条
. I7 v/ y5 V" p; J/ H4 @' {$ P目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时
7 i" t, M: h: L1 _; T4 @间浏览收藏项,也可以对收藏项按照价格、人气排序。
( u% `' ?# ^1 M1 M& |) y+ J2 z自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中# j" i& m& E ]3 ]: d4 Q" \* j( G
存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然5 j) W2 w4 }) L* `& ^/ A
而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个! K4 s8 a, [' Y5 K: O3 t: Z$ G7 `
用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,
; ^+ Q9 V L6 {) Q }0 U( n如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能
# k8 G2 B! p: O6 G2 E' g# K- H力也将受限。
% K' N2 T+ ~' K n9 p9 Y# t另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信5 R! I! r; s$ E2 [/ D! ^! ^% i9 ?
息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收: D& C: q$ J' x+ y: |
藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是
$ Q y' c6 k k不可接受的。
" P' `+ q8 m. ?! g这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右6 X9 {' u& V+ A3 X& S3 e
表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据
+ ^$ w( e2 w- y, |, a中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。/ U# X |/ N- U+ @) F1 H A: T
商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如
) C/ \6 P+ i# G下:
; d3 V- }1 k) N7 G$ ~/ [1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。& O' x5 ?3 u- @$ T
2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果
8 @$ F! n! a2 Q4 o中。
) A3 t9 t/ Y: f' R! B# {$ j3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到
2 B4 _+ e0 h& V: d0 ^% K; u2 I第2)步的结果中。
/ G, i, u7 l/ ?4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回6 R& l4 k; J4 W" a
给客户端。
8 S; g& I# B" L; {; i4 G: }* \+ gOceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并; n/ V5 ^7 C4 x, _9 K
时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合
% V) |- c2 j; N2 s7 e# a到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和
8 G* K9 g2 Q9 {+ x! h3 g- Fcollect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询) o. w2 |! A/ M/ P! V/ Z7 g* V& E. v
服务。
$ Z! Z+ g5 o3 L x( [" `10.5.2 数据过期与批量删除; @% |7 D# {3 L
很多业务只需要存储一段时间,比如三个月或者半年的数据,更早之前的数据
$ u. }0 w1 b N* U! B8 O可以被丢弃或者转移到历史库从而节省存储成本。OceanBase支持数据自动过期功0 O' f' ^# u+ s
能。. G& S4 Z7 w4 r& n
OceanBase线上每个表格都包含创建时间(gmt_create)和修改时间
: v; U$ E+ v$ r+ ` G(gmt_modified)列。使用者可以设置自动过期规则,比如只保留创建时间或修改时 q2 b( T- N. ]
间不晚于某个时间点的数据行,读取操作会根据规则过滤这些失效的数据行,每日) \( Q$ J) Q/ Q4 P i, c
合并时这些数据行会被物理删除。 I* H) O' H% ?. W1 d
批量删除需求来源于OLAP业务。这些业务往往每天导入一批数据,由于业务逻$ C7 \0 P0 `' H6 T5 K Z
辑复杂,上游系统很可能出错,导致某一天导入的数据出现问题,需要将这部分出& ?$ u8 H( T- P/ ]( |$ Y8 D; f
错的数据删除掉。由于导入的数据量很大,一条一条删除其中的每行数据是不现实1 }" _( d, z: i
的。因此,OceanBase实现了批量删除功能,具体做法和数据自动过期功能类似,使
/ Q# u4 ~7 s3 T8 N! [8 S+ V用者可以增加一个删除规则,比如删除创建时间在某个时间段的数据行,以后所有
7 ^; x/ x+ F0 b: a, [+ R的读操作都会自动过滤这些出错的数据行,每日合并时这些出错的数据行会被物理# w- ?0 G) @! j$ B
删除。( y2 b& h6 Z0 y
- m1 T1 y ^* B T9 q
8 ?7 `5 _$ U7 Z# d+ {
|
|