java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2621|回复: 0

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

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

    [LV.Master]出神入化

    2040

    主题

    3698

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66476

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-1-22 14:59 , Processed in 0.145543 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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