java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2642|回复: 0

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

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

    [LV.Master]出神入化

    2062

    主题

    3720

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66592

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-23 12:35 , Processed in 0.117786 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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