|
10.5 特色功能
% S! o0 X% ?8 C% a' s虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过
1 Q8 u5 t2 w+ ]) }; i2 M程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很
$ `8 ^; f; o1 o Z/ W常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表7 t, j+ P! q# W( H( r9 x
性的功能,分别为大表左连接以及数据过期与批量删除。
6 w; R3 m8 Q: b. k2 l) P/ n10.5.1 大表左连接
: A7 L: H$ { u) \; E大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表0 j" t* R4 g+ I0 e
格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收2 j. H! |$ S" b1 Y5 `3 V2 O5 e
藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信0 h! g7 W' j" w' ^
息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条
% b6 t- r+ q3 B& o ]$ q目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时
( n" |% C" \( P+ g" _9 d3 A) x( E间浏览收藏项,也可以对收藏项按照价格、人气排序。
# _5 Q: K, `2 i9 y( C# w9 n# g自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中
% c# W+ b) h# n" q: e7 p0 t: d存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然2 v6 h4 W, c+ v
而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个* p Z; f: L* r, T2 ] _7 l& T6 {
用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,8 z# [8 l |% Y2 x* P$ S3 X) z" T
如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能6 K" G9 z+ h- F n' g
力也将受限。9 E! Q4 a- ]% H a$ B3 |
另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信; Y. w( W) t% B5 z& o; l
息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收5 o6 o" K) w( f1 w
藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是% B% F+ {; M$ \) g. F* @' p
不可接受的。
% m$ V1 Z# L; `5 C8 F; b这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右
( R, s: R- a0 y( S: m# m r表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据+ j1 M4 k4 g( ~0 A( A5 a
中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。; a( e1 a7 M; ^2 \ m
商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如
. }/ w9 Q, f6 L D3 Q) L2 Q3 g3 x1 l下:
+ i; e; U6 K5 |* o8 @0 l1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。* F9 f5 s5 C9 b7 Z1 r
2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果1 n1 ?7 @; A4 L8 u6 _% `( o" _% z
中。
* Z* m. l1 B }3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到
: i. ?: H+ I9 f第2)步的结果中。
' m0 m5 W9 G" M1 m [4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回
7 \ {8 B$ q5 c- l' C# p给客户端。
; Y" v" O3 Q# r& G- v5 K4 ^OceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并) ^4 H* T; X6 H0 }! o- V4 X
时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合% {% N; {2 w. i7 h
到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和
! \! S; r3 s* M# [! Gcollect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询" V# c4 S8 F9 j6 m1 B2 H
服务。, Q$ I3 _ |" T3 `3 [
10.5.2 数据过期与批量删除' @/ X; m; Z# U3 L* ?# u( {
很多业务只需要存储一段时间,比如三个月或者半年的数据,更早之前的数据# x x/ \, m- T0 l
可以被丢弃或者转移到历史库从而节省存储成本。OceanBase支持数据自动过期功) a9 m$ N: v D/ i3 ]
能。* N0 I- Y, X, Y/ l0 Z
OceanBase线上每个表格都包含创建时间(gmt_create)和修改时间( p: o) E. O5 g* s$ s/ a
(gmt_modified)列。使用者可以设置自动过期规则,比如只保留创建时间或修改时
! M6 ^! p% f. l* h间不晚于某个时间点的数据行,读取操作会根据规则过滤这些失效的数据行,每日/ o" e, I& O. A% U5 I# f
合并时这些数据行会被物理删除。6 x7 x: |% v% q6 V5 h6 F( X
批量删除需求来源于OLAP业务。这些业务往往每天导入一批数据,由于业务逻
2 G2 \/ o! O; s辑复杂,上游系统很可能出错,导致某一天导入的数据出现问题,需要将这部分出6 J! m0 m% p6 n
错的数据删除掉。由于导入的数据量很大,一条一条删除其中的每行数据是不现实: w4 H P$ u2 b% B% S) m# q6 j4 K5 }5 [9 s
的。因此,OceanBase实现了批量删除功能,具体做法和数据自动过期功能类似,使
1 i6 ?- x+ A R* Y4 {% A用者可以增加一个删除规则,比如删除创建时间在某个时间段的数据行,以后所有
' X$ l) ~& ]2 K% d# y4 I的读操作都会自动过滤这些出错的数据行,每日合并时这些出错的数据行会被物理
& h9 z2 ~& e6 p0 `, n# w删除。3 Z0 _: e: ]. C7 X
0 J* x2 Z4 c7 B" ^8 C* o
$ Z# O$ P0 ~7 w3 y* `* H
|
|