java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2670|回复: 0

《大规模分布式存储系统》第10章 数据库功能【10.5】

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2076

    主题

    3734

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66670

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-3-10 13:51:02 | 显示全部楼层 |阅读模式
    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+ {
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2025-3-11 19:19 , Processed in 0.150158 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表