java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2401|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66153

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-16 19:13 , Processed in 0.093863 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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