java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2725|回复: 0

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

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

    [LV.Master]出神入化

    2096

    主题

    3754

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66788

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

    发表于 2017-3-5 00:38:20 | 显示全部楼层 |阅读模式
    8.4 架构剖析; H& k* Y: U) i( C; H
    8.4.1 一致性选择
    , k0 p# K. o6 h& m* R8 \Eric Brewer教授的CAP理论指出,在满足分区可容忍性的前提下,一致性和可5 E& C: g7 l2 F" T
    用性不可兼得。: ~5 Q  m+ Q! U4 z$ a5 `
    虽然目前大量的互联网项目选择了弱一致性,但我们认为这是底层存储系统,/ T2 ^8 N7 x3 p& N5 F; o# j
    比如MySQL数据库,在大数据量和高并发需求压力之下的无奈选择。弱一致性给应
    # z" v) Z8 T! q: A9 {8 h' S  G用带来了很多麻烦,比如数据不一致时需要人工订正数据。如果存储系统既能够满
    ; N* B: W0 O1 ~+ a+ ~足大数据量和高并发的需求,又能够提供强一致性,且硬件成本相差不大,用户将
    + Z! c" f+ l3 [# p2 d0 Q毫不犹豫地选择它。强一致性将大大简化数据库的管理,应用程序也会因此而简( A4 |& d( V# F/ ?# m
    化。因此,OceanBase选择支持强一致性和跨行跨表事务。" ?( Z+ N- K  F
    OceanBase UpdateServer为主备高可用架构,修改操作流程如下:
    . V" q% @: o/ v: K1)将修改操作的操作日志(redo日志)发送到备机;
    2 T: J# m) D2 Z8 l- D$ B' E2)将修改操作的操作日志写入主机硬盘;. X5 [4 ?, J; W
    3)将操作日志应用到主机的内存表中;0 z4 f8 ^7 }. x( [7 `. @; a; ^! w
    4)返回客户端写入成功。
    , L9 I8 d" H4 A9 M; F% w2 K5 S. g7 dOceanBase要求将操作日志同步到主备的情况下才能够返回客户端写入成功,即* a$ t' _' d/ s) u4 @" r
    使主机出现故障,备机自动切换为主机,也能够保证新的主机拥有以前所有的修改4 O' o, G' Z' Y. o& ~4 l
    操作,严格保证数据不丢失。另外,为了提高可用性,OceanBase还增加了一种机
    8 L# M% z! O+ e" R; t4 t5 ^$ h制,如果主机往备机同步操作日志失败,比如备机故障或者主备之间网络故障,主
    & \; F& j6 M- o机可以将备机从同步列表中剔除,本地更新成功后就返回客户端写入成功。主机将
    $ n0 B  m' Y7 L% [备机剔除前需要通知RootServer,后续如果主机故障,RootServer能够避免将不同步2 E5 Y; v5 s: K
    的备机切换为主机。
    " U4 y' [$ q0 @* W3 W' O( AOceanBase的高可用机制保证主机、备机以及主备之间网络三者之中的任何一个6 o7 b/ T5 S5 X, O2 F
    出现故障都不会对用户产生影响,然而,如果三者之中的两个同时出现故障,系统3 c$ p! M. L  R$ e& Y- \: }
    可用性将受到影响,但仍然保证数据不丢失。如果应用对可用性要求特别高,可以, ]" y4 }# Z8 ?. Z' {
    增加备机数量,从而容忍多台机器同时出现故障的情况。
    * Q! I- v" r) r5 O' `* L; J6 o0 yOceanBase主备同步也允许配置为异步模式,支持最终一致性。这种模式一般用( z" K  h  P% }* b# z' t
    来支持异地容灾。例如,用户请求通过杭州主站的机房提供服务,主站的
    9 A5 [1 r( u* d& B5 s; A0 K5 [' T4 s9 fUpdateServer内部有一个同步线程不停地将用户更新操作发送到青岛机房。如果杭州  n! g5 }5 e7 I0 m4 }! E3 e
    机房整体出现不可恢复的故障,比如地震,还能够通过青岛机房恢复数据并继续提
    8 v* s( \1 {  A  c/ G供服务。5 T3 s" A7 f; i
    另外,OceanBase所有写事务最终都落到UpdateServer,而UpdateServer逻辑上是6 G9 v: x. P. u: A. S) U4 x
    一个单点,支持跨行跨表事务,实现上借鉴了传统关系数据库的做法。
    . r9 h2 ^3 P. P+ w) V# _8 l0 `( N8.4.2 数据结构
    - _' c# g7 R  n/ [: @OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台& C0 p  Y- q- ~( v" ]
    ChunkServer上,增量数据全部存放在一台UpdateServer上。如图8-5所示,系统中有5
    - b8 l4 O( J( l; i7 i个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer上。RootServer中维
    5 ~6 y, P8 |" s6 h5 V4 I护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量  b+ g4 X, Z. f3 k9 J! @8 U2 e
    更新。4 w  ^3 i, ]& v
    图 8-5 OceanBase数据结构5 R" w6 h% B% t( W0 G( f% V0 w4 G
    不考虑数据复制,基线数据的数据结构如下:
    $ |: u: S" c8 d1 W) S+ ~% @. K●每个表格按照主键组成一颗分布式B+树,主键由若干列组成;
    5 G- K/ I; w4 E( x  C7 O●每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;) G& ~9 A9 ?1 ]" F8 R# _4 o- c# B
    ●每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;% H' l6 b- r5 n0 l1 e0 m% `9 {
    ●每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block
    & }4 D0 _5 |9 A5 n* Eindex);8 z# X! _9 u! X- y, |
    ●每个块的大小通常在4~64KB之间并内建块内的行索引;0 m7 k; ~$ b$ @3 o/ f, c$ O7 E7 M% {
    ●数据压缩以块为单位,压缩算法由用户指定并可随时变更;
    * v/ h/ Z% [# M; U! I; a●叶子节点可能合并或者分裂;" v- }) f. x1 Q9 ~
    ●所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;' B& B+ B# f7 o+ c. ]$ t& J
    ●通常情况下每个叶子节点有2~3个副本;7 p' y5 l! T  o/ j) F# q; }
    ●叶子节点是负载平衡和任务调度的基本单元;' s2 s) g3 Z- |* z- k8 ~
    ●支持布隆过滤器的过滤。+ z2 L7 h! D" P
    增量数据的数据结构如下:
    1 P) u2 A# R5 h; d) Y+ V5 f( i●增量数据按照时间从旧到新划分为多个版本;+ d1 L) A- c. w: B
    ●最新版本的数据为一颗内存中的B+树,称为活跃MemTable;% s* V' J. P, u. b& z0 f4 B2 ?
    ●用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable' l3 V$ p$ T4 M* s, J
    将被冻结,并开启新的活跃MemTable接受修改操作;$ p' G+ V$ \% [9 t, q
    ●冻结的MemTable将以SSTable的形式转储到SSD中持久化;
    2 W( \- _( R1 r) x: f●每个SSTable内部按主键范围有序划分为多个块并内建块索引,每个块的大小  C# D; r  U& ~) @2 \
    通常为4~8KB并内建块内行索引,一般不压缩;
    & A4 w. _: [$ R* I- |●UpdateServer支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。
    0 w) E+ D7 ~. [! ]8.4.3 可靠性与可用性
    , x/ {4 [; }7 ?( P% Q分布式系统需要处理各种故障,例如,软件故障、服务器故障、网络故障、数5 U2 z2 R8 ?3 S! H" e1 e% l0 z
    据中心故障、地震、火灾等。与其他分布式存储系统一样,OceanBase通过冗余的方( h5 _# U+ ~9 X: C8 H" o  h
    式保障了高可靠性和高可用性。方法如下所示:
    0 ?8 I( Q6 b! ?' t* x8 j0 ]$ H●OceanBase在ChunkServer中保存了基线数据的多个副本。单集群部署时一般会
    , b# b5 C0 u( T: Q) v  e# z( m配置3个副本;主备集群部署时一般会配置每个集群2个副本,总共4个副本。
    ; W+ U/ x3 H$ `; O+ ?●OceanBase在UpdateServer中保存了增量数据的多个副本。UpdateServer主备模1 B& H4 s* \$ @4 N/ `$ s
    式下主备两台机器各保存一个副本,另外,每台机器都通过软件的方式实现了
    ) X: p* `7 O6 i$ U5 {8 w$ JRAID1,将数据自动复制到多块磁盘,进一步增强了可靠性。2 J1 ^! D7 |4 U8 H/ b; |
    ●ChunkServer的多个副本可以同时提供服务。Bigtable以及HBase这样的系统服务. b- }, t+ K. F
    节点不冗余,如果服务器出现故障,需要等待其他节点恢复成功才能提供服务,而( T7 ~/ j( Q5 O$ ?
    OceanBase多个ChunkServer的子表副本数据完全一致,可以同时提供服务。; M: r0 ~  R9 P. E* ~/ g* k8 U8 V
    ●UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写8 c3 ]0 E; x% L7 Z$ l! O
    服务。如果主UpdateServer发生故障,OceanBase能够在几秒中之内(一般为3~54 i7 n( a1 X3 _
    秒)检测到并将服务切换到备机,备机几乎没有预热时间。
    2 R2 q6 H5 r3 P% `" @* K●OceanBase存储多个副本并没有带来太多的成本。当前的主流服务器的磁盘容8 j+ A/ I1 V1 Y) c. _- K+ Y
    量通常是富余的,例如,300GB×12或600GB×12的服务器有3TB或6TB左右的磁盘总
    6 \: W& I6 j1 ?$ q; s容量,但存储系统单机通常只能服务少得多的数据量。
    0 \: Z7 {' V) L/ u1 l" ?+ W8.4.4 读写事务
    & c! x( _8 M0 z* U* ]在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。( D! h, N; f" R0 [3 F6 ?
    MergeServer解析这些读写事务的内容,例如词法和语法分析、schema检查等。对于$ ^8 n* w# R" T9 A- x
    只读事务,由MergeServer发给相应的ChunkServer分别执行后再合并每个ChunkServer
    / j% m' J% K; o* i1 t的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执1 P. Q! l4 L8 @4 B0 j$ y
    行。$ u% G2 G% F/ B6 Q8 q
    只读事务执行流程如下:/ }* a( S" b: l, ?; `& Q
    1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检( @1 x& I' [: t: w7 F' ^  t  `0 U
    查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。1 _$ p$ Q$ m8 n* W+ {6 G6 B  x$ [
    2)如果SQL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台# z* {4 O' I) h, s
    ChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由* k2 U' x5 I4 l4 y5 c' Z
    MergeServer来执行结果合并。
    ) y  @6 V: w+ d2 D6 P. a3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操' l5 r) n1 Z" [1 O9 A
    作。
    $ x  `# J7 O( j: K9 D" l, {5 v4)MergeServer将最终结果返回给客户端。7 i$ t9 b. ^9 C8 c( G) A' }! h
    读写事务执行流程如下:: A3 U$ o2 M  S7 x0 b7 g8 v$ W; a+ L
    1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。
    ; W* H0 I# W$ e+ i7 U/ u2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和* e6 b: Q4 |, o, k% l8 V! G9 {' `
    基线数据一起传给UpdateServer。
    : I  L! i9 a  T$ Q3)UpdateServer根据物理执行计划执行读写事务,执行过程中需要使用
    , e% {( [( W; jMergeServer传入的基线数据。
    4 g5 I! d7 O7 G. j4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作
    , O( m' T9 U1 l4 x/ u) N6 e结果返回客户端。6 [  R* p( X+ j; W9 b" N/ ~
    例如,假设某SQL语句为:"update t1 set c1=c1+1 where rowkey=1",即将表格t1, O) [" e, q+ t9 n7 J* t0 Y$ @
    中主键为1的c1列加1,这一行数据存储在ChunkServer中,c1列的值原来为2012。那* u' u8 R' {4 V/ n9 R
    么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将
    & ~* N! `8 X& z读取结果(c1=2012)以及SQL语句的物理执行计划一起发送给UpdateServer。' }5 h' d0 O) S: N% t$ d% X  ~
    UpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表
    ) j2 a0 l- V# o8 |3 x(MemTable)中。当然,更新内存表之前需要记录操作日志。
    5 e7 ?+ |1 w, f2 g) ]/ I! d" @7 i* h8.4.5 单点性能: Q5 R$ E; `, B9 Z+ X
    OceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。2 ~9 ~) R9 M" S; [
    当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了* I# V  i1 {. t( Y! j0 M- d
    OceanBase集群的整体读写性能。
    / b, S! w# R5 f, j  U; I: e下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大1 I$ x( q8 i% k7 F
    部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几# }6 s" Y8 v, o1 s- z6 X: j) C
    亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几
    & d- b6 p4 }9 U十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,, f4 G  f: ?6 `# R3 z
    每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿
    : [. N9 x9 ?! S  J×100+1000万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当3 i6 v0 U+ M5 a/ s  w  h$ x8 O
    前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、7 r) G" }. A) O( S6 E5 l* \
    384GB乃至更多内存。
    3 V& E! Q9 V" ]6 z从上面的分析可以看出,UpdateServer的内存容量一般不会成为瓶颈。然而,服
    $ ^* l- }- B" P1 h5 U8 r务器的内存毕竟有限,实际应用中仍然可能出现修改量超出内存的情况。例如,淘7 I8 D: F6 ?4 p, l
    宝双11网购节数据库修改量暴涨,某些特殊应用每天的修改次数特别多或者每次修
    2 D( d( Y. t  `) K3 m改的数据量特别大,DBA数据订正时一次性写入大量数据。为此,UpdateServer设计) e) y: O) m- V$ C# o% I
    实现了几种方式解决内存容量问题,UpdateServer的内存表达到一定大小时,可自动4 a( x3 [, ?* e$ s. T
    或者手工冻结并转储到SSD中,另外,OceanBase支持通过定期合并或者数据分发的
    ) O6 j& s: W, E! ]6 F方式将UpdateServer的数据分散到集群中所有的ChunkServer机器中,这样不仅避免了
    . @& Z% U2 V/ t! U! o2 ^8 I0 UUpdateServer单机数据容量问题,还能够使得读取操作往往只需要访问UpdateServer
    & s# ~  l% U7 b  G& _内存中的数据,避免访问SSD磁盘,提高了读取性能。9 T* ]9 {7 |' x8 E5 ]
    从网络角度看,假设每秒的读取次数为20万次,每次需要从UpdateServer中获取
    8 t% u# }- D/ O' E7 @( _100字节,那么,读取操作占用的UpdateServer出口带宽为:20万×100=20MB,远远
    5 y) @- m* i; d没有达到千兆网卡带宽上限。另外,UpdateServer还可以配置多块千兆网卡或者万兆
    # ^, T8 ~) ~& h# S( |网卡,例如,OceanBase线上集群一般给UpdateServer配置4块千兆网卡。当然,如果
      ?) c  H2 c1 C- e# i软件层面没有做好,硬件特性将得不到充分发挥。针对UpdateServer全内存、收发的6 U, G" s- n8 u+ f4 \8 l
    网络包一般比较小的特点,开发团队对UpdateServer的网络框架做了专门的优化,大1 Z- z% w2 I  w: T$ k
    大提高了每秒收发网络包的个数,使得网络不会成为瓶颈。
    , B5 s' b# k" g) g+ I从磁盘的角度看,数据库事务需要首先将操作日志写入磁盘。如果每次写入都: c+ P0 t2 X' c7 b' t( T+ j; B3 p
    需要将数据刷入磁盘,而一块SAS磁盘每秒支持的IOPS很难超过300,磁盘将很快成
    . h) T6 J, T1 O/ B; `3 K为瓶颈。为了解决这个问题,UpdateServer在硬件上会配置一块带有缓存模块的RAID
    & ?: T$ _3 s* o: ~. Q5 g6 B卡,UpdateServer写操作日志只需要写入到RAID卡的缓存模块即可,延时可以控制在3 y! h6 D  x' c, V: m7 A/ m9 c& @
    1毫秒之内。RAID卡带电池,如果UpdateServer发生故障,比如机器突然停电,RAID0 Z& j$ S- x  D1 }1 l; w6 z4 H
    卡能够确保将缓存中的数据刷入磁盘,不会出现丢数据的情况。另外,UpdateServer3 Z- M( g! x# o
    还实现了写事务的成组提交机制,将多个用户写操作凑成一批一次性提交,进一步6 A: ~" k! J9 o
    减少磁盘IO次数。, s: g$ I, F: a  G3 J  Y% b
    8.4.6 SSD支持8 l7 m% E' s8 i9 p$ f; G2 h
    磁盘随机IO是存储系统性能的决定因素,传统的SAS盘能够提供的IOPS不超过3 E6 ?5 a6 @7 ^
    300。关系数据库一般采用高速缓存(Buffer Cache) [1] 的方式缓解这个问题,读取操3 ~- u* L: h, Z9 V
    作将磁盘中的页面缓存到高速缓存中,并通过LRU或者类似的方式淘汰不经常访问/ W6 ?3 |! h& Y9 Z; R/ h- ^8 a
    的页面;同样,写入操作也是将数据写入到高速缓存中,由高速缓存按照一定的策) \  ~/ h. ?( l" G; e) C8 `; t
    略将内存中页面的内容刷入磁盘。这种方式面临一些问题,例如,Cache冷启动问- h$ M7 x3 ]$ \, f+ k4 X
    题,即数据库刚启动时性能很差,需要将读取流量逐步切入。另外,这种方式不适8 m) p, {, T" p( C# D) U- i+ d  ?
    合写入特别多的场景。, s! \3 Z! d4 {0 O3 G
    最近几年,SSD磁盘取得了很大的进展,它不仅提供了非常好的随机读取性能,: U  a" }* T3 j) e* s/ G6 V
    功耗也非常低,大有取代传统机械磁盘之势。一块普通的SSD磁盘可以提供35000( L; G0 Q$ ?, L: l! I" j* g
    IOPS甚至更高,并提供300MB/s或以上的读出带宽。然而,SSD盘的随机写性能并不# H& o4 A( n9 V
    理想。这是因为,尽管SSD的读和写以页(page,例如4KB,8KB等)为单位,但9 |) `% V- W) I( u% s" y
    SSD写入前需要首先擦除已有内容,而擦除以块(block)为单位,一个块由若干个7 [/ m. t1 K/ g9 ?( G0 [2 D
    连续的页组成,大小通常在512KB~2MB。假如写入的页有内容,即使只写入一个# p4 g, ^6 Y, N. w) }
    字节,SSD也需要擦除整个512KB~2MB大小的块,然后再写入整个页的内容,这就6 T( y+ X# ?: m+ w9 s
    是SSD的写入放大效应。虽然SSD硬件厂商都针对这个问题做了一些优化,但整体上
    " g* A" r% S+ R& L+ x: V# D) w看,随机写入不能发挥SSD的优势。
    2 I/ x0 G8 u/ z1 u1 \# `% R  X; n4 UOceanBase设计之初就认为SSD为大势所趋,整个系统设计时完全摒弃了随机
    # k! {% b, {7 o写,除了操作日志总是顺序追加写入到普通SAS盘上,剩下的写请求都是对响应时间
    / J% {/ J9 j9 L! ]) N, D要求不是很高的批量顺序写,SSD盘可以轻松应对,而大量查询请求的随机读,则发+ z+ z. |& k1 M" @
    挥了SSD良好的随机读的特性。摒弃随机写,采用批量的顺序写,也使得固态盘的使% e2 D- }- e! I% M& T
    用寿命不再成为问题,主流SSD盘使用MLC SSD芯片,而MLC号称可以擦写1万次! e6 J7 }7 }+ k% M
    (SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数6 x% x6 S) ?8 {1 ?% H
    计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。
    ( s$ d5 h; e" U$ f+ W[1]这个机制在Oracle数据库中称为Buffer Cache,在MySQL数据库中称为Buffer Pool," @, W4 N+ x' ~; A4 Y3 c7 m
    用于缓存磁盘中的页面。% `  N" o* Z% E  |$ [
    8.4.7 数据正确性, @8 H; y2 N, q6 s, x: }4 D
    数据丢失或者数据错误对于存储系统来说是一种灾难。前面8.4.1节中已经提) y' O9 ?1 i1 \
    到,OceanBase设计为强一致性系统,设计方案上保证不丢数据。然而,TCP协议传1 \- Z4 u" o: z& ~, p9 X8 i
    输、磁盘读写都可能出现数据错误,程序Bug则更为常见。为了防止各种因素导致的
    - f/ k+ g5 W# d- k数据损毁,OceanBase采取了以下数据校验措施:+ ^% m0 i  x  S) D0 I% S$ ^
    ●数据存储校验。每个存储记录(通常是几KB到几十KB)同时保存64位CRC校6 v( A; h, R( j2 W7 \
    验码,数据被访问时,重新计算和比对校验码。
    7 m( P. ?+ n2 ^+ A●数据传输校验。每个传输记录同时传输64位CRC校验码,数据被接收后,重新8 n, X, j( X, j& k/ e$ \/ f
    计算和比对校验码。3 @* w, y) w5 h/ v2 Z7 g+ x% F
    ●数据镜像校验。UpdateServer在机群内有主UpdateServer和备UpdateServer,集
    2 [; f; M" ^* @1 F' D* U$ f群间有主集群和备集群,这些UpdateServer的内存表(MemTable)必须保持一致。为7 g5 q: h5 W# G4 P% a0 m4 m: C
    此,UpdateServer为MemTable生成一个校验码,MemTable每次更新时,校验码同步
    " w1 `* J# o/ l* ^5 E更新并记录在对应的操作日志中。备UpdateServer收到操作日志并重放到MemTable
    9 f+ z, L" V- v3 U时,也同步更新MemTable校验码并与接收到的校验码对照。UpdateServer重新启动后
    " J- i# T6 @5 b7 ~9 h重放日志恢复MemTable时也同步更新MemTable校验码并与保存在每条操作日志中的
    4 e) q4 m4 H$ `4 l$ h校验码对照。% g! n! J2 k2 L# c2 H5 ^# [
    ●数据副本校验。定期合并时,新的子表由各个ChunkServer独立地融合旧的子表
    7 X' B) y# u& X- Z中的SSTable与冻结的MemTable而生成,如果发生任何异常或者错误(比如程序9 S6 k# z6 [* D; y  O/ o1 M
    bug),同一子表的多个副本可能不一致,则这种不一致可能随着定期合并而逐步累+ X7 I5 `  w* j5 W: T
    积或扩散且很难被发现,即使被察觉,也可能因为需要追溯较长时间而难以定位到
    & l( ]! q  M5 i/ Z* W* [源头。为了防止这种情况出现,ChunkServer在定期合并生成新的子表时,也同时为
    " r9 q; u0 ^0 y: i每个子表生成一个校验码,并随新子表汇报给RootServer,以便RootServer核对同一
    8 p7 e. F% }8 i& C8 G+ ]子表不同副本的校验码。
    , h& x( Q5 A; l  ^8.4.8 分层结构- o& N$ |4 S4 L' C4 C& E
    OceanBase对外提供的是与关系数据库一样的SQL操作接口,而内部却实现成一( C0 {( @+ l! m* t9 \" i
    个线性可扩展的分布式系统。系统从逻辑实现上可以分为两个层次:分布式存储引' I! f. U5 f8 |8 z9 X
    擎层以及数据库功能层。3 i% {, R2 j" N  H2 @8 I
    OceanBase一期只实现了分布式存储引擎,这个存储引擎支持如下特性:, i- z9 |) Z8 p* I5 B- P
    ●支持分布式数据结构,基线数据逻辑上构成一颗分布式B+树,增量数据为内9 J; P: m+ M8 s' J$ Z
    存中的B+树;3 O) D% W% O! Q; d( ~/ V# J
    ●支持目前OceanBase的所有分布式特性,包括数据分布、负载均衡、主备同' n7 Q* M' d7 |* M6 S
    步、容错、自动增加/减少服务器等;
    / p, G) o1 N  }* i( Q●支持根据主键更新、插入、删除、随机读取一条记录,另外,支持根据主键范
    2 U. t8 O& `- I围顺序查找一段范围的记录。! I6 y" I+ V& X& H& ^
    二期的OceanBase版本在分布式存储引擎之上增加了SQL支持:
    6 ]& b1 i5 w9 |; h- H5 X1 o●支持SQL语言以及MySQL协议,MySQL客户端可以直接访问;& d5 r0 C+ _5 ^$ u: |
    ●支持读写事务;* t5 _$ I: t# N# d+ O( C( }! X0 s
    ●支持多版本并发控制;
    4 ]9 r1 E5 i+ W) O●支持读事务并发执行。
      ]& P. K9 r) J% x( ?从另外一个角度看,OceanBase融合了分布式存储系统和关系数据库这两种技
    8 E  u9 i- v8 N* L. U6 f6 }1 o9 m( ?术。通过分布式存储技术将基线数据分布到多台ChunkServer,实现数据复制、负载+ P1 A$ T: f- b* V) x
    均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数
    9 h: @% j" G$ m1 F! R. R据库,底层采用关系数据库技术实现。我们后来发现,有一个号称“世界上最快的内
    1 ^/ N8 \' {3 J- n) U( X* X; |存数据库”MemSQL采用了和OceanBase UpdateServer类似的设计,在拥有64个CPU核
    # @& ]" ~# X. F  Z$ i/ u% S2 N心的服务器上实现了每秒150万次单行写事务。OceanBase相当于
    2 x) a) J" y8 h9 T: hGFS+MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是+ i3 M2 A. B0 g& G. a
    成为可扩展的、支持每秒百万级单行事务操作的分布式数据库。
    , `( Y3 @' n7 Q* `5 s" o* ]后续将分为两章,分别讲述OceanBase分布式存储引擎层以及数据库功能层的实7 c8 y. X, ?, D/ u- ]
    现细节。0 Q6 g, g# Y( Y+ q

    9 g5 g) a' l; E) V8 Y  S
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-4-1 14:07 , Processed in 0.242778 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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