|
10.5 特色功能
, }( b7 H( s! z! l虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过) \0 G& a7 n' w5 \+ ?2 P) c" _
程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很
: O+ j" k/ L! K1 _. b常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表
. T. P" r6 E7 U' G- c" U1 g9 h性的功能,分别为大表左连接以及数据过期与批量删除。
5 c' I8 p* E: A" h9 X' W$ m3 f10.5.1 大表左连接
- Z ^% Z7 `$ M% B& Z' B# n; h大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表
( u+ n @$ D1 ]) a: l' p: B6 \格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收9 }, b( m) Z4 |5 z1 @& E+ N
藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信, i9 L& ^& f; r: W: j
息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条
3 Y8 B8 p \7 H目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时
) ]0 D) N" V m- o. P. ^* z间浏览收藏项,也可以对收藏项按照价格、人气排序。
3 P* q* B5 H% N a2 q8 B自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中. j/ f8 b9 j3 m M2 d+ U- B, P
存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然1 ?8 S! a/ _6 m# H& M9 t
而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个' {0 \/ S1 Z; r' z' b
用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,/ i9 H2 ?! U* D: R
如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能
, `) M( t& {. b( v$ }力也将受限。# ^- o- W- I5 M
另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信
5 |5 q9 f+ r: r( f, \1 G9 |. c( A息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收( B D$ j$ O2 t% Y3 P" W2 ^5 {
藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是, J/ R* X, ], x4 x
不可接受的。
# M1 c. L7 p" n u$ e& p8 N B7 W这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右( [3 t4 A2 ]# @4 t
表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据+ p5 g& _7 a7 q" N. p8 z( l
中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。
. ^7 N: L5 a, W; i8 a" K商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如3 p( l$ y- b6 I3 S D4 z, B: d [
下:9 T* p9 S3 Q5 j- R) L9 W
1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。
& ^- ?+ O1 b( }2 x2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果
, T. O! t5 N0 Q! \2 i中。 ]5 X6 N/ g) e f
3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到
3 t7 w) h, f2 O9 f2 a0 W第2)步的结果中。
- l) I7 v7 u8 G9 F& }" T ~0 J \4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回9 F7 E/ K: L5 d' H8 ?2 S: b! a4 U
给客户端。( }7 @+ A5 N" [( Q5 @+ M8 g
OceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并
4 T% S4 c. @( @1 f4 K1 \1 D$ |0 d时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合
9 t' H. {1 n& q7 R- C7 r3 R到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和
$ P' J$ H5 S+ ]) {0 }/ Mcollect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询4 x J8 A" K% @! C
服务。- V; X' `1 A% Y# O( ]( p* Z
10.5.2 数据过期与批量删除
) }6 f5 e! [& |很多业务只需要存储一段时间,比如三个月或者半年的数据,更早之前的数据; |5 x$ e( G. q/ Z- d, y E" t
可以被丢弃或者转移到历史库从而节省存储成本。OceanBase支持数据自动过期功
! X) s% @( Y3 {( b能。
+ o9 B# |+ Z* \1 M, z, oOceanBase线上每个表格都包含创建时间(gmt_create)和修改时间
7 y& J* l" h# a) [, T+ i5 U(gmt_modified)列。使用者可以设置自动过期规则,比如只保留创建时间或修改时/ j4 {, x3 l2 c. X% C
间不晚于某个时间点的数据行,读取操作会根据规则过滤这些失效的数据行,每日
0 Q- ^# S7 l* m- k% V+ ~合并时这些数据行会被物理删除。* E3 x5 V$ D1 B& r; y9 @
批量删除需求来源于OLAP业务。这些业务往往每天导入一批数据,由于业务逻
6 O8 }! g" X! H& [( d! K N6 Y辑复杂,上游系统很可能出错,导致某一天导入的数据出现问题,需要将这部分出
' S, u" r% M- N4 u5 L错的数据删除掉。由于导入的数据量很大,一条一条删除其中的每行数据是不现实
& ~! v) b) Q# _) C2 T; H的。因此,OceanBase实现了批量删除功能,具体做法和数据自动过期功能类似,使
7 l4 h: A; Z% r, s+ S用者可以增加一个删除规则,比如删除创建时间在某个时间段的数据行,以后所有
; x o) s* n' }. Z的读操作都会自动过滤这些出错的数据行,每日合并时这些出错的数据行会被物理6 K+ h A& n# ^. r1 m+ Q
删除。
& ~9 ?. Z: Q- n1 O; y
; o( x# T$ k1 \' u* X: H. V) @6 m5 r, W+ D( O
|
|