java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2567|回复: 0

《大规模分布式存储系统》第8章OceanBase架构初探【8.4】

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66345

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

    发表于 2017-3-5 00:38:20 | 显示全部楼层 |阅读模式
    8.4 架构剖析# t& m2 q+ `6 \" W! |( g
    8.4.1 一致性选择
    8 g6 b9 N! s7 wEric Brewer教授的CAP理论指出,在满足分区可容忍性的前提下,一致性和可& L- z5 }1 t4 c0 E2 l  m/ D
    用性不可兼得。2 o/ H5 G2 L; n" k0 Y3 m
    虽然目前大量的互联网项目选择了弱一致性,但我们认为这是底层存储系统,1 B! M. o  A3 ~* ]1 m$ S/ x( o
    比如MySQL数据库,在大数据量和高并发需求压力之下的无奈选择。弱一致性给应7 Y7 L7 m8 J3 N2 l5 B
    用带来了很多麻烦,比如数据不一致时需要人工订正数据。如果存储系统既能够满1 l' N1 j3 S2 G; F3 }4 l
    足大数据量和高并发的需求,又能够提供强一致性,且硬件成本相差不大,用户将
    " U  n; i5 }& {* |) B: T8 M/ W9 Q毫不犹豫地选择它。强一致性将大大简化数据库的管理,应用程序也会因此而简- a; Q9 M/ ]8 u; T! Q( W2 M, ~& s
    化。因此,OceanBase选择支持强一致性和跨行跨表事务。
    9 }2 g0 l1 v/ S2 c  dOceanBase UpdateServer为主备高可用架构,修改操作流程如下:3 z2 K$ k2 {; D% P$ g. w, V
    1)将修改操作的操作日志(redo日志)发送到备机;
    8 E( I$ a0 g- U4 W, G" M2)将修改操作的操作日志写入主机硬盘;
    ! j- v" |/ e% _3 N( `8 |3)将操作日志应用到主机的内存表中;
    3 ~: S; |+ }1 s" ]4)返回客户端写入成功。
    . i  ?- l3 y! t- |5 LOceanBase要求将操作日志同步到主备的情况下才能够返回客户端写入成功,即
    3 t1 C, V3 s" \3 e使主机出现故障,备机自动切换为主机,也能够保证新的主机拥有以前所有的修改& {$ O7 J1 E3 J% K( b
    操作,严格保证数据不丢失。另外,为了提高可用性,OceanBase还增加了一种机/ f. M' [2 w9 Z  `5 ]3 d
    制,如果主机往备机同步操作日志失败,比如备机故障或者主备之间网络故障,主+ p/ V& [1 F7 |5 S- ]* L
    机可以将备机从同步列表中剔除,本地更新成功后就返回客户端写入成功。主机将/ D/ [. S0 n9 W4 ?
    备机剔除前需要通知RootServer,后续如果主机故障,RootServer能够避免将不同步2 W3 X& u) f1 `. @7 c
    的备机切换为主机。
    ( |$ }9 |/ C: n. P0 S/ `0 r9 HOceanBase的高可用机制保证主机、备机以及主备之间网络三者之中的任何一个
    , {6 _/ ?# ^7 X5 u" j) [  g& m7 [$ y出现故障都不会对用户产生影响,然而,如果三者之中的两个同时出现故障,系统
    2 Q: J, ^; S% E( [可用性将受到影响,但仍然保证数据不丢失。如果应用对可用性要求特别高,可以
    ; j) ^2 b# z! b" S; H, G0 L5 U! k增加备机数量,从而容忍多台机器同时出现故障的情况。& L7 m) a/ k# r, `, m' V' n. m. ~% j
    OceanBase主备同步也允许配置为异步模式,支持最终一致性。这种模式一般用
    & [3 [5 M/ i4 [4 a$ e来支持异地容灾。例如,用户请求通过杭州主站的机房提供服务,主站的
    4 _; `/ S' K" q% \. R1 DUpdateServer内部有一个同步线程不停地将用户更新操作发送到青岛机房。如果杭州2 A+ w* M4 @- {7 v$ a% P: J" i5 F! B
    机房整体出现不可恢复的故障,比如地震,还能够通过青岛机房恢复数据并继续提) s6 h# G  E) V& |* A
    供服务。% @8 ~9 T0 o8 i9 [8 V" E) s$ o/ X
    另外,OceanBase所有写事务最终都落到UpdateServer,而UpdateServer逻辑上是
    ) `) d% f2 z! r, B7 S一个单点,支持跨行跨表事务,实现上借鉴了传统关系数据库的做法。
    2 b2 T: |' h' J* I( K0 {8.4.2 数据结构0 T+ K  m: U3 U- Q5 [5 S( e* Z
    OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台) C$ u4 N; E3 o
    ChunkServer上,增量数据全部存放在一台UpdateServer上。如图8-5所示,系统中有5
    " R- S% u9 L& s4 k0 Q4 L个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer上。RootServer中维* ]& V9 r  T! |, m0 `6 M- ?
    护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量! N0 w2 n4 g& L% `. O5 r8 l& f) r
    更新。
      F8 A: A1 b: O9 `' E2 m" ]图 8-5 OceanBase数据结构
    5 z& l3 n& x0 M+ M不考虑数据复制,基线数据的数据结构如下:6 \- {$ Y" ^" S2 j( k, r5 I" Z$ Q
    ●每个表格按照主键组成一颗分布式B+树,主键由若干列组成;+ z) }4 D. l- e4 g  A
    ●每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;
    : o, {/ t+ F; e% M& J! x% A●每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;4 X, V, V& e( m: N: }. k* d
    ●每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block& i6 J) |3 t5 y* Y* a; m9 w# k
    index);4 J/ I$ s& x. c+ A' n# {: Y
    ●每个块的大小通常在4~64KB之间并内建块内的行索引;
    $ ^1 E0 [% }+ k6 |( E4 ^●数据压缩以块为单位,压缩算法由用户指定并可随时变更;
    + I( P1 O, }3 Z1 f●叶子节点可能合并或者分裂;
    9 Q' b2 N) b' h9 M. L( j5 y2 N' Q7 G●所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;  N4 B! y$ \6 T5 y
    ●通常情况下每个叶子节点有2~3个副本;
    1 f4 a1 l: M" i. F●叶子节点是负载平衡和任务调度的基本单元;- x4 g9 S& M8 V, e
    ●支持布隆过滤器的过滤。- e8 O7 O1 i! n6 k6 d# d' v
    增量数据的数据结构如下:* C( z) w8 \# c' Q5 j3 @2 d
    ●增量数据按照时间从旧到新划分为多个版本;5 w) L* q- s' l5 `! x% r: c
    ●最新版本的数据为一颗内存中的B+树,称为活跃MemTable;
    # n" y* c4 Y  R  @3 b+ A& h●用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable
    - i2 |: r8 a  @  v将被冻结,并开启新的活跃MemTable接受修改操作;: ]* b' `$ Q6 \/ I, E* x3 T
    ●冻结的MemTable将以SSTable的形式转储到SSD中持久化;
    / Z8 i/ Y& W  s●每个SSTable内部按主键范围有序划分为多个块并内建块索引,每个块的大小: W" A+ d& E2 ?
    通常为4~8KB并内建块内行索引,一般不压缩;
    3 p0 w6 i9 A: a! z* P●UpdateServer支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。' v3 \1 |& z# m' j' T3 ?
    8.4.3 可靠性与可用性' [. G5 ]# \- r, K  \# w0 u) W
    分布式系统需要处理各种故障,例如,软件故障、服务器故障、网络故障、数
    0 L4 p: k+ I+ ]/ o3 Y8 _& Q! P据中心故障、地震、火灾等。与其他分布式存储系统一样,OceanBase通过冗余的方
    # a; R5 Y7 K( |6 J, b$ Y式保障了高可靠性和高可用性。方法如下所示:
    * s) L8 W. E8 o7 M$ Y/ l3 \●OceanBase在ChunkServer中保存了基线数据的多个副本。单集群部署时一般会) X3 Q5 u: Q, A' R% I
    配置3个副本;主备集群部署时一般会配置每个集群2个副本,总共4个副本。) m* u3 |% z4 v; F/ r, W
    ●OceanBase在UpdateServer中保存了增量数据的多个副本。UpdateServer主备模
    + a7 a0 F/ Y0 I4 N5 S5 ^式下主备两台机器各保存一个副本,另外,每台机器都通过软件的方式实现了' c  [; U& k7 A9 p( O3 }% J
    RAID1,将数据自动复制到多块磁盘,进一步增强了可靠性。
    5 T+ _+ t5 b0 s●ChunkServer的多个副本可以同时提供服务。Bigtable以及HBase这样的系统服务* [1 n' _7 H% z8 ?, u4 u; f
    节点不冗余,如果服务器出现故障,需要等待其他节点恢复成功才能提供服务,而
    , Y+ N  }& i5 N  [) k  m. rOceanBase多个ChunkServer的子表副本数据完全一致,可以同时提供服务。: @: b' c3 Z; r* b/ o7 t, z7 G: [4 F
    ●UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写5 o! K3 n- N1 h" p$ V
    服务。如果主UpdateServer发生故障,OceanBase能够在几秒中之内(一般为3~5
    6 d2 Y" g( Q" q秒)检测到并将服务切换到备机,备机几乎没有预热时间。
      E0 a  Y$ i7 W3 l- m; U( x●OceanBase存储多个副本并没有带来太多的成本。当前的主流服务器的磁盘容/ S4 f' D# g) F  s* ^
    量通常是富余的,例如,300GB×12或600GB×12的服务器有3TB或6TB左右的磁盘总8 ]+ k& T) u7 ?4 U
    容量,但存储系统单机通常只能服务少得多的数据量。7 o) G& G6 d  D; A; S& R
    8.4.4 读写事务
    2 \  D/ d. a# C在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。! J9 _, Y+ ]0 U5 d; g: N* f
    MergeServer解析这些读写事务的内容,例如词法和语法分析、schema检查等。对于
    3 z5 w  D6 c& m; m: y$ [只读事务,由MergeServer发给相应的ChunkServer分别执行后再合并每个ChunkServer
    * F4 C+ C) u# z4 ]  k! T2 s& m  J的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执
    2 P' j7 I9 Z0 n: y" E行。
    8 [8 D+ K- [7 q只读事务执行流程如下:
    ! G3 c) a- P# k$ w# v1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检
    $ Y) c0 T6 V. f0 o) F/ r( o查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。$ r: r9 A2 H: ^0 r
    2)如果SQL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台
    7 T7 `5 m) t( ]- n! tChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由
    / v5 g* Z% }1 q$ [( W, H, A$ e) uMergeServer来执行结果合并。+ {- T  X. A9 F
    3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操" O9 l( {/ ~- [6 n* |0 W
    作。9 C3 C; h* L; I  ]3 m) p" ?3 Y
    4)MergeServer将最终结果返回给客户端。  L8 V+ n2 u3 J, `+ L
    读写事务执行流程如下:
    & E- ]% b  z& {( @; x) `* o1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。. t5 N3 L( E& h1 r, O& o
    2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和
    0 e) T, n# b- h9 H基线数据一起传给UpdateServer。: N' L7 N, V& C- E
    3)UpdateServer根据物理执行计划执行读写事务,执行过程中需要使用
    4 w+ i  `& Z: x5 k, X3 {, F8 L- kMergeServer传入的基线数据。
    2 d# o6 v& i# Y% X; ~5 y0 I+ M4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作3 Y; L. y. j$ H: I( F4 H
    结果返回客户端。9 j8 Z9 b6 H) M
    例如,假设某SQL语句为:"update t1 set c1=c1+1 where rowkey=1",即将表格t1
    8 }: I  O* p" B4 }/ T/ L中主键为1的c1列加1,这一行数据存储在ChunkServer中,c1列的值原来为2012。那
    + T% j% M; Q! i; {么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将4 u9 B$ }; e8 V0 N9 g
    读取结果(c1=2012)以及SQL语句的物理执行计划一起发送给UpdateServer。* c' T5 `4 h! i2 j
    UpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表
    4 O! S8 W; l5 O9 f/ o# N. J(MemTable)中。当然,更新内存表之前需要记录操作日志。
    ' _, a0 ]5 Q" Z8.4.5 单点性能, o+ h0 V, p+ y
    OceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。
    ' A+ r- \, Q6 r1 R: B0 y# C当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了
    5 d  A5 x1 K( v( u* q% A0 u  t& VOceanBase集群的整体读写性能。9 r. u  A' |  m/ k; J7 k
    下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大, M8 D- T. e' w- K8 d* q
    部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几- {- ~0 Y& N7 {# u
    亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几( a7 F( K; ^' T: o. O+ g: f
    十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,
    $ |; f4 s. m) V. r) ]每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿" W5 Y% v+ A- k6 R& ]
    ×100+1000万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当4 w/ Y9 D! G0 }! M) ?
    前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、
    $ \! X0 Y3 ^' v6 X384GB乃至更多内存。
    $ ^( x1 o; {, j1 A. ?) H从上面的分析可以看出,UpdateServer的内存容量一般不会成为瓶颈。然而,服9 K4 d3 |6 u  R5 e, F9 D
    务器的内存毕竟有限,实际应用中仍然可能出现修改量超出内存的情况。例如,淘* e& t: e6 H' m
    宝双11网购节数据库修改量暴涨,某些特殊应用每天的修改次数特别多或者每次修
    1 i" H% M+ _# q$ T2 k4 ?3 [. F9 |改的数据量特别大,DBA数据订正时一次性写入大量数据。为此,UpdateServer设计
    % j# I6 b7 h$ y实现了几种方式解决内存容量问题,UpdateServer的内存表达到一定大小时,可自动- ^, r) g  y2 ^! T' I8 l7 i
    或者手工冻结并转储到SSD中,另外,OceanBase支持通过定期合并或者数据分发的( w$ M  C5 S- S1 N8 d' \1 U
    方式将UpdateServer的数据分散到集群中所有的ChunkServer机器中,这样不仅避免了
    8 J9 n+ \+ g# r9 dUpdateServer单机数据容量问题,还能够使得读取操作往往只需要访问UpdateServer9 ]8 b9 f) R5 l; ^& K, q
    内存中的数据,避免访问SSD磁盘,提高了读取性能。
    , u+ G3 @; M5 o从网络角度看,假设每秒的读取次数为20万次,每次需要从UpdateServer中获取. {& ~2 O) r3 y! a. F; m1 ^
    100字节,那么,读取操作占用的UpdateServer出口带宽为:20万×100=20MB,远远
    5 |4 s6 W0 U, w3 L4 i没有达到千兆网卡带宽上限。另外,UpdateServer还可以配置多块千兆网卡或者万兆) V8 `9 `* K6 k. b
    网卡,例如,OceanBase线上集群一般给UpdateServer配置4块千兆网卡。当然,如果4 M) h, A: r4 H% W, c" @" E: v6 ]4 e! ?/ x
    软件层面没有做好,硬件特性将得不到充分发挥。针对UpdateServer全内存、收发的, b! U9 c* U; J, @
    网络包一般比较小的特点,开发团队对UpdateServer的网络框架做了专门的优化,大
    ' e3 c! m2 X0 @% R3 z大提高了每秒收发网络包的个数,使得网络不会成为瓶颈。
    3 H7 k' A. h1 C3 N从磁盘的角度看,数据库事务需要首先将操作日志写入磁盘。如果每次写入都5 W* R2 }" m  G4 j
    需要将数据刷入磁盘,而一块SAS磁盘每秒支持的IOPS很难超过300,磁盘将很快成
    , R- P0 _( J; w为瓶颈。为了解决这个问题,UpdateServer在硬件上会配置一块带有缓存模块的RAID
    1 X0 Z( W) x: n% v卡,UpdateServer写操作日志只需要写入到RAID卡的缓存模块即可,延时可以控制在9 F% B( C5 I8 a% K' G7 u2 w3 f
    1毫秒之内。RAID卡带电池,如果UpdateServer发生故障,比如机器突然停电,RAID. q0 D- c( |- \0 m. T! M6 Y8 T" _" i
    卡能够确保将缓存中的数据刷入磁盘,不会出现丢数据的情况。另外,UpdateServer
    ; H0 `- h$ u% ~2 p& h( ]! M还实现了写事务的成组提交机制,将多个用户写操作凑成一批一次性提交,进一步3 ^+ v( V" F! M, i4 Y- X( B
    减少磁盘IO次数。4 ]. @, d& p0 g- p( N' ]% c# ~% C
    8.4.6 SSD支持% o' t5 r9 }7 }4 t4 r
    磁盘随机IO是存储系统性能的决定因素,传统的SAS盘能够提供的IOPS不超过
    ! L. k0 N  ^$ j* Q( n$ O300。关系数据库一般采用高速缓存(Buffer Cache) [1] 的方式缓解这个问题,读取操* l6 M/ b! O2 n& s; Y
    作将磁盘中的页面缓存到高速缓存中,并通过LRU或者类似的方式淘汰不经常访问5 n: M( @2 a8 P- I$ i2 }3 s
    的页面;同样,写入操作也是将数据写入到高速缓存中,由高速缓存按照一定的策
    . Q( O7 h1 l+ b5 {略将内存中页面的内容刷入磁盘。这种方式面临一些问题,例如,Cache冷启动问
    ( g, p, W2 H! A0 A题,即数据库刚启动时性能很差,需要将读取流量逐步切入。另外,这种方式不适; ~# ?' y4 `0 _* I
    合写入特别多的场景。- N/ T/ h* H% d4 a# R  l# R
    最近几年,SSD磁盘取得了很大的进展,它不仅提供了非常好的随机读取性能,9 a8 i' V, k. b1 r
    功耗也非常低,大有取代传统机械磁盘之势。一块普通的SSD磁盘可以提供35000
    ( r6 H" Z4 `4 V* z1 [. \IOPS甚至更高,并提供300MB/s或以上的读出带宽。然而,SSD盘的随机写性能并不9 e. Q2 ~/ X. |7 n- h# e  q6 F
    理想。这是因为,尽管SSD的读和写以页(page,例如4KB,8KB等)为单位,但+ |4 w" Z( ?7 p% ?* b% [  ]
    SSD写入前需要首先擦除已有内容,而擦除以块(block)为单位,一个块由若干个2 K- V& B9 \) i& |3 [$ w
    连续的页组成,大小通常在512KB~2MB。假如写入的页有内容,即使只写入一个
      P) M+ P8 [& n; ?3 k0 \字节,SSD也需要擦除整个512KB~2MB大小的块,然后再写入整个页的内容,这就
    6 z5 s0 O7 _% X是SSD的写入放大效应。虽然SSD硬件厂商都针对这个问题做了一些优化,但整体上2 t6 d% @1 e: [% y8 h
    看,随机写入不能发挥SSD的优势。
    4 ]- N9 ~1 k  N) ~OceanBase设计之初就认为SSD为大势所趋,整个系统设计时完全摒弃了随机2 ?' e) D, y0 s: S0 [4 V
    写,除了操作日志总是顺序追加写入到普通SAS盘上,剩下的写请求都是对响应时间1 W- A+ k3 ^% z/ Y8 L8 F) `
    要求不是很高的批量顺序写,SSD盘可以轻松应对,而大量查询请求的随机读,则发" N. T: ?( [' g6 x! ?( G
    挥了SSD良好的随机读的特性。摒弃随机写,采用批量的顺序写,也使得固态盘的使7 H4 b4 M/ O# e2 P9 |0 _' U6 O
    用寿命不再成为问题,主流SSD盘使用MLC SSD芯片,而MLC号称可以擦写1万次
    5 A( _9 g" n, x& z: _$ Y) W(SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数
      y1 J4 @; [8 q$ t* w( y计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。. U5 t% S  r5 H
    [1]这个机制在Oracle数据库中称为Buffer Cache,在MySQL数据库中称为Buffer Pool,
    1 Y* W  D$ U8 Q3 I用于缓存磁盘中的页面。
    3 i0 u! i% P1 q; ]2 @8.4.7 数据正确性4 s; B0 P3 I% j% F3 C, x
    数据丢失或者数据错误对于存储系统来说是一种灾难。前面8.4.1节中已经提" n$ X. a0 a; ]) A8 q# h5 ^: `
    到,OceanBase设计为强一致性系统,设计方案上保证不丢数据。然而,TCP协议传
    7 ]6 x4 v: ^, b9 B# l& p. q输、磁盘读写都可能出现数据错误,程序Bug则更为常见。为了防止各种因素导致的
    - a9 M* O/ L. |0 b, r数据损毁,OceanBase采取了以下数据校验措施:) f- ]5 E) R" i; x
    ●数据存储校验。每个存储记录(通常是几KB到几十KB)同时保存64位CRC校* `  T* M! F5 e6 h$ B
    验码,数据被访问时,重新计算和比对校验码。
    / Z& \- d2 Z! x●数据传输校验。每个传输记录同时传输64位CRC校验码,数据被接收后,重新9 W, ^. m; Y/ B6 @( m) U9 l' `. s) s$ F
    计算和比对校验码。& m. u: [- M, K: P- M& V
    ●数据镜像校验。UpdateServer在机群内有主UpdateServer和备UpdateServer,集
    ) ?& r2 {* _1 y( D% b- D群间有主集群和备集群,这些UpdateServer的内存表(MemTable)必须保持一致。为
    ! g4 l$ @( ~# a( o, T1 G) S此,UpdateServer为MemTable生成一个校验码,MemTable每次更新时,校验码同步; U7 N# A* e  w8 [6 j
    更新并记录在对应的操作日志中。备UpdateServer收到操作日志并重放到MemTable
    6 _5 v) r2 q8 s8 ]时,也同步更新MemTable校验码并与接收到的校验码对照。UpdateServer重新启动后+ m3 Y+ e+ Y& j% G# l' H
    重放日志恢复MemTable时也同步更新MemTable校验码并与保存在每条操作日志中的! ^" y# O5 |+ b
    校验码对照。" w6 n0 T2 n# b- w
    ●数据副本校验。定期合并时,新的子表由各个ChunkServer独立地融合旧的子表# M# q# k% F7 f; ]# ^5 S2 r
    中的SSTable与冻结的MemTable而生成,如果发生任何异常或者错误(比如程序
    , E  v, M% g5 `, O4 `0 U0 |bug),同一子表的多个副本可能不一致,则这种不一致可能随着定期合并而逐步累5 v) q8 X$ Z! E1 _, N
    积或扩散且很难被发现,即使被察觉,也可能因为需要追溯较长时间而难以定位到: F2 }. O" \, D! K/ W
    源头。为了防止这种情况出现,ChunkServer在定期合并生成新的子表时,也同时为
    ; e6 K  f5 I$ v7 T* G  [: `每个子表生成一个校验码,并随新子表汇报给RootServer,以便RootServer核对同一
    & j' {& d# B) m8 Y/ C子表不同副本的校验码。- D) R+ q, D8 n' O
    8.4.8 分层结构* d4 a8 m  d. C& z: y2 _6 j. m
    OceanBase对外提供的是与关系数据库一样的SQL操作接口,而内部却实现成一. k3 d, l2 W$ a. a& f6 M
    个线性可扩展的分布式系统。系统从逻辑实现上可以分为两个层次:分布式存储引
    9 c/ M3 L0 k% O擎层以及数据库功能层。$ `/ i6 I8 o( V1 F& }: V$ l! K
    OceanBase一期只实现了分布式存储引擎,这个存储引擎支持如下特性:
    + j4 F4 O) {/ T( B( K. X●支持分布式数据结构,基线数据逻辑上构成一颗分布式B+树,增量数据为内- P6 Z+ X  k' H8 `& `9 f8 H
    存中的B+树;
    ) _/ y, g$ n( J7 D●支持目前OceanBase的所有分布式特性,包括数据分布、负载均衡、主备同
    3 d' U* r3 b( z# B* F- j/ r+ E步、容错、自动增加/减少服务器等;
    9 t; m* i2 g- |  a●支持根据主键更新、插入、删除、随机读取一条记录,另外,支持根据主键范- }' G' F9 A* `6 I7 M$ [- f* q
    围顺序查找一段范围的记录。
    $ a1 E3 E; \1 F! j; @二期的OceanBase版本在分布式存储引擎之上增加了SQL支持:
    : _8 l4 e! V/ D●支持SQL语言以及MySQL协议,MySQL客户端可以直接访问;. Q9 S3 z. Q/ l1 U. l# C
    ●支持读写事务;
    % V2 s+ p" |2 q& ?7 o1 d# h! N, z●支持多版本并发控制;
    3 |9 K; K1 a" u! g% }9 T; }●支持读事务并发执行。
    7 F. }7 H# J: t" f: k从另外一个角度看,OceanBase融合了分布式存储系统和关系数据库这两种技4 k- D; M! h- ]' y' t
    术。通过分布式存储技术将基线数据分布到多台ChunkServer,实现数据复制、负载
    ' T# w& D5 [9 M7 [( H均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数5 b+ X) J* o7 ?, M4 ~8 \
    据库,底层采用关系数据库技术实现。我们后来发现,有一个号称“世界上最快的内
    3 }3 Y: e3 g7 U3 j) J9 X9 E存数据库”MemSQL采用了和OceanBase UpdateServer类似的设计,在拥有64个CPU核
    ) Q& `! B) G6 G( {心的服务器上实现了每秒150万次单行写事务。OceanBase相当于
    + d, S; h  J! ^( A4 e+ HGFS+MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是' p0 K4 B- a# T4 a# s% f" k
    成为可扩展的、支持每秒百万级单行事务操作的分布式数据库。" V) L$ y: B& H; Q' Z! R
    后续将分为两章,分别讲述OceanBase分布式存储引擎层以及数据库功能层的实
    7 L! K8 O# p* ^$ `! P8 `# s) w& Q' F/ y7 L现细节。
    $ }! s7 p' l" V: g) v' l2 M% e+ }4 o
    " l7 ~- `9 Z' e/ s1 f
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-11-21 21:05 , Processed in 0.222517 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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