|
10.5 特色功能
8 Y# I% n5 A. c8 s5 b7 d虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过8 ]6 W* v+ l& v$ a) Q' Y* w
程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很' }2 U; u7 X1 V. F; S
常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表
+ j/ D0 ?- E- |9 a) Q性的功能,分别为大表左连接以及数据过期与批量删除。
q! c5 [1 P3 b8 U" y4 K# B4 T. r) ?10.5.1 大表左连接
8 ~! ]$ x5 d6 n大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表& ?* b6 |0 h3 S6 i1 u1 E
格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收& ~+ D7 S$ P) N, ?8 Y0 g
藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信/ t i7 F1 v0 C1 _" `6 D: M
息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条0 V( Z+ @3 t0 C v
目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时- [# q9 R2 ^, @9 Z9 q7 o# W
间浏览收藏项,也可以对收藏项按照价格、人气排序。
6 B- a; J5 Q& Y, ~7 E/ I3 o7 x9 b% \自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中
' r: N; t: s, n存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然
, p) j& h$ x u) d; r而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个
8 @2 H* B1 ~# M: x: X用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,) b: f$ n, t J
如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能3 u% ?/ h6 I* q8 D: O
力也将受限。6 {) c. `' D6 p/ P! V1 e, R
另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信
4 e2 V5 b- h8 A8 x+ c' Q A息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收
/ _8 U2 J$ c! ?5 V1 H藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是1 V* z- k4 ^$ \1 x* P: ?" Y
不可接受的。
: u; R. Y% J/ a! C4 B& E+ F1 Y4 _" b这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右
0 {1 o3 o/ T$ _/ t' q, F5 l表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据% _4 N( m6 ~5 d4 g; g6 I W- x& V+ }
中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。7 F3 a, d X# t0 T# q$ P5 X4 e
商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如
# |5 l6 S' | N' t; x/ S0 G4 U" w: }下:, z7 u0 G. V/ k8 }* b m, ~: T
1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。4 f* I7 K H4 r, ~0 S g$ t
2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果0 S- z! ~6 S, z. `4 T+ ]; r+ j% K
中。
2 k! F' `: ^7 e* E+ ]% b" d3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到
) h8 |, V: ^6 @* F) ^4 K( I第2)步的结果中。6 w# Q' |& V6 F, ]3 J2 L `2 X& |# B
4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回
9 o8 a3 `$ m% a给客户端。
) x6 K) a: z/ A/ YOceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并; g( q& _9 H5 J$ Y
时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合+ a! ^, O* f0 j0 _( ?% q
到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和# b2 {* k) ]* ?( y4 l" e
collect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询- K1 }! C! y7 S8 A2 L
服务。
1 o' r0 Q, M# w8 m2 u; ]" l9 ]10.5.2 数据过期与批量删除! f% W7 {2 m9 @6 c) Z
很多业务只需要存储一段时间,比如三个月或者半年的数据,更早之前的数据
! z1 B. t$ T. y* a可以被丢弃或者转移到历史库从而节省存储成本。OceanBase支持数据自动过期功
8 W# k& s* \1 P能。
& q4 u7 t2 a" R3 D* [- ~OceanBase线上每个表格都包含创建时间(gmt_create)和修改时间
* m: T8 U& [( \5 J( m- [( M! T# `(gmt_modified)列。使用者可以设置自动过期规则,比如只保留创建时间或修改时* D3 h" p* P" @; a, I) S
间不晚于某个时间点的数据行,读取操作会根据规则过滤这些失效的数据行,每日
% V& e2 y$ i5 d2 E合并时这些数据行会被物理删除。
* k5 Y/ d2 M8 `0 ^6 Q+ \批量删除需求来源于OLAP业务。这些业务往往每天导入一批数据,由于业务逻4 i& ?. e0 u+ E9 H: z# U' k0 r7 z0 q
辑复杂,上游系统很可能出错,导致某一天导入的数据出现问题,需要将这部分出
7 e+ g5 v9 ?6 k错的数据删除掉。由于导入的数据量很大,一条一条删除其中的每行数据是不现实4 W; n* n3 C* }; _" v# h# ^
的。因此,OceanBase实现了批量删除功能,具体做法和数据自动过期功能类似,使; e6 y a) Y. h: d+ S" ]$ [
用者可以增加一个删除规则,比如删除创建时间在某个时间段的数据行,以后所有
, ~9 z. [, }2 Z8 S的读操作都会自动过滤这些出错的数据行,每日合并时这些出错的数据行会被物理
1 Q) p' e+ M! R( F$ ^$ e$ L删除。7 l# h4 Z, o5 `; x0 W; J
+ c! W2 x7 u# C7 p
8 T3 a4 l( p5 K: s* K; p+ ^" k8 b9 v
|
|