java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2314|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66153

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

    发表于 2017-3-5 00:38:20 | 显示全部楼层 |阅读模式
    8.4 架构剖析. y% ?2 k4 \3 N0 P+ S* p( n
    8.4.1 一致性选择
    $ A2 S4 _8 V' i  cEric Brewer教授的CAP理论指出,在满足分区可容忍性的前提下,一致性和可
    5 ]9 s# D  V0 t  s用性不可兼得。
    ' ?# s( }+ z. y5 ^! `3 P. ^/ o+ M虽然目前大量的互联网项目选择了弱一致性,但我们认为这是底层存储系统,  }, x  w- v& k. E
    比如MySQL数据库,在大数据量和高并发需求压力之下的无奈选择。弱一致性给应# P, V( o3 Z& q
    用带来了很多麻烦,比如数据不一致时需要人工订正数据。如果存储系统既能够满
    ! m$ S8 C% c+ C$ ]' J* O" u3 x/ e5 j足大数据量和高并发的需求,又能够提供强一致性,且硬件成本相差不大,用户将
    , I' Q6 F0 O9 d/ {% F/ `# D毫不犹豫地选择它。强一致性将大大简化数据库的管理,应用程序也会因此而简( |! ^  G+ \* q% {2 W6 ?1 {& J
    化。因此,OceanBase选择支持强一致性和跨行跨表事务。
    $ c& a5 ~0 _, J2 V. |. S2 ZOceanBase UpdateServer为主备高可用架构,修改操作流程如下:
    ; L# ?0 X4 ~7 E# W1)将修改操作的操作日志(redo日志)发送到备机;
    & u; W: A4 Y0 y2 Z7 p2)将修改操作的操作日志写入主机硬盘;$ T9 E: o! U, e$ @- N$ M
    3)将操作日志应用到主机的内存表中;+ Z$ v+ V0 x$ n: v) h' A& X& |+ r
    4)返回客户端写入成功。
    0 c7 l" N4 a8 N8 D2 wOceanBase要求将操作日志同步到主备的情况下才能够返回客户端写入成功,即
    ; K( j/ R6 X9 R# X& u" ]使主机出现故障,备机自动切换为主机,也能够保证新的主机拥有以前所有的修改
    : g, H( s1 E+ ~( ^" _3 w7 {操作,严格保证数据不丢失。另外,为了提高可用性,OceanBase还增加了一种机
    2 l" a( f4 S" J& f; J8 ]制,如果主机往备机同步操作日志失败,比如备机故障或者主备之间网络故障,主) v5 ~3 ?* x0 m! Q6 {% R4 P
    机可以将备机从同步列表中剔除,本地更新成功后就返回客户端写入成功。主机将5 y( ], V$ M* d1 d
    备机剔除前需要通知RootServer,后续如果主机故障,RootServer能够避免将不同步
    0 z- o: n6 K7 G( G" M" O8 }的备机切换为主机。+ S4 Q& B) Z- v/ {0 r2 D# k
    OceanBase的高可用机制保证主机、备机以及主备之间网络三者之中的任何一个
    6 ^4 I3 B6 `) D& B出现故障都不会对用户产生影响,然而,如果三者之中的两个同时出现故障,系统
    0 s& w5 J+ x  l: ], O可用性将受到影响,但仍然保证数据不丢失。如果应用对可用性要求特别高,可以
    ; h( ?! I. @5 F* M: c增加备机数量,从而容忍多台机器同时出现故障的情况。" k" [* P5 z, Z: ^$ v3 R
    OceanBase主备同步也允许配置为异步模式,支持最终一致性。这种模式一般用9 N, H, ~' H) x* U/ r5 Y
    来支持异地容灾。例如,用户请求通过杭州主站的机房提供服务,主站的
    + `" N1 V9 X0 I6 gUpdateServer内部有一个同步线程不停地将用户更新操作发送到青岛机房。如果杭州
    8 a$ q8 W( y6 d1 D* [机房整体出现不可恢复的故障,比如地震,还能够通过青岛机房恢复数据并继续提8 k0 g1 E: J$ w4 Q( Q4 {
    供服务。9 o9 p9 k/ o; `# r% n0 g
    另外,OceanBase所有写事务最终都落到UpdateServer,而UpdateServer逻辑上是3 f3 e  |& R% U! ]3 \& ~+ y* I& U" e
    一个单点,支持跨行跨表事务,实现上借鉴了传统关系数据库的做法。
    ; _+ g" |$ f9 m8.4.2 数据结构4 f; O5 c& ]( f. ]: c
    OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台
    7 U7 @9 Q* ?. `ChunkServer上,增量数据全部存放在一台UpdateServer上。如图8-5所示,系统中有5( r2 k! l5 o' n9 @; n. Z
    个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer上。RootServer中维7 R. G5 ^1 f5 G, m3 F1 ]1 @( ?  W
    护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量
    9 D! |4 n6 C* S0 t& b( A更新。
    . {) Y; `( ]5 b& Z图 8-5 OceanBase数据结构
    9 h9 S6 L$ A% ]* ^8 G, X不考虑数据复制,基线数据的数据结构如下:
    1 g7 v2 _0 }  h8 \2 Y! |●每个表格按照主键组成一颗分布式B+树,主键由若干列组成;
    ; @' ]/ }# x0 l4 G( z, F: m# K: e& p●每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;; R& B& w& \9 k/ ^$ y
    ●每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;
    5 E; g  U/ k+ t# u! f$ `3 N, J" j●每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block
    ) K( @3 N. a% u% q* y6 Kindex);) @- j6 ^* [$ @+ q& j
    ●每个块的大小通常在4~64KB之间并内建块内的行索引;
    $ w2 W% ?( Q- }, J' o: k0 c●数据压缩以块为单位,压缩算法由用户指定并可随时变更;
    : ?- @' t/ j" b+ n●叶子节点可能合并或者分裂;8 g5 B0 _  z8 p
    ●所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;
    / H6 s5 m6 a7 R; [* l●通常情况下每个叶子节点有2~3个副本;
    9 E0 L/ j4 G' ^. \9 x& [●叶子节点是负载平衡和任务调度的基本单元;" w9 \" b# F) n; a3 a2 }5 Q3 ?  R
    ●支持布隆过滤器的过滤。
    ; Z, `+ }8 y: u+ {" r; I# H增量数据的数据结构如下:' v# L0 S) I( ?
    ●增量数据按照时间从旧到新划分为多个版本;6 U+ e4 |1 k  Q. e3 n
    ●最新版本的数据为一颗内存中的B+树,称为活跃MemTable;* E( z! E* C+ d. X% b2 D. f% X
    ●用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable$ u) z. @0 c; j* @" C
    将被冻结,并开启新的活跃MemTable接受修改操作;* n2 t1 x& l$ a' W
    ●冻结的MemTable将以SSTable的形式转储到SSD中持久化;
    6 x+ @5 O0 y; V●每个SSTable内部按主键范围有序划分为多个块并内建块索引,每个块的大小9 j1 Q) k3 P8 k5 L
    通常为4~8KB并内建块内行索引,一般不压缩;
    # V, k  e3 E: k+ i●UpdateServer支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。
    ) y$ Y! T+ ]  \. H( C8.4.3 可靠性与可用性4 d* h+ U& T" L, A4 _
    分布式系统需要处理各种故障,例如,软件故障、服务器故障、网络故障、数1 s8 b: i' S! n
    据中心故障、地震、火灾等。与其他分布式存储系统一样,OceanBase通过冗余的方
    ! I7 X5 o7 g( Z+ P式保障了高可靠性和高可用性。方法如下所示:
    " w4 t* W3 {/ |" ?4 A: W●OceanBase在ChunkServer中保存了基线数据的多个副本。单集群部署时一般会
    ; j( z: Y/ K  l2 G% {7 x配置3个副本;主备集群部署时一般会配置每个集群2个副本,总共4个副本。& Y5 s. F3 P0 \; e' }
    ●OceanBase在UpdateServer中保存了增量数据的多个副本。UpdateServer主备模
    ( B. ?8 n2 `* n0 d, K式下主备两台机器各保存一个副本,另外,每台机器都通过软件的方式实现了
    - U8 A, e- O" ~  i. XRAID1,将数据自动复制到多块磁盘,进一步增强了可靠性。
    4 C  p, R( q. ]  N* x2 @●ChunkServer的多个副本可以同时提供服务。Bigtable以及HBase这样的系统服务+ Y' _$ V. D. {' C. @  [% A
    节点不冗余,如果服务器出现故障,需要等待其他节点恢复成功才能提供服务,而
    0 I1 h$ v3 f& c5 Q# jOceanBase多个ChunkServer的子表副本数据完全一致,可以同时提供服务。
    8 p3 l0 m( N4 L9 _4 X+ Z/ D●UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写1 E" J0 v; B$ ]3 _+ Z" V1 K5 O
    服务。如果主UpdateServer发生故障,OceanBase能够在几秒中之内(一般为3~5
    , e  V, f- T/ {# W# i. h秒)检测到并将服务切换到备机,备机几乎没有预热时间。6 U. K9 [# a; L- K0 Z" I/ A- ]8 `
    ●OceanBase存储多个副本并没有带来太多的成本。当前的主流服务器的磁盘容% Y0 l* P5 l/ M
    量通常是富余的,例如,300GB×12或600GB×12的服务器有3TB或6TB左右的磁盘总
    + L  W" B# v  ^4 @: {容量,但存储系统单机通常只能服务少得多的数据量。9 N3 v* _9 q4 Q9 F7 R0 r4 u6 i. S
    8.4.4 读写事务  Z5 l4 E9 w4 m" c% s: @
    在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。& V6 e4 r  i0 ^8 E- S
    MergeServer解析这些读写事务的内容,例如词法和语法分析、schema检查等。对于5 N. w/ L& z( `- C
    只读事务,由MergeServer发给相应的ChunkServer分别执行后再合并每个ChunkServer5 H, \9 X+ h  D# L* A
    的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执
    6 H% o: }2 ?- r4 e) A$ l行。
    3 G( L% K  H  y" H4 M只读事务执行流程如下:
    # z3 W0 L( A4 J# A) W) M1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检
    1 U9 w+ R9 _9 f8 J) d" F查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。
    ; w8 C; w$ n8 {5 w9 ^3 Z3 {" T2)如果SQL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台% r( W/ ^8 r& i2 ^; ]  j1 C
    ChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由5 L! b/ D8 Y: E2 T% U0 M, T
    MergeServer来执行结果合并。8 h) s, ^' I& P8 P7 b" V4 X* y
    3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操
    ! G( j7 J- D4 E- s0 F8 n% Y) Y0 s作。$ v4 K4 K' W% k/ _1 g% \/ ^
    4)MergeServer将最终结果返回给客户端。
    0 J+ t' }* W( D4 \# q8 ^读写事务执行流程如下:+ \' ]3 W/ A5 K: V
    1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。' X' T( h+ a" `# ?" s
    2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和
    / ^/ g  N& g" q* ?8 u基线数据一起传给UpdateServer。1 }( F# p- E4 y: i
    3)UpdateServer根据物理执行计划执行读写事务,执行过程中需要使用5 a# b4 W* j+ P  Y
    MergeServer传入的基线数据。" n1 {+ L* K7 Y# i
    4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作
    , }. z" \6 l: c1 A7 d1 d$ \6 f9 v结果返回客户端。1 H" v9 n% L( c& _
    例如,假设某SQL语句为:"update t1 set c1=c1+1 where rowkey=1",即将表格t1
    ' Q, _+ h2 S+ u3 F- v% M7 V中主键为1的c1列加1,这一行数据存储在ChunkServer中,c1列的值原来为2012。那
    7 v% t# @; ~5 s6 H6 g6 @6 `8 d么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将6 y. a6 g% c; P6 O
    读取结果(c1=2012)以及SQL语句的物理执行计划一起发送给UpdateServer。' |4 b! ?. n2 k6 a+ _# Q" r1 M
    UpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表
    8 Q4 T, R) x- l' e2 ](MemTable)中。当然,更新内存表之前需要记录操作日志。
    ) S' Y7 }1 M/ w) u+ `8 {, ~8.4.5 单点性能! ~0 y/ M) T, F% y
    OceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。2 X7 b0 r6 X( C' n) t: H5 y
    当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了1 ]+ a+ n( ^9 K$ |; o. I' N- l
    OceanBase集群的整体读写性能。% O# y' s; j( x* f3 o, B; M
    下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大
    , m# J" E' t9 x8 A  q部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几
    ; d3 x$ S- o: w& ~, ^" c' C4 S亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几7 i" Z' ~' |+ O4 ]: w1 n, i
    十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,3 F$ B& q& B1 R2 O( ~9 d( X
    每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿! r- J. Q5 D) C
    ×100+1000万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当8 A" {! b, y  c- @5 t+ s8 T
    前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、
    / p9 i$ ?0 y+ a0 p2 o$ A, \: H9 T384GB乃至更多内存。
    4 k; f# m, U" h  B1 b从上面的分析可以看出,UpdateServer的内存容量一般不会成为瓶颈。然而,服9 ]* {  |; ~) u' ^( J) s* l
    务器的内存毕竟有限,实际应用中仍然可能出现修改量超出内存的情况。例如,淘. h1 I/ _3 P% `2 {- |, b/ V! z
    宝双11网购节数据库修改量暴涨,某些特殊应用每天的修改次数特别多或者每次修4 h7 }) E- M: V' b5 _$ t! F
    改的数据量特别大,DBA数据订正时一次性写入大量数据。为此,UpdateServer设计
    # }: _, t6 V( a4 P. V1 x9 h: g' a实现了几种方式解决内存容量问题,UpdateServer的内存表达到一定大小时,可自动
    " M! s7 q8 O1 ~* u4 O( S/ t* F或者手工冻结并转储到SSD中,另外,OceanBase支持通过定期合并或者数据分发的/ ?1 `: w' F) A. J& D- J) }% V
    方式将UpdateServer的数据分散到集群中所有的ChunkServer机器中,这样不仅避免了" b, e' m9 @8 \- @  a2 p  E
    UpdateServer单机数据容量问题,还能够使得读取操作往往只需要访问UpdateServer
    % G9 B2 {# E7 X内存中的数据,避免访问SSD磁盘,提高了读取性能。1 @+ @" Y7 a  d7 t. W3 F
    从网络角度看,假设每秒的读取次数为20万次,每次需要从UpdateServer中获取
    ) \5 e' K( x+ d* X. e100字节,那么,读取操作占用的UpdateServer出口带宽为:20万×100=20MB,远远
    + q5 n! {0 T& J0 z( z没有达到千兆网卡带宽上限。另外,UpdateServer还可以配置多块千兆网卡或者万兆
    2 A# M4 m- q+ f$ p网卡,例如,OceanBase线上集群一般给UpdateServer配置4块千兆网卡。当然,如果
    1 f2 Z  n  `, D, m* N软件层面没有做好,硬件特性将得不到充分发挥。针对UpdateServer全内存、收发的
    & d$ R/ w" Y" b( ]4 {网络包一般比较小的特点,开发团队对UpdateServer的网络框架做了专门的优化,大
    ) l& Z) G4 S9 R) o( n: V3 N# @大提高了每秒收发网络包的个数,使得网络不会成为瓶颈。
      {  I* \4 ~- i+ y7 W从磁盘的角度看,数据库事务需要首先将操作日志写入磁盘。如果每次写入都
    , x5 z5 F) L3 q2 i! j9 x) z( U需要将数据刷入磁盘,而一块SAS磁盘每秒支持的IOPS很难超过300,磁盘将很快成
    0 d$ m8 ^: ^; G6 V2 o* q6 Y. J  }  I为瓶颈。为了解决这个问题,UpdateServer在硬件上会配置一块带有缓存模块的RAID
    4 h8 ]) }/ o2 n* n; n卡,UpdateServer写操作日志只需要写入到RAID卡的缓存模块即可,延时可以控制在
    ( j: ]4 z2 P( g. g( k" M* K4 ~* l' {1毫秒之内。RAID卡带电池,如果UpdateServer发生故障,比如机器突然停电,RAID
    3 I# p8 ]6 T8 W! L) d. z/ Y  J卡能够确保将缓存中的数据刷入磁盘,不会出现丢数据的情况。另外,UpdateServer+ w! j5 J( D3 D5 }# @8 W) ^
    还实现了写事务的成组提交机制,将多个用户写操作凑成一批一次性提交,进一步$ Q; x4 f) k- v8 I
    减少磁盘IO次数。& ^2 r. a/ Z/ m# D: W4 m
    8.4.6 SSD支持
    + F0 v1 K+ c0 {; D8 Z& `  F- z( |2 u4 N磁盘随机IO是存储系统性能的决定因素,传统的SAS盘能够提供的IOPS不超过. ?9 l0 A# {# S0 l# h4 w9 y
    300。关系数据库一般采用高速缓存(Buffer Cache) [1] 的方式缓解这个问题,读取操
    0 I* g6 v( ?1 Y: J6 Q# g- f- ]作将磁盘中的页面缓存到高速缓存中,并通过LRU或者类似的方式淘汰不经常访问
    6 ?6 U& Y0 u- ^3 X4 U的页面;同样,写入操作也是将数据写入到高速缓存中,由高速缓存按照一定的策8 W  e3 t  {8 G2 [/ G
    略将内存中页面的内容刷入磁盘。这种方式面临一些问题,例如,Cache冷启动问8 t3 N9 E$ v( i
    题,即数据库刚启动时性能很差,需要将读取流量逐步切入。另外,这种方式不适
    1 C! b) f& e2 k, a* I合写入特别多的场景。( v3 T& y( ^2 o) Q4 r
    最近几年,SSD磁盘取得了很大的进展,它不仅提供了非常好的随机读取性能,
    5 S2 G2 ]  K; s功耗也非常低,大有取代传统机械磁盘之势。一块普通的SSD磁盘可以提供35000
    & d3 \# F2 N' oIOPS甚至更高,并提供300MB/s或以上的读出带宽。然而,SSD盘的随机写性能并不
    8 s6 S. V2 u& \4 P3 M理想。这是因为,尽管SSD的读和写以页(page,例如4KB,8KB等)为单位,但% B, g4 x: @- p: I3 g. C
    SSD写入前需要首先擦除已有内容,而擦除以块(block)为单位,一个块由若干个. N' S2 p* P7 j
    连续的页组成,大小通常在512KB~2MB。假如写入的页有内容,即使只写入一个/ V2 S9 F5 [4 C5 X
    字节,SSD也需要擦除整个512KB~2MB大小的块,然后再写入整个页的内容,这就2 r+ v' [* {: l3 y; d) u0 C
    是SSD的写入放大效应。虽然SSD硬件厂商都针对这个问题做了一些优化,但整体上! S  }  w+ J! P. x7 c7 ?
    看,随机写入不能发挥SSD的优势。/ k. M4 r$ M6 c/ ?, {4 u
    OceanBase设计之初就认为SSD为大势所趋,整个系统设计时完全摒弃了随机
    * |3 Y; ~5 }- G- ]: M, l写,除了操作日志总是顺序追加写入到普通SAS盘上,剩下的写请求都是对响应时间
    & W% j- X4 T2 F要求不是很高的批量顺序写,SSD盘可以轻松应对,而大量查询请求的随机读,则发
    # l0 J1 H5 [7 t! f; b* Z& Q挥了SSD良好的随机读的特性。摒弃随机写,采用批量的顺序写,也使得固态盘的使2 {) c* D1 s# p' r* {
    用寿命不再成为问题,主流SSD盘使用MLC SSD芯片,而MLC号称可以擦写1万次
      k% t/ h& k. N' q8 ^(SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数1 Y2 L; t5 i! W
    计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。
    : c9 Q. w. g3 x, |( d- d. O( Z) U[1]这个机制在Oracle数据库中称为Buffer Cache,在MySQL数据库中称为Buffer Pool,
    # G) ^* z2 b$ w! C  E用于缓存磁盘中的页面。8 ]8 K' I; ~2 a
    8.4.7 数据正确性
    ; p( x  V9 O5 x  {8 z+ n: i数据丢失或者数据错误对于存储系统来说是一种灾难。前面8.4.1节中已经提
    . ]3 [+ O2 L" z) F到,OceanBase设计为强一致性系统,设计方案上保证不丢数据。然而,TCP协议传
    , y- g" Q& p, |+ N3 U& F输、磁盘读写都可能出现数据错误,程序Bug则更为常见。为了防止各种因素导致的. S& H2 v5 S( q% G
    数据损毁,OceanBase采取了以下数据校验措施:/ {9 l8 [, ]* ?1 r3 J
    ●数据存储校验。每个存储记录(通常是几KB到几十KB)同时保存64位CRC校+ X* i0 ^2 m; u
    验码,数据被访问时,重新计算和比对校验码。
    ) w$ A4 z7 y) \1 b. [% c& ^, u4 K2 y2 C4 r●数据传输校验。每个传输记录同时传输64位CRC校验码,数据被接收后,重新% z0 }8 J0 w5 l0 O& q3 ?4 }$ d
    计算和比对校验码。
    0 K* N. `- y9 l! C! B●数据镜像校验。UpdateServer在机群内有主UpdateServer和备UpdateServer,集
    ' G4 I; Z9 J$ w6 z3 V群间有主集群和备集群,这些UpdateServer的内存表(MemTable)必须保持一致。为
    : z5 k) R8 Y" j7 `; F/ Y此,UpdateServer为MemTable生成一个校验码,MemTable每次更新时,校验码同步
    ) f6 V: x/ A" }$ c8 m# g4 o更新并记录在对应的操作日志中。备UpdateServer收到操作日志并重放到MemTable
    0 f) x& D' [5 |0 I( ~' o时,也同步更新MemTable校验码并与接收到的校验码对照。UpdateServer重新启动后
    ( k. h: k" I5 T( t# y" N重放日志恢复MemTable时也同步更新MemTable校验码并与保存在每条操作日志中的
    & T# G- |8 w! Z: ^, A* k* Q5 S校验码对照。
    2 m9 V2 E! p: L+ n●数据副本校验。定期合并时,新的子表由各个ChunkServer独立地融合旧的子表
    / v' F0 }% H- l$ `中的SSTable与冻结的MemTable而生成,如果发生任何异常或者错误(比如程序& L, ~* [: Q# O: t& W7 J+ o
    bug),同一子表的多个副本可能不一致,则这种不一致可能随着定期合并而逐步累" _% M' o- W& l0 a
    积或扩散且很难被发现,即使被察觉,也可能因为需要追溯较长时间而难以定位到9 A4 T& A" r" [
    源头。为了防止这种情况出现,ChunkServer在定期合并生成新的子表时,也同时为- t4 e2 ]* A; c8 o) [) T& h/ `
    每个子表生成一个校验码,并随新子表汇报给RootServer,以便RootServer核对同一
    + L7 o  ~% }  C5 Z, {; z, ^子表不同副本的校验码。
    + u; y3 _5 p) S1 z& k+ H$ G8.4.8 分层结构
    $ S- K% c6 Z" R: X: uOceanBase对外提供的是与关系数据库一样的SQL操作接口,而内部却实现成一
    ) p4 i) W# K' O& D% z) D2 e# w- e个线性可扩展的分布式系统。系统从逻辑实现上可以分为两个层次:分布式存储引9 `- e/ E, v  U& ^$ ^5 U# K
    擎层以及数据库功能层。/ B8 p& }! H  H* E& y: \7 f1 d
    OceanBase一期只实现了分布式存储引擎,这个存储引擎支持如下特性:
    9 u* L& @- W/ A3 E. c4 ?●支持分布式数据结构,基线数据逻辑上构成一颗分布式B+树,增量数据为内
    : }2 w& G- r9 s) R* G8 ?存中的B+树;
    - ]/ c# p" H, V: j: [! M●支持目前OceanBase的所有分布式特性,包括数据分布、负载均衡、主备同
    ; T% O5 ^6 W5 W( s步、容错、自动增加/减少服务器等;) j$ y; E4 Z0 N* o8 i( ]. ]* x* ^# |
    ●支持根据主键更新、插入、删除、随机读取一条记录,另外,支持根据主键范# c& k7 [4 t+ _( t- o8 v0 W% I
    围顺序查找一段范围的记录。. l4 J  I' P9 t" L/ G. J5 e) {- x
    二期的OceanBase版本在分布式存储引擎之上增加了SQL支持:
    ) h1 m) d. J2 U0 _# V: r3 g●支持SQL语言以及MySQL协议,MySQL客户端可以直接访问;
    ! l- I6 r6 \# I; v4 z5 x●支持读写事务;
    0 q. @: X2 |% {, W9 i+ K●支持多版本并发控制;( A( h, {- P# v- {# e4 m. x
    ●支持读事务并发执行。
    ! K$ R* P# c; @1 {6 x, c从另外一个角度看,OceanBase融合了分布式存储系统和关系数据库这两种技
    / h8 h; V. c. s术。通过分布式存储技术将基线数据分布到多台ChunkServer,实现数据复制、负载
    0 \) `4 r) U( r- }均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数) ~" S1 ^: B2 [6 A4 E
    据库,底层采用关系数据库技术实现。我们后来发现,有一个号称“世界上最快的内
    , U, _: L+ l6 ?: I8 U存数据库”MemSQL采用了和OceanBase UpdateServer类似的设计,在拥有64个CPU核
    - E3 {- L) ^; L* [: U$ o# D# d9 ^心的服务器上实现了每秒150万次单行写事务。OceanBase相当于, M5 Q. a9 z1 x
    GFS+MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是0 D7 l: l. j, t7 G3 _# ^
    成为可扩展的、支持每秒百万级单行事务操作的分布式数据库。! z9 ~/ ?3 F+ `3 }* B" d8 l3 H
    后续将分为两章,分别讲述OceanBase分布式存储引擎层以及数据库功能层的实: u4 s4 [0 s3 f1 b# k
    现细节。+ H: F: L/ u$ n$ X% G

    ) x5 i; Z% [* \& Z
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-17 04:42 , Processed in 0.081011 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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