java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2673|回复: 0

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

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

    [LV.Master]出神入化

    2078

    主题

    3736

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66680

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

    发表于 2017-3-10 13:51:02 | 显示全部楼层 |阅读模式
    10.5 特色功能
      b% c  }$ l  ~# N* |' w/ Q9 \9 B虽然OceanBase是一个通用的分布式关系数据库,然而,在阿里巴巴集团落地过
    3 u0 a; q7 H: l: v) h6 ~4 C, d程中,为了满足业务的需求,也实现了一些特色功能。这些功能在互联网应用中很4 V) L- j$ v# J- ~% ~* L0 P4 u9 [
    常见,然而,传统的关系数据库往往实现得比较低效。本节介绍其中两个具有代表
    & }+ ~, I" ]7 k) [: @8 W性的功能,分别为大表左连接以及数据过期与批量删除。, j4 f3 N3 \. h- A, M
    10.5.1 大表左连接" o. K; B6 P9 x- I7 G! k  ^2 D8 T2 H
    大表左连接需求来源于淘宝收藏夹业务。简单来讲,收藏夹业务包含两张表
    " f6 g0 L; I1 j, {0 \1 r& `& W格:收藏表collect_info以及商品表collect_item,其中,collect_info表存储了用户的收
    2 x+ c2 y$ Y$ @/ `7 Y藏信息,比如收藏时间、标签等,collect_item存储了用户收藏的商品或者店铺的信: q( }+ i& Q. f8 w
    息,包括价格、人气等。collect_info的数据条目达到100亿条,collect_item的数据条1 J# @. \7 ]: X) g7 k8 P- C* y6 \
    目接近10亿条,每个用户平均收藏了50~100个商品或者店铺。用户可以按照收藏时
    3 N! ^( u# p9 j间浏览收藏项,也可以对收藏项按照价格、人气排序。! N/ ^2 m, y. @& {
    自然想到的做法是直接采用关系数据库多表连接操作实现,即根据collect_info中
    & w0 T; k# e$ S" o# L  Y! t存储的商品编号(item_id),实时地从商品表读取商品的价格、人气等信息。然6 F- z* i' C7 ~: L) r: `
    而,商品表数据量太大,需要分库分表后分布到多台数据库服务器,即使是同一个: V/ L7 U4 M7 O. o0 |/ c" A
    用户收藏的商品也会被打散到多台服务器。某些用户收藏了几千个商品或者店铺,, J, n$ c+ l& P+ I3 H7 P& f
    如果需要从很多台服务器读取几千条数据,整体延时是不可接受的,系统的并发能
    3 L3 A% ?2 V, c/ M力也将受限。$ g3 L" ~: K% s0 p0 }& W% z& A
    另外一种常见的做法是做冗余,即在collect_info表中冗余商品的价格、人气等信
    - ]" R% g* ?6 d. N4 ^7 _息,读取时就不需要读取collect_item表了。然而,热门商品可能被数十万个用户收
    ; L* s+ C: w0 Y* l4 h. {7 S/ y藏,每次价格、人气发生变化时都需要修改数十万个用户的收藏条目。显然,这是
    ( y' [2 M# P. S不可接受的。* ?3 d# h% L- C/ Y8 K; h- x' y
    这个问题本质上是一个大表左连接(Left Join)的问题,连接列为item_id,即右
    " N, `' f- d5 c( K5 O7 u表(商品表)的主键。对于这个问题,OceanBase的做法是在collect_info的基线数据
    / D7 O1 V8 c0 U& @6 L7 b$ Y中冗余collect_item信息,修改增量中将collect_info和collect_item两张表格分开存储。
    . ?1 Q1 D8 H* {9 s. ~" n4 R商品价格、人气变化信息只需要记录在UpdateServer的修改增量中,读取操作步骤如
    3 S( F- d6 C4 o下:9 n5 {( @- S/ z. @7 L, ^9 Q- Z
    1)从ChunkServer读取collect_info表格的基线数据(冗余了collect_item信息)。; u: B0 I$ H& f. P! h
    2)从UpdateServer读取collect_info表格的修改增量,并融合到第1)步的结果1 I) d3 ]- x, @5 E6 d( C) N
    中。2 r8 X7 l! W5 b1 A5 l) L
    3)从UpdateServer读取collect_item表格中每个收藏商品的修改增量,并融合到! f$ X" z! p# ^6 q; ?  X3 c5 `
    第2)步的结果中。
    5 s! k+ H% _. R$ {( S4)对第3)步生成的结果执行排序(按照人气、价格等),分页等操作并返回
    ; {/ a, u* B0 h8 V" R- @给客户端。6 E7 y- o$ m6 [0 t
    OceanBase的实现方式得益于每天业务低峰期进行的每日合并操作。每日合并1 ^: M0 s( }# F0 h! u$ G& E; F% X/ l
    时,ChunkServer会将UpdateServer上collect_info和collect_item表格中的修改增量融合
    , J1 M( c% h0 }7 Q8 A5 ?到collect_info表格的基线数据中,生成新的基线数据。因此,collect_info和# m2 H4 U* H6 p7 G$ s1 x
    collect_item的数据量不至于太大,从而能够存放到单台机器的内存中提供高效查询
    , p; G2 S% v1 X! j$ w/ g$ [/ ]服务。1 a: ], s* R3 n0 i+ |
    10.5.2 数据过期与批量删除8 b6 d( e/ H6 A' ~% n8 w
    很多业务只需要存储一段时间,比如三个月或者半年的数据,更早之前的数据
    6 n' E7 |$ E7 f可以被丢弃或者转移到历史库从而节省存储成本。OceanBase支持数据自动过期功* f2 W+ _3 I; v; v1 c
    能。* y. c  o% [/ {5 A( t" i. b# v
    OceanBase线上每个表格都包含创建时间(gmt_create)和修改时间
      X, J9 ]+ [! _: l& Z1 [, m, q(gmt_modified)列。使用者可以设置自动过期规则,比如只保留创建时间或修改时
    $ A( F2 t8 y8 [8 ]7 c! S- J" V间不晚于某个时间点的数据行,读取操作会根据规则过滤这些失效的数据行,每日- w. ?2 d$ S  ~/ X- y
    合并时这些数据行会被物理删除。
    6 `0 \& g6 c& g/ U4 i3 ^批量删除需求来源于OLAP业务。这些业务往往每天导入一批数据,由于业务逻
    " C9 k; h% Z6 N2 x辑复杂,上游系统很可能出错,导致某一天导入的数据出现问题,需要将这部分出6 `* s( L% [# j4 g, q8 m, Y* G
    错的数据删除掉。由于导入的数据量很大,一条一条删除其中的每行数据是不现实4 Z  k- T) @- |/ s: F' |
    的。因此,OceanBase实现了批量删除功能,具体做法和数据自动过期功能类似,使
    9 d+ o' o' @, m) Q" i7 J用者可以增加一个删除规则,比如删除创建时间在某个时间段的数据行,以后所有) g4 @; O7 o' k0 h
    的读操作都会自动过滤这些出错的数据行,每日合并时这些出错的数据行会被物理( ]$ {% H3 D/ k( j0 n( k
    删除。' d5 e) a8 v" T6 C
    : U! u: }8 x6 e' H0 Y% n4 }
    ' s  ^+ L$ U2 r0 c$ A
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-3-13 23:41 , Processed in 0.215776 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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