|
8.4 架构剖析
( [0 O5 E' P5 V, \- b/ N6 I! n- Y8.4.1 一致性选择; D4 c3 E' k& d) h' R
Eric Brewer教授的CAP理论指出,在满足分区可容忍性的前提下,一致性和可
; @1 F9 `; n! F) O5 }用性不可兼得。
' D% ^% ^ c' }* M4 b虽然目前大量的互联网项目选择了弱一致性,但我们认为这是底层存储系统,+ C X6 L/ h# P/ l7 z
比如MySQL数据库,在大数据量和高并发需求压力之下的无奈选择。弱一致性给应- \4 i' ~: Z( g( n0 F3 G
用带来了很多麻烦,比如数据不一致时需要人工订正数据。如果存储系统既能够满
1 b# ?- f0 s- ^$ s5 V5 p' j1 p' d足大数据量和高并发的需求,又能够提供强一致性,且硬件成本相差不大,用户将! g7 M+ Y% ~6 A% P. s# o4 F' Y8 A
毫不犹豫地选择它。强一致性将大大简化数据库的管理,应用程序也会因此而简
/ r/ @& p: A M化。因此,OceanBase选择支持强一致性和跨行跨表事务。0 C" ~8 W) ^3 L2 J$ v3 j
OceanBase UpdateServer为主备高可用架构,修改操作流程如下:% d) \) a o, t/ j9 Z; }9 G
1)将修改操作的操作日志(redo日志)发送到备机;+ k9 h& K6 s% Y& t5 T
2)将修改操作的操作日志写入主机硬盘;
/ U0 X' R3 K6 h3 i# p0 f' H3)将操作日志应用到主机的内存表中;
) \( ]! g4 N; C3 t4)返回客户端写入成功。. Y2 H4 [ i' q8 g$ a0 P2 \; e
OceanBase要求将操作日志同步到主备的情况下才能够返回客户端写入成功,即6 m: s0 B( j+ n9 C3 a# z' N
使主机出现故障,备机自动切换为主机,也能够保证新的主机拥有以前所有的修改
, [" Q! H7 [9 H3 E0 `+ H! a2 `4 B操作,严格保证数据不丢失。另外,为了提高可用性,OceanBase还增加了一种机 Q, _( W9 w4 I( F2 B" f. U
制,如果主机往备机同步操作日志失败,比如备机故障或者主备之间网络故障,主# Z2 M% W( t- z) A
机可以将备机从同步列表中剔除,本地更新成功后就返回客户端写入成功。主机将6 c) m3 H S& a$ g1 [. L. s ?/ y* W1 s
备机剔除前需要通知RootServer,后续如果主机故障,RootServer能够避免将不同步! i" f0 u- A" C \: a
的备机切换为主机。) {/ W& V! z. W! t" A% V1 O- q" B
OceanBase的高可用机制保证主机、备机以及主备之间网络三者之中的任何一个
* ~! _& i; U1 Y3 h1 g/ b5 {* L出现故障都不会对用户产生影响,然而,如果三者之中的两个同时出现故障,系统
5 o' O, U0 ?# F1 e) U8 N7 c可用性将受到影响,但仍然保证数据不丢失。如果应用对可用性要求特别高,可以
7 \' B( L# K% R增加备机数量,从而容忍多台机器同时出现故障的情况。5 }- Z! K4 K/ P9 j0 ~- j/ L3 j
OceanBase主备同步也允许配置为异步模式,支持最终一致性。这种模式一般用9 K) c6 e1 G' l. b
来支持异地容灾。例如,用户请求通过杭州主站的机房提供服务,主站的
$ f$ B; V- i7 ~7 w, l# I9 aUpdateServer内部有一个同步线程不停地将用户更新操作发送到青岛机房。如果杭州, h @; I$ F& U `4 ]
机房整体出现不可恢复的故障,比如地震,还能够通过青岛机房恢复数据并继续提7 `, y0 V& G0 b! n) o' w
供服务。* _4 r7 N9 r, i) O1 A- C
另外,OceanBase所有写事务最终都落到UpdateServer,而UpdateServer逻辑上是8 H% b& w& H) `# y& A. n: |5 q
一个单点,支持跨行跨表事务,实现上借鉴了传统关系数据库的做法。 e# \. Z# C! @3 q
8.4.2 数据结构5 [" K, y* X$ G" f
OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台! e6 j( g9 {. e
ChunkServer上,增量数据全部存放在一台UpdateServer上。如图8-5所示,系统中有5
6 ~+ s1 ~1 I* q; }/ h# n个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer上。RootServer中维
9 K' X# m* G: j1 X6 W护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量9 q j* v) B; R3 N' c* [7 Y) h
更新。8 K) a9 e% q! f* a+ l$ X1 ~
图 8-5 OceanBase数据结构& C. `3 S4 N0 c# I9 |4 P9 b- U6 M
不考虑数据复制,基线数据的数据结构如下: I% a- Y8 I; x3 i9 C
●每个表格按照主键组成一颗分布式B+树,主键由若干列组成;) \9 W- J/ Z; t0 t9 B- I! n
●每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;
$ E6 J* i' p: x) R# Z( y' A' f●每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;
- p& H# U: [7 C) w$ p●每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block
5 p' b0 i7 f" D$ Gindex);
. P1 C) }7 j* ^" E●每个块的大小通常在4~64KB之间并内建块内的行索引;
* P. b& r$ S$ q, Z●数据压缩以块为单位,压缩算法由用户指定并可随时变更;
( o6 j) l- } m3 d●叶子节点可能合并或者分裂;) N: t' _# p) G( S
●所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;$ ~* V9 L6 U7 x; w* g' W+ K
●通常情况下每个叶子节点有2~3个副本;! o7 L1 d! J# |7 f! l' F
●叶子节点是负载平衡和任务调度的基本单元;
; A' z \" m+ R6 o% m●支持布隆过滤器的过滤。4 R0 |" \2 p1 i. F S' q
增量数据的数据结构如下:( a1 X5 o1 @+ @7 G' [9 r
●增量数据按照时间从旧到新划分为多个版本;
% K* H0 P& G( G) p9 o! V' u) @& R●最新版本的数据为一颗内存中的B+树,称为活跃MemTable;& |5 ~' `6 R3 d8 t7 ^& t
●用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable+ u( E: g6 k$ r% X/ u$ N$ y( v
将被冻结,并开启新的活跃MemTable接受修改操作;
8 C7 _8 @/ _! B7 |( Z# A2 M! d●冻结的MemTable将以SSTable的形式转储到SSD中持久化;
$ S$ z+ j" `! _- | \: n$ r) R●每个SSTable内部按主键范围有序划分为多个块并内建块索引,每个块的大小! w9 p! D% e4 Z: D( s j* H
通常为4~8KB并内建块内行索引,一般不压缩;
; Z( J; z/ f7 U●UpdateServer支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。
`$ [% f! a3 y6 G: E$ q3 N8.4.3 可靠性与可用性. o5 O* l. j2 J5 d
分布式系统需要处理各种故障,例如,软件故障、服务器故障、网络故障、数
; g, |" ^' U+ C1 ^/ K% x( x据中心故障、地震、火灾等。与其他分布式存储系统一样,OceanBase通过冗余的方 w3 J, l8 D' _4 ` \
式保障了高可靠性和高可用性。方法如下所示:
+ u; d/ b/ I8 A0 `●OceanBase在ChunkServer中保存了基线数据的多个副本。单集群部署时一般会) Q+ e, t4 _1 G, ^" P9 B' E) A
配置3个副本;主备集群部署时一般会配置每个集群2个副本,总共4个副本。
9 r7 Z0 c3 I# O$ c4 E1 j# {# b●OceanBase在UpdateServer中保存了增量数据的多个副本。UpdateServer主备模6 j3 P( P" `& N7 o6 I$ T
式下主备两台机器各保存一个副本,另外,每台机器都通过软件的方式实现了2 I" D8 C$ C: d' t! M
RAID1,将数据自动复制到多块磁盘,进一步增强了可靠性。
6 ~8 {2 o' T' x( M8 O●ChunkServer的多个副本可以同时提供服务。Bigtable以及HBase这样的系统服务 G- ^2 K; T! w, o- f8 @
节点不冗余,如果服务器出现故障,需要等待其他节点恢复成功才能提供服务,而
; D$ a$ v! Y2 T4 {2 J/ ROceanBase多个ChunkServer的子表副本数据完全一致,可以同时提供服务。0 u8 U6 M" J8 j
●UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写3 _9 v; ]. G, q% |: v0 V% q
服务。如果主UpdateServer发生故障,OceanBase能够在几秒中之内(一般为3~5
. |% F P, |3 r; w; M; p) M秒)检测到并将服务切换到备机,备机几乎没有预热时间。
3 H: e2 P1 x$ U0 K●OceanBase存储多个副本并没有带来太多的成本。当前的主流服务器的磁盘容' Y* B1 G7 E, e% U: |
量通常是富余的,例如,300GB×12或600GB×12的服务器有3TB或6TB左右的磁盘总
H. P7 M, q3 [9 i/ t, o n容量,但存储系统单机通常只能服务少得多的数据量。' Z& j5 [5 G8 N/ n
8.4.4 读写事务; X% Q/ P& A3 O) T* N: x" N. m
在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。
( |; T* Y' e1 F( \' d9 ^MergeServer解析这些读写事务的内容,例如词法和语法分析、schema检查等。对于
" \/ o R, m5 N% Y; F' @只读事务,由MergeServer发给相应的ChunkServer分别执行后再合并每个ChunkServer$ C. x# P# e* H, s. e) u: U/ A
的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执
9 s3 n g1 E' [; V5 R1 l行。
3 [ i3 g, j# Y& G5 L! Q5 x只读事务执行流程如下:$ v/ h# z7 F2 _% {" F! R; u7 c
1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检
7 c i) ~0 H. u, q9 I查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。& o: V3 L2 `/ M Q: U& I
2)如果SQL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台
/ V X4 K5 p: f: n: U3 D" iChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由
3 @% x" X- m- n) x# n4 f! RMergeServer来执行结果合并。6 b: y, a" H$ d3 R, y7 Q
3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操+ x" l6 N9 R4 \$ Q! d. f8 N$ d
作。
; h& p( g" s6 j! F- E4)MergeServer将最终结果返回给客户端。
2 j) @& G# M0 q! B2 c% b读写事务执行流程如下:
2 Q) }, D- h& S1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。
) I5 x3 A# a! [' O' e; B$ v2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和' ?) y# x7 c" i# T
基线数据一起传给UpdateServer。
% S( |1 g" j6 l% q3)UpdateServer根据物理执行计划执行读写事务,执行过程中需要使用
. Y& H5 c: K* v7 jMergeServer传入的基线数据。- T9 ?& M! Q9 l
4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作3 Y- |) |! z( R& z+ l
结果返回客户端。
; f. Y2 [1 A" q2 t6 S3 l例如,假设某SQL语句为:"update t1 set c1=c1+1 where rowkey=1",即将表格t1 `. c* [; w2 A! W. d3 x. ~
中主键为1的c1列加1,这一行数据存储在ChunkServer中,c1列的值原来为2012。那
0 p, O. [2 V3 R& m; r; i3 y么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将
+ s/ X$ T0 E, u3 D+ ~读取结果(c1=2012)以及SQL语句的物理执行计划一起发送给UpdateServer。
( G8 u8 Z1 O# \8 RUpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表
4 M, T5 j. P. U- ]6 c1 a(MemTable)中。当然,更新内存表之前需要记录操作日志。
: c% p- `! B4 [: M- m7 U9 O- _8.4.5 单点性能
' N( Q' _0 T3 I9 q* cOceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。4 f' i& w4 K& t( f$ G7 m3 R
当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了
% r' E3 ~$ R) R# a' LOceanBase集群的整体读写性能。
+ S* i' A! T* @& j5 q* }: {+ u; V7 x下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大
0 B0 G' }; T/ v/ l3 ^部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几
. c' v) [% J0 l& k$ {; b8 w% L亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几
& x0 y, s7 \$ g& c( f/ l十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,
" A+ }2 U* L0 B6 k每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿3 J# e* P" q! A9 _ ~0 e' ]6 ~: X
×100+1000万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当
( ^0 p; l) r! ?前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、
5 n( b, d5 q: e) F# ?384GB乃至更多内存。1 L( ~% U0 h- j. f% |0 x. f% |
从上面的分析可以看出,UpdateServer的内存容量一般不会成为瓶颈。然而,服
% y4 y+ @2 @5 k8 y# u务器的内存毕竟有限,实际应用中仍然可能出现修改量超出内存的情况。例如,淘& X! u1 w, S) G8 t& ~7 I9 m
宝双11网购节数据库修改量暴涨,某些特殊应用每天的修改次数特别多或者每次修8 ^- B3 G7 [) }
改的数据量特别大,DBA数据订正时一次性写入大量数据。为此,UpdateServer设计6 y, D3 D) |" x1 E
实现了几种方式解决内存容量问题,UpdateServer的内存表达到一定大小时,可自动1 X$ L! o* f8 f( t
或者手工冻结并转储到SSD中,另外,OceanBase支持通过定期合并或者数据分发的, _% H2 g* f( c9 n. v
方式将UpdateServer的数据分散到集群中所有的ChunkServer机器中,这样不仅避免了
) r% J3 H/ F% I7 H0 [4 @UpdateServer单机数据容量问题,还能够使得读取操作往往只需要访问UpdateServer) w5 P0 \3 `! N' b: r8 |
内存中的数据,避免访问SSD磁盘,提高了读取性能。% o4 i% \( E2 t. a+ i: G
从网络角度看,假设每秒的读取次数为20万次,每次需要从UpdateServer中获取4 b3 t/ y& ~* h$ l3 W6 D$ n
100字节,那么,读取操作占用的UpdateServer出口带宽为:20万×100=20MB,远远
4 a: Q, b. b6 V2 S9 J3 a没有达到千兆网卡带宽上限。另外,UpdateServer还可以配置多块千兆网卡或者万兆
, x9 U' h( a |1 j5 @) r1 v* J网卡,例如,OceanBase线上集群一般给UpdateServer配置4块千兆网卡。当然,如果
6 [$ Q( \+ L U1 A. J. N软件层面没有做好,硬件特性将得不到充分发挥。针对UpdateServer全内存、收发的4 j% n0 k% I& f! D) h$ S/ p
网络包一般比较小的特点,开发团队对UpdateServer的网络框架做了专门的优化,大; Q4 \8 t/ a6 n4 N0 H
大提高了每秒收发网络包的个数,使得网络不会成为瓶颈。& D( h, _; p4 i) r
从磁盘的角度看,数据库事务需要首先将操作日志写入磁盘。如果每次写入都
) M9 v# g* w/ {: M( \需要将数据刷入磁盘,而一块SAS磁盘每秒支持的IOPS很难超过300,磁盘将很快成
; [$ R2 n& ]: u- M: T) M$ _为瓶颈。为了解决这个问题,UpdateServer在硬件上会配置一块带有缓存模块的RAID; |1 e: ^2 g+ Q) B$ J8 f7 {
卡,UpdateServer写操作日志只需要写入到RAID卡的缓存模块即可,延时可以控制在. A' ~, A$ t+ f* @
1毫秒之内。RAID卡带电池,如果UpdateServer发生故障,比如机器突然停电,RAID( x! a! W4 S% Z$ M. e
卡能够确保将缓存中的数据刷入磁盘,不会出现丢数据的情况。另外,UpdateServer
3 W% r) J5 ?0 S. h$ R$ P- `还实现了写事务的成组提交机制,将多个用户写操作凑成一批一次性提交,进一步) g. D( s: q( ?+ f% C) h1 T) s
减少磁盘IO次数。
7 E# v7 S% Y' ?0 _& S/ y8.4.6 SSD支持
1 W$ V. [' F8 H/ b: O5 k7 C磁盘随机IO是存储系统性能的决定因素,传统的SAS盘能够提供的IOPS不超过
7 p* V* {7 a- s% @/ K, V8 F300。关系数据库一般采用高速缓存(Buffer Cache) [1] 的方式缓解这个问题,读取操4 W U0 N6 r1 c E' j: P$ @
作将磁盘中的页面缓存到高速缓存中,并通过LRU或者类似的方式淘汰不经常访问
/ u/ K0 }- y& v的页面;同样,写入操作也是将数据写入到高速缓存中,由高速缓存按照一定的策
* q! ~- `1 p! C' t- U1 O# ^, O7 d: q略将内存中页面的内容刷入磁盘。这种方式面临一些问题,例如,Cache冷启动问% l3 P- l& k2 Z6 K* n- p+ i
题,即数据库刚启动时性能很差,需要将读取流量逐步切入。另外,这种方式不适7 S( ~) A7 P9 E1 @9 t
合写入特别多的场景。
) G( m7 i4 B4 k# R* `最近几年,SSD磁盘取得了很大的进展,它不仅提供了非常好的随机读取性能,
`, p$ Q$ Z8 j& t! \+ ?功耗也非常低,大有取代传统机械磁盘之势。一块普通的SSD磁盘可以提供35000
: ?, q3 Q6 I$ f: P' m( IIOPS甚至更高,并提供300MB/s或以上的读出带宽。然而,SSD盘的随机写性能并不- d* G! h" k$ l6 g: ~$ k# t9 l+ N! H
理想。这是因为,尽管SSD的读和写以页(page,例如4KB,8KB等)为单位,但2 G9 `" ^: h+ T- b7 w0 Y
SSD写入前需要首先擦除已有内容,而擦除以块(block)为单位,一个块由若干个 j' \& t: L# G* Z3 S
连续的页组成,大小通常在512KB~2MB。假如写入的页有内容,即使只写入一个
0 @+ S, g4 C: O% g, F! n字节,SSD也需要擦除整个512KB~2MB大小的块,然后再写入整个页的内容,这就
5 e* _! H# t3 R$ P, h2 f" L$ z8 u l是SSD的写入放大效应。虽然SSD硬件厂商都针对这个问题做了一些优化,但整体上* y+ \( o/ I( R
看,随机写入不能发挥SSD的优势。2 w% v5 H) M+ a; H9 f- h8 F+ Y
OceanBase设计之初就认为SSD为大势所趋,整个系统设计时完全摒弃了随机) E/ h, S3 n) E: ~0 m+ R# h9 V+ K
写,除了操作日志总是顺序追加写入到普通SAS盘上,剩下的写请求都是对响应时间0 V6 Y' P. k- Z2 W: o% P6 P9 C
要求不是很高的批量顺序写,SSD盘可以轻松应对,而大量查询请求的随机读,则发
3 j4 [4 T. ^6 _& b挥了SSD良好的随机读的特性。摒弃随机写,采用批量的顺序写,也使得固态盘的使' I4 g) z9 }6 q# q
用寿命不再成为问题,主流SSD盘使用MLC SSD芯片,而MLC号称可以擦写1万次1 R# z* O: i- [5 O/ O# t- q
(SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数+ U0 j, p! n* n. z1 z3 n1 J6 l2 G
计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。! A' {# q. n) _9 e$ u
[1]这个机制在Oracle数据库中称为Buffer Cache,在MySQL数据库中称为Buffer Pool,
* ?& a+ Q1 _9 r. r" Y8 Y用于缓存磁盘中的页面。
: G4 I# C% Y8 Q% p, M% `. M2 L8.4.7 数据正确性
" V& t4 l! c7 I5 D5 N7 X# k数据丢失或者数据错误对于存储系统来说是一种灾难。前面8.4.1节中已经提
* d3 s; a( N/ ]0 P到,OceanBase设计为强一致性系统,设计方案上保证不丢数据。然而,TCP协议传
& o* f N+ O. H! |9 B输、磁盘读写都可能出现数据错误,程序Bug则更为常见。为了防止各种因素导致的! Y3 o" ~7 Q! q% k; H9 U* J8 V
数据损毁,OceanBase采取了以下数据校验措施:6 X1 h W# _; i
●数据存储校验。每个存储记录(通常是几KB到几十KB)同时保存64位CRC校/ g" o o' s- W3 T$ ~
验码,数据被访问时,重新计算和比对校验码。$ N! [: _0 B. A' r2 a3 H
●数据传输校验。每个传输记录同时传输64位CRC校验码,数据被接收后,重新
; S% a5 q5 D* x7 k" l- f$ M计算和比对校验码。2 k& F! G: ^- G5 T/ D1 L6 z
●数据镜像校验。UpdateServer在机群内有主UpdateServer和备UpdateServer,集3 ]) `% u& H' ~
群间有主集群和备集群,这些UpdateServer的内存表(MemTable)必须保持一致。为
/ l! f1 o8 U+ N9 G( N此,UpdateServer为MemTable生成一个校验码,MemTable每次更新时,校验码同步
' ?1 T) m/ o3 r. f3 N! j4 U9 @更新并记录在对应的操作日志中。备UpdateServer收到操作日志并重放到MemTable8 O$ v+ t* J/ c* g3 h( R
时,也同步更新MemTable校验码并与接收到的校验码对照。UpdateServer重新启动后
) s8 {. P. M+ M* c* ]6 V- _重放日志恢复MemTable时也同步更新MemTable校验码并与保存在每条操作日志中的$ ]! V0 R$ l% ?3 m9 x
校验码对照。& P! k" _+ l0 w$ P# c F# `
●数据副本校验。定期合并时,新的子表由各个ChunkServer独立地融合旧的子表4 @9 T5 H4 b. Y
中的SSTable与冻结的MemTable而生成,如果发生任何异常或者错误(比如程序8 x" b( E- Y) t3 A% s
bug),同一子表的多个副本可能不一致,则这种不一致可能随着定期合并而逐步累
+ ?& {5 k+ Z8 v/ k% j# i; n积或扩散且很难被发现,即使被察觉,也可能因为需要追溯较长时间而难以定位到6 B, {+ l: a |. o k
源头。为了防止这种情况出现,ChunkServer在定期合并生成新的子表时,也同时为
2 P: l# R# T% g( x+ A每个子表生成一个校验码,并随新子表汇报给RootServer,以便RootServer核对同一
: P' L1 } z. \5 S# | D子表不同副本的校验码。; ?* L0 N- M0 ~+ d* a
8.4.8 分层结构
' g4 k6 I1 v# @4 X% AOceanBase对外提供的是与关系数据库一样的SQL操作接口,而内部却实现成一7 ^! c1 g7 H d G" Q* t
个线性可扩展的分布式系统。系统从逻辑实现上可以分为两个层次:分布式存储引1 I- b! {- l: j0 V7 O
擎层以及数据库功能层。
+ e9 d0 M5 i \2 i& e x ?/ {OceanBase一期只实现了分布式存储引擎,这个存储引擎支持如下特性:3 j; c" `# K U9 h2 X
●支持分布式数据结构,基线数据逻辑上构成一颗分布式B+树,增量数据为内
1 K- f4 m4 P8 O1 S- b: M存中的B+树;" R9 }# ~: D. B% B% ~+ R
●支持目前OceanBase的所有分布式特性,包括数据分布、负载均衡、主备同
+ X: Z) t5 g3 F步、容错、自动增加/减少服务器等;
" I# l6 ]4 n5 k# H+ N- K●支持根据主键更新、插入、删除、随机读取一条记录,另外,支持根据主键范
8 _( `0 g) a& p, B) @+ S5 S围顺序查找一段范围的记录。- K1 K% F& B; K. q! B: n0 d7 D
二期的OceanBase版本在分布式存储引擎之上增加了SQL支持:
9 p# M1 [) I+ X. C●支持SQL语言以及MySQL协议,MySQL客户端可以直接访问;
6 U, z% E( b! b! D3 F6 d●支持读写事务;
' {9 d. S: _! ]( u$ | c●支持多版本并发控制;
% ^, I0 i( M7 x; ~( Z●支持读事务并发执行。/ C0 y$ ^8 i. Y9 {
从另外一个角度看,OceanBase融合了分布式存储系统和关系数据库这两种技
+ K4 ]' [( v% P# L5 T术。通过分布式存储技术将基线数据分布到多台ChunkServer,实现数据复制、负载
1 _ S: b6 y, T5 c' x均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数
* J# s/ x U( r/ E据库,底层采用关系数据库技术实现。我们后来发现,有一个号称“世界上最快的内
2 C, A. p; M+ J! ]) a, M$ o存数据库”MemSQL采用了和OceanBase UpdateServer类似的设计,在拥有64个CPU核
# C1 g9 s" \# S5 J心的服务器上实现了每秒150万次单行写事务。OceanBase相当于
) k! ~' j" |* {2 ~! bGFS+MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是
$ a- R) `; A. n: {成为可扩展的、支持每秒百万级单行事务操作的分布式数据库。
0 X9 l8 I) t z. I6 }$ `后续将分为两章,分别讲述OceanBase分布式存储引擎层以及数据库功能层的实
3 k. M% ]$ v* ?7 H% f现细节。5 f8 w- W9 E/ @& Y
! q9 `' _) w4 S6 G0 J3 k' i |
|