|
8.4 架构剖析. y# _: S/ k/ p
8.4.1 一致性选择
! x' ]3 [6 K0 A% U( R' GEric Brewer教授的CAP理论指出,在满足分区可容忍性的前提下,一致性和可8 K& U. T9 q' h7 ^, S. z
用性不可兼得。
, A$ p# V: `, X# c0 g虽然目前大量的互联网项目选择了弱一致性,但我们认为这是底层存储系统,
3 f3 n" a8 {# N7 t9 I. e! b比如MySQL数据库,在大数据量和高并发需求压力之下的无奈选择。弱一致性给应
* L) ?# q* y7 Y8 l5 y' R: h' \7 {用带来了很多麻烦,比如数据不一致时需要人工订正数据。如果存储系统既能够满
, t! l% @/ t! F) Y; N' m9 t! s足大数据量和高并发的需求,又能够提供强一致性,且硬件成本相差不大,用户将
" m+ F; {" t+ a% [+ x+ n8 Y毫不犹豫地选择它。强一致性将大大简化数据库的管理,应用程序也会因此而简
' B& _! c8 {2 E7 z; ?化。因此,OceanBase选择支持强一致性和跨行跨表事务。
; C6 r( J- r; Z( k) N6 ?1 IOceanBase UpdateServer为主备高可用架构,修改操作流程如下:
0 a; o# H0 [' n; S, Z1)将修改操作的操作日志(redo日志)发送到备机;
- _. a1 D9 V2 U7 i0 A9 j( P2)将修改操作的操作日志写入主机硬盘;
+ H) A1 m8 s2 I! B1 g7 ]3)将操作日志应用到主机的内存表中;
3 z3 u% n7 i' O' E4)返回客户端写入成功。
1 s e1 A0 K$ d0 TOceanBase要求将操作日志同步到主备的情况下才能够返回客户端写入成功,即: W8 |4 q D( ]' g. [
使主机出现故障,备机自动切换为主机,也能够保证新的主机拥有以前所有的修改
( {; v& c& e3 s操作,严格保证数据不丢失。另外,为了提高可用性,OceanBase还增加了一种机) V2 c+ F& R! ^# U1 e) F k$ @+ v1 Y
制,如果主机往备机同步操作日志失败,比如备机故障或者主备之间网络故障,主, q/ ?* ~. A$ V/ j* A# H9 ^6 I
机可以将备机从同步列表中剔除,本地更新成功后就返回客户端写入成功。主机将
$ @! I/ N; h9 J4 d备机剔除前需要通知RootServer,后续如果主机故障,RootServer能够避免将不同步
, M9 {2 z; o0 h: x+ J: f/ S的备机切换为主机。
/ u$ z' F4 `' a' |3 WOceanBase的高可用机制保证主机、备机以及主备之间网络三者之中的任何一个: N% C" r: N9 K
出现故障都不会对用户产生影响,然而,如果三者之中的两个同时出现故障,系统
- X9 G: M2 e& N- e# A可用性将受到影响,但仍然保证数据不丢失。如果应用对可用性要求特别高,可以% W6 V% C) T- P5 U& e. u
增加备机数量,从而容忍多台机器同时出现故障的情况。
+ U7 u5 ?) B. ?OceanBase主备同步也允许配置为异步模式,支持最终一致性。这种模式一般用3 P2 t! x* _! f2 T! s( x8 W
来支持异地容灾。例如,用户请求通过杭州主站的机房提供服务,主站的4 u7 p% b1 T+ }: F% v5 u
UpdateServer内部有一个同步线程不停地将用户更新操作发送到青岛机房。如果杭州
# R8 c0 N7 p" U% a机房整体出现不可恢复的故障,比如地震,还能够通过青岛机房恢复数据并继续提# B. h) X( X; y; ` L' H% Y
供服务。5 ~7 r; |8 u- o5 t( i0 ]( B7 v2 u$ [
另外,OceanBase所有写事务最终都落到UpdateServer,而UpdateServer逻辑上是
( v: O! i/ z4 }) k. h! Y& \2 C一个单点,支持跨行跨表事务,实现上借鉴了传统关系数据库的做法。
: A# d" I$ c" H; x B0 Y! X6 `, N8.4.2 数据结构+ q# n- u. Q! ]4 w! n6 w1 j) p) f
OceanBase数据分为基线数据和增量数据两个部分,基线数据分布在多台
' _8 u3 u% T! e7 eChunkServer上,增量数据全部存放在一台UpdateServer上。如图8-5所示,系统中有5% V, \0 n" o3 |0 T4 J5 A
个子表,每个子表有3个副本,所有的子表分布到4台ChunkServer上。RootServer中维
* W5 ]* V3 i2 B% E% k+ N6 j$ R护了每个子表所在的ChunkServer的位置信息,UpdateServer存储了这5个子表的增量
: S& f& k7 O# D2 `) d1 f, X更新。
, ], e$ b K& H* F5 T+ `图 8-5 OceanBase数据结构2 t B, z* Z) V, U! ?8 N1 P9 y
不考虑数据复制,基线数据的数据结构如下:: ^& K' N" z1 G, ]6 j; W. S
●每个表格按照主键组成一颗分布式B+树,主键由若干列组成;
7 [8 V6 f- e6 S( m9 T! F e. g●每个叶子节点包含表格一个前开后闭的主键范围(rk1,rk2]内的数据;$ L7 R+ { d# l4 ]( A& ~- _
●每个叶子节点称为一个子表(tablet),包含一个或者多个SSTable;
0 H- V, W: F* r●每个SSTable内部按主键范围有序划分为多个块(block)并内建块索引(block
/ c4 U+ n5 N) Z1 d' jindex);
. r2 G, U5 x4 w6 ~) W) ~7 k●每个块的大小通常在4~64KB之间并内建块内的行索引;' F3 W2 R8 n& J; w. ?
●数据压缩以块为单位,压缩算法由用户指定并可随时变更;, q4 G, \3 d" c2 [' b
●叶子节点可能合并或者分裂;8 T4 ~0 u1 V& s1 ^8 \* Z
●所有叶子节点基本上是均匀的,随机地分布在多台ChunkServer机器上;4 j$ h) c% J- u2 f- s9 s5 w
●通常情况下每个叶子节点有2~3个副本;& ]' U7 M5 @ t& F3 m9 ^
●叶子节点是负载平衡和任务调度的基本单元;* H' T0 m0 S+ W. P; h2 A4 z0 L- q& f
●支持布隆过滤器的过滤。
( g" D' z/ i; l; K增量数据的数据结构如下:
% k& i+ \% E; n2 b3 S●增量数据按照时间从旧到新划分为多个版本;& y x* A" y, o0 @; c, s
●最新版本的数据为一颗内存中的B+树,称为活跃MemTable;" Q+ s/ n" @* Z: E: H8 e3 {9 x
●用户的修改操作写入活跃MemTable,到达一定大小后,原有的活跃MemTable1 \+ Q$ u6 l _$ U- U4 n5 t' l1 h
将被冻结,并开启新的活跃MemTable接受修改操作; E8 V, h7 R9 {/ b3 D' z1 `5 D
●冻结的MemTable将以SSTable的形式转储到SSD中持久化;' D& O! d- D# a( s5 i0 e) T
●每个SSTable内部按主键范围有序划分为多个块并内建块索引,每个块的大小# D i6 {& w' _! O1 q
通常为4~8KB并内建块内行索引,一般不压缩;% B7 S5 C$ j1 n" b5 z d
●UpdateServer支持主备,增量数据通常为2个副本,每个副本支持RAID1存储。
. C$ c* `1 x/ y4 p" t* Q6 S% s7 T8.4.3 可靠性与可用性6 l8 n# D7 k/ u" T* E
分布式系统需要处理各种故障,例如,软件故障、服务器故障、网络故障、数- T+ ]* ^7 ~4 p+ J+ }$ ^
据中心故障、地震、火灾等。与其他分布式存储系统一样,OceanBase通过冗余的方4 K7 h7 o( i* t+ s
式保障了高可靠性和高可用性。方法如下所示:! O! p" C1 j5 d+ @# C& d m
●OceanBase在ChunkServer中保存了基线数据的多个副本。单集群部署时一般会) Q, S& Z1 S+ `- k! _6 Z
配置3个副本;主备集群部署时一般会配置每个集群2个副本,总共4个副本。5 I2 ?7 W3 J+ ^( k
●OceanBase在UpdateServer中保存了增量数据的多个副本。UpdateServer主备模" S+ f/ Z5 i& ~8 q1 o% y
式下主备两台机器各保存一个副本,另外,每台机器都通过软件的方式实现了& x' S7 b( C0 m, M! S0 l8 t2 N
RAID1,将数据自动复制到多块磁盘,进一步增强了可靠性。
5 ]" U* F% F& t6 O; [. u3 G) |●ChunkServer的多个副本可以同时提供服务。Bigtable以及HBase这样的系统服务# z# j- X2 Q% d" B: @
节点不冗余,如果服务器出现故障,需要等待其他节点恢复成功才能提供服务,而+ H) E! \) ~+ j6 s9 x; l' d. |
OceanBase多个ChunkServer的子表副本数据完全一致,可以同时提供服务。
9 G! d9 U9 @3 V0 n# v●UpdateServer主备之间为热备,同一时刻只有一台机器为主UpdateServer提供写2 S: g. k5 H& T& j2 g
服务。如果主UpdateServer发生故障,OceanBase能够在几秒中之内(一般为3~56 ^3 B5 @1 I" k/ [" g/ i. [2 [6 ]
秒)检测到并将服务切换到备机,备机几乎没有预热时间。2 ~5 R9 ^6 C& B0 ~! Q' W
●OceanBase存储多个副本并没有带来太多的成本。当前的主流服务器的磁盘容/ w; d1 V+ L# j
量通常是富余的,例如,300GB×12或600GB×12的服务器有3TB或6TB左右的磁盘总' A {0 Q' g6 m R- ` }- g* ]
容量,但存储系统单机通常只能服务少得多的数据量。9 f* Y( `; N& W1 q* c9 g! }
8.4.4 读写事务
% |; A, K. p) c% x; O0 I& ^* n! _) d" p在OceanBase系统中,用户的读写请求,即读写事务,都发给MergeServer。6 U8 r+ G0 i6 }+ I: M% C1 w
MergeServer解析这些读写事务的内容,例如词法和语法分析、schema检查等。对于) k% m) Y( i. F% M+ C+ P, Q
只读事务,由MergeServer发给相应的ChunkServer分别执行后再合并每个ChunkServer
" q% B! b* Z6 {* @的执行结果;对于读写事务,由MergeServer进行预处理后,发送给UpdateServer执
; l" }* S W5 b6 }行。6 f& ?. v9 K) h1 t/ b7 I5 `
只读事务执行流程如下:( i9 [' Q; \6 i5 {
1)MergeServer解析SQL语句,词法分析、语法分析、预处理(schema合法性检
! \3 J2 }% v) N查、权限检查、数据类型检查等),最后生成逻辑执行计划和物理执行计划。/ l. ~' \% ?8 Q3 Q" K
2)如果SQL请求只涉及单张表格,MergeServer将请求拆分后同时发给多台- F" s4 T" q; W& W1 @
ChunkServer并发执行,每台ChunkServer将读取的部分结果返回MergeServer,由
/ Q, d* A0 E, X$ }2 u, }* |8 K2 bMergeServer来执行结果合并。; E1 S/ l6 u% N/ t
3)如果SQL请求涉及多张表格,MergeServer还需要执行联表、嵌套查询等操) j) O$ c1 p5 j7 T( y. v
作。; w0 P y I9 y+ i4 f- b2 Y6 B
4)MergeServer将最终结果返回给客户端。
! M1 \9 E$ ?( h7 h8 |/ U读写事务执行流程如下:+ t& V2 u) k, A& X$ r. F+ i& a6 }! t9 U
1)与只读事务相同,MergeServer首先解析SQL请求,得到物理执行计划。2 P4 Y* I. l+ T J% u- A
2)MergeServer请求ChunkServer获取需要读取的基线数据,并将物理执行计划和2 T2 P- z% {( H! |" m& C
基线数据一起传给UpdateServer。
( n+ X, c+ ]6 n( n1 Z5 w3)UpdateServer根据物理执行计划执行读写事务,执行过程中需要使用% l$ @2 Z8 [1 e2 S3 U6 c
MergeServer传入的基线数据。
. D4 V% c2 R2 V4)UpdateServer返回MergeServer操作成功或者失败,MergeServer接着会把操作
. p! }' c# {7 `" h I5 r结果返回客户端。; Z& n* A+ ?# T: g0 V# d. r3 W2 w
例如,假设某SQL语句为:"update t1 set c1=c1+1 where rowkey=1",即将表格t18 v3 w1 W( ^* e2 M
中主键为1的c1列加1,这一行数据存储在ChunkServer中,c1列的值原来为2012。那& n* C5 o$ D7 G: c* E" j# k
么,MergeServer执行SQL时首先从ChunkServer读取主键为1的数据行的c1列,接着将
" q8 D2 j1 A* ~" p读取结果(c1=2012)以及SQL语句的物理执行计划一起发送给UpdateServer。; z2 P! K8 w9 t$ L8 m+ k& s
UpdateServer根据物理执行计划将c1加1,即将c1变为2013并记录到内存表
2 X' v& x& g' m( j(MemTable)中。当然,更新内存表之前需要记录操作日志。! c! f8 N) k# d) V' w
8.4.5 单点性能# c# `7 p2 Y: B) M
OceanBase架构的优势在于既支持跨行跨表事务,又支持存储服务器线性扩展。0 z) F) y; K1 O8 F- [
当然,这个架构也有一个明显的缺陷:UpdateServer单点,这个问题限制了 n1 j% X! `; n4 {
OceanBase集群的整体读写性能。) ?7 ^5 F/ `6 `* k) V
下面从内存容量、网络、磁盘等几个方面分析UpdateServer的读写性能。其实大' I' Y3 w6 N) G
部分数据库每天的修改次数相当有限,只有少数修改比较频繁的数据库才有每天几
' h% n/ L1 \ V, D& r+ r亿次的修改次数。另外,数据库平均每次修改涉及的数据量很少,很多时候只有几
% a( @! [; b6 u6 a6 c* u. _十个字节到几百个字节。假设数据库每天更新1亿次,平均每次需要消耗100字节,
0 p$ S8 }8 @ T9 i: w/ b; b# n7 g" ]5 l每天插入1000万次,平均每次需要消耗1000字节,那么,一天的修改量为:1亿$ p' N6 E: {/ D1 w; b9 C3 {
×100+1000万×1000=20GB,如果内存数据结构膨胀2倍,占用内存只有40GB。而当
/ A V, N) [% n& M前主流的服务器都可以配置96GB内存,一些高档的服务器甚至可以配置192GB、
& q$ G+ F, Y* t* R384GB乃至更多内存。) W2 @( N2 ~% Z
从上面的分析可以看出,UpdateServer的内存容量一般不会成为瓶颈。然而,服
# M1 [3 E: ~! y B% W! E- l# ], }务器的内存毕竟有限,实际应用中仍然可能出现修改量超出内存的情况。例如,淘4 g, q) v6 s. i# f) G% O
宝双11网购节数据库修改量暴涨,某些特殊应用每天的修改次数特别多或者每次修" [* Z* o" [9 v( I, W$ L" M- e
改的数据量特别大,DBA数据订正时一次性写入大量数据。为此,UpdateServer设计
# a6 w! |' @9 i; V. W0 { D; i& Q实现了几种方式解决内存容量问题,UpdateServer的内存表达到一定大小时,可自动% l9 B1 @5 y2 M6 H1 Z2 @
或者手工冻结并转储到SSD中,另外,OceanBase支持通过定期合并或者数据分发的5 y" L4 `5 @( D# w# Y9 u/ M
方式将UpdateServer的数据分散到集群中所有的ChunkServer机器中,这样不仅避免了9 w. f$ A2 [* k8 F" B, G, O1 d. s
UpdateServer单机数据容量问题,还能够使得读取操作往往只需要访问UpdateServer* L, \! @: r3 v! {# z8 ]
内存中的数据,避免访问SSD磁盘,提高了读取性能。
- c3 w6 c( D2 V0 y% I. u从网络角度看,假设每秒的读取次数为20万次,每次需要从UpdateServer中获取
4 Q! ~/ f$ e2 W100字节,那么,读取操作占用的UpdateServer出口带宽为:20万×100=20MB,远远. N# S/ X, u4 j
没有达到千兆网卡带宽上限。另外,UpdateServer还可以配置多块千兆网卡或者万兆5 z: c6 x9 q' u d4 k4 Z
网卡,例如,OceanBase线上集群一般给UpdateServer配置4块千兆网卡。当然,如果
) J' u& X( [- b( E. E软件层面没有做好,硬件特性将得不到充分发挥。针对UpdateServer全内存、收发的/ T8 D' j9 r, n! u
网络包一般比较小的特点,开发团队对UpdateServer的网络框架做了专门的优化,大
" T8 t, A; x7 B" T大提高了每秒收发网络包的个数,使得网络不会成为瓶颈。3 J) Y( ] }& v. Q5 U( V
从磁盘的角度看,数据库事务需要首先将操作日志写入磁盘。如果每次写入都
8 ^: x1 U4 \. d3 \$ A, s0 C需要将数据刷入磁盘,而一块SAS磁盘每秒支持的IOPS很难超过300,磁盘将很快成7 r0 |. d; \' v- Y
为瓶颈。为了解决这个问题,UpdateServer在硬件上会配置一块带有缓存模块的RAID: F+ a3 F9 n' S+ ]3 \
卡,UpdateServer写操作日志只需要写入到RAID卡的缓存模块即可,延时可以控制在
; r8 ~! j6 D1 o0 P1毫秒之内。RAID卡带电池,如果UpdateServer发生故障,比如机器突然停电,RAID
5 O/ \; I# F) C1 q/ R# K' ^9 v卡能够确保将缓存中的数据刷入磁盘,不会出现丢数据的情况。另外,UpdateServer [# O- k5 _. f) x" ^
还实现了写事务的成组提交机制,将多个用户写操作凑成一批一次性提交,进一步
' q6 F9 v# N) ^- S* S4 `减少磁盘IO次数。0 k) n% u( l4 @+ m7 r! a+ ?& m
8.4.6 SSD支持6 P3 [+ {7 H+ U. ~) u) j W
磁盘随机IO是存储系统性能的决定因素,传统的SAS盘能够提供的IOPS不超过* {! i5 h) f5 R! G) a( J
300。关系数据库一般采用高速缓存(Buffer Cache) [1] 的方式缓解这个问题,读取操
5 N; i& T8 j& I2 N$ K作将磁盘中的页面缓存到高速缓存中,并通过LRU或者类似的方式淘汰不经常访问
/ }* l+ d7 R. k5 T9 N& r的页面;同样,写入操作也是将数据写入到高速缓存中,由高速缓存按照一定的策
( B. Y' J) D$ A1 R% N/ K略将内存中页面的内容刷入磁盘。这种方式面临一些问题,例如,Cache冷启动问
* l4 i* Z7 g& G8 b题,即数据库刚启动时性能很差,需要将读取流量逐步切入。另外,这种方式不适) j7 U; v% w; x1 u8 I0 a
合写入特别多的场景。
' Q# ] t6 h% g2 x @) P最近几年,SSD磁盘取得了很大的进展,它不仅提供了非常好的随机读取性能,
7 s" x; X& `' y" A$ p" [8 Q功耗也非常低,大有取代传统机械磁盘之势。一块普通的SSD磁盘可以提供35000
" P, E. j0 b: r2 H1 _IOPS甚至更高,并提供300MB/s或以上的读出带宽。然而,SSD盘的随机写性能并不
/ e: X' F' G& X( N5 u+ `理想。这是因为,尽管SSD的读和写以页(page,例如4KB,8KB等)为单位,但
* m& I1 W/ `- [- Q6 RSSD写入前需要首先擦除已有内容,而擦除以块(block)为单位,一个块由若干个) f/ S( \; f; T7 ]5 s) _
连续的页组成,大小通常在512KB~2MB。假如写入的页有内容,即使只写入一个
. a; J5 L8 V+ Y5 { c1 d字节,SSD也需要擦除整个512KB~2MB大小的块,然后再写入整个页的内容,这就" P, ]% H) c/ ?2 y; B3 f
是SSD的写入放大效应。虽然SSD硬件厂商都针对这个问题做了一些优化,但整体上( b8 S& q C4 O. I
看,随机写入不能发挥SSD的优势。- X2 s$ y, e j; B
OceanBase设计之初就认为SSD为大势所趋,整个系统设计时完全摒弃了随机! T5 z) o4 t. w6 h8 O( e9 B& ~' {
写,除了操作日志总是顺序追加写入到普通SAS盘上,剩下的写请求都是对响应时间9 Y P: r6 ?3 d# X+ E8 H$ f
要求不是很高的批量顺序写,SSD盘可以轻松应对,而大量查询请求的随机读,则发/ _- J+ b6 `/ O5 X( o) i; Y
挥了SSD良好的随机读的特性。摒弃随机写,采用批量的顺序写,也使得固态盘的使( |% {* \& j4 v) t
用寿命不再成为问题,主流SSD盘使用MLC SSD芯片,而MLC号称可以擦写1万次* q' y! |1 f6 L: N) M2 K) j' n
(SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数2 A8 g1 K. C; V# J1 y
计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。4 N3 v: V0 r& d$ q
[1]这个机制在Oracle数据库中称为Buffer Cache,在MySQL数据库中称为Buffer Pool,
: U( b/ o/ \1 w$ B. f) o用于缓存磁盘中的页面。- z! I+ q( u3 A
8.4.7 数据正确性
3 y! K3 f% t+ v5 w K# \数据丢失或者数据错误对于存储系统来说是一种灾难。前面8.4.1节中已经提
8 r% D6 a+ d4 {1 h5 [到,OceanBase设计为强一致性系统,设计方案上保证不丢数据。然而,TCP协议传" h( B4 C/ {, y; d. y% T3 x2 @5 @
输、磁盘读写都可能出现数据错误,程序Bug则更为常见。为了防止各种因素导致的
6 a9 w2 O( Z+ n数据损毁,OceanBase采取了以下数据校验措施:( ]$ o0 ]4 l0 p' D, b/ T e8 d- @
●数据存储校验。每个存储记录(通常是几KB到几十KB)同时保存64位CRC校3 O; b/ K! h/ n7 q( Z
验码,数据被访问时,重新计算和比对校验码。3 |% p$ |9 p6 P% ~" `
●数据传输校验。每个传输记录同时传输64位CRC校验码,数据被接收后,重新# O+ P1 A9 m/ N
计算和比对校验码。
& T! l* }: }5 |●数据镜像校验。UpdateServer在机群内有主UpdateServer和备UpdateServer,集
- I5 D/ K) R! X& b$ I9 }1 |$ x群间有主集群和备集群,这些UpdateServer的内存表(MemTable)必须保持一致。为
- x; G9 G! F3 A- g6 K( N4 f此,UpdateServer为MemTable生成一个校验码,MemTable每次更新时,校验码同步
1 R1 H9 e; r3 U( h0 F更新并记录在对应的操作日志中。备UpdateServer收到操作日志并重放到MemTable% z$ a8 W) x$ \! w) r1 T7 J
时,也同步更新MemTable校验码并与接收到的校验码对照。UpdateServer重新启动后 ~4 X# e" _: x* i; I
重放日志恢复MemTable时也同步更新MemTable校验码并与保存在每条操作日志中的0 Z3 a3 \; r b0 @" D
校验码对照。7 K+ ^% {% w5 {$ T
●数据副本校验。定期合并时,新的子表由各个ChunkServer独立地融合旧的子表( [+ t9 z3 H$ ]: r7 c, \: [
中的SSTable与冻结的MemTable而生成,如果发生任何异常或者错误(比如程序
: e' R. f- O) [: L; f4 Tbug),同一子表的多个副本可能不一致,则这种不一致可能随着定期合并而逐步累
. k9 E- t: w+ P积或扩散且很难被发现,即使被察觉,也可能因为需要追溯较长时间而难以定位到9 k5 @3 P7 l6 J$ T5 a6 W
源头。为了防止这种情况出现,ChunkServer在定期合并生成新的子表时,也同时为( E. h+ Y3 r* {- q
每个子表生成一个校验码,并随新子表汇报给RootServer,以便RootServer核对同一
( p- u$ _! ]( W4 }: \0 T* n* G子表不同副本的校验码。8 H! r! |; H) F2 z
8.4.8 分层结构
7 X1 ?& v R" e5 r6 ZOceanBase对外提供的是与关系数据库一样的SQL操作接口,而内部却实现成一1 K1 M$ P K1 A$ A6 b% n7 l. G
个线性可扩展的分布式系统。系统从逻辑实现上可以分为两个层次:分布式存储引
& w8 ^- K) I; \1 [9 @+ `擎层以及数据库功能层。! C2 h% d3 f, o9 j) A1 A. C/ X
OceanBase一期只实现了分布式存储引擎,这个存储引擎支持如下特性:
- ]) }9 H+ q. n* K' f3 a* V●支持分布式数据结构,基线数据逻辑上构成一颗分布式B+树,增量数据为内' M5 {9 l. C3 o# q/ G/ f
存中的B+树;; R% `' p6 f# r6 e6 Y& a. H/ |
●支持目前OceanBase的所有分布式特性,包括数据分布、负载均衡、主备同% b* c: p3 y) m# ~7 j7 @& L
步、容错、自动增加/减少服务器等;' N4 b% w4 D% l+ I+ @
●支持根据主键更新、插入、删除、随机读取一条记录,另外,支持根据主键范& u% R* y H8 j. d8 Y7 i, C
围顺序查找一段范围的记录。# d7 ?8 p. F7 H% O7 c2 s8 C8 G& d
二期的OceanBase版本在分布式存储引擎之上增加了SQL支持:) X' W3 i! g! y# B/ Z7 t7 Z0 M
●支持SQL语言以及MySQL协议,MySQL客户端可以直接访问;
( z1 V j* @% t' t9 j! V0 D: E●支持读写事务;# w d9 w) @- M+ S
●支持多版本并发控制;/ d% b% O& Y, K/ j5 N$ a8 M7 U
●支持读事务并发执行。
0 @- o' O. X m- Q! ?4 B从另外一个角度看,OceanBase融合了分布式存储系统和关系数据库这两种技( d9 Q5 N# _" Q: O+ x, e
术。通过分布式存储技术将基线数据分布到多台ChunkServer,实现数据复制、负载
& f+ x. F% m4 q- N$ z& L! d0 l均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数
% I% l5 X2 m# e# m0 O# L% S! b" @据库,底层采用关系数据库技术实现。我们后来发现,有一个号称“世界上最快的内
2 n8 w; t4 C( `, P, Z存数据库”MemSQL采用了和OceanBase UpdateServer类似的设计,在拥有64个CPU核# I4 T: ?+ A6 D1 H, Y5 ]* h& b. E
心的服务器上实现了每秒150万次单行写事务。OceanBase相当于
- m+ q2 ~, c9 k# W9 mGFS+MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是! X; \$ U( v! q3 g$ s. U/ [
成为可扩展的、支持每秒百万级单行事务操作的分布式数据库。
7 c, N3 A6 X, i6 U" l后续将分为两章,分别讲述OceanBase分布式存储引擎层以及数据库功能层的实' Q: ?, A/ ]& l
现细节。
9 e2 D$ ~8 Q4 @3 w2 u& ?9 E7 J" V' l w5 E
|
|