|
7.2 Microsoft SQL Azure! n$ |0 H8 h' E9 n& X) X
Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL
m, l6 h: b: gServer(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关3 H* X j5 g/ [0 g) R. \+ v2 w S. N
系型数据库的可扩展性和容错能力。
|. f/ w6 P$ T) T7.2.1 数据模型
* N7 A5 v- ?& }6 S! N1.逻辑模型0 ~- b, q, m+ Y' E9 h# n
云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避* K4 L/ E. _$ L' w5 E8 y' P
分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,- l) L" @. k4 G+ `# k
保证高可用性。
5 @# P0 J+ n* O" Z" G云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有
/ D% c( f! k, ]% i4 A( E. i4 |主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主
/ F8 d1 m2 \4 }$ f键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning
# S3 t& S, {% F$ o4 D) d4 |key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划% V( R$ ?% f; W4 l3 O) ~3 a
分主键为顾客ID(Customers表中的Id列)。如图7-2所示。
5 E$ d) V" V8 O, l图 7-2 云SQL Server数据模型7 L# m* c5 W6 L. e% F e
划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的
5 O4 A3 p% N D唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集
* ?0 k, u8 t* G! a" k, H2 v) p索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。; a6 f% Q: R2 H' I, J7 V
表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行, w& G, E8 X4 i/ Y
以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个
" N# u3 z3 Y( q' Q- i4 z" k行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。
$ q, T# r3 O% J( {$ e# a4 V如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个1 y3 e2 b5 ^# y1 b D& A
集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样7 l" Q2 e& o9 g2 ?+ N
的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
* F% r, p4 }2 f* m, v/ ^# |5 F模式。, v" d" V* L5 `+ y" C( ~
只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-
6 a/ Z% y3 Q9 `committed)。, T# {3 T/ J4 `' H) F B
2.物理模型" T+ D- u4 _* N: Q# |
在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区
% d$ @5 q' m. T0 u7 s& S# ~+ m; j(partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保2 _' g$ H4 S! o$ u* t* c
了每个行组属于一个唯一的分区。
) k* S! M+ v; D" t分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本7 J; j) w; q; z D- s
(默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
! {( l# b0 x) A" z0 k, F' b区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL4 G3 p& x- Z) U. f( R# W( ?& Z. T
Server的容量上限。7 u! b% U5 A: l% {4 ~
一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因
" a4 @( C. J3 V1 x而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本
5 |& ^. s. z8 ^; [7 E- H分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
E& D( h# `; L8 j: }3 I本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同- l% ^ x/ h! l) {, K+ l+ N4 O. [
步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
: i1 y+ }4 C% T本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。% |, X' X5 W$ k6 x7 h5 g* K7 p( \
如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两
7 a' ?6 U' t, X6 {( T3 ^个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL
$ s8 Y5 S: `* V s* YServer数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能
; X1 G6 p6 W, D够很快分散到其他活着的机器上。
7 J+ r' j1 ^ U+ k P图 7-3 云SQL Server物理模型
9 E0 c+ N5 y3 f7 p$ R分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,
! z" \% ~- u6 p$ \7 y这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和; M0 }' N6 C+ t7 q1 l2 a% e
Z。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行% @( K" r h3 G' M* F# y" Z
负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器; u2 y4 M- Q* d2 Q
X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器8 T. L8 k' e; a" h1 @
Z。
5 l; ]' ?" I. J$ Q9 Y; r& z7.2.2 架构) q3 W3 [2 r" ]7 Y& K( {) a
云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、
% B! G" e5 B7 O' s4 N+ |) k分布式基础部件,如图7-4所示。
M- V; v7 S$ E# R7 h6 j1 i图 7-4 云SQL Server的分层架构
% w$ w1 O1 D; {$ F; x+ h+ [% j5 n下面分别介绍这几个部分:
6 F, o0 n1 W7 D8 `% I) |●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包
% \/ X. v2 a9 N0 J K$ l5 Q- f- S: P含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及
: f' k9 X5 }6 O, y( G8 I' D* P2 Kschema信息。9 s7 F3 S2 U+ O0 N* D- [
●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
: F4 y2 ^2 p% ]! P& F3 I, ?. {分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是
( |4 I- n! L3 b主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务8 X6 p6 K8 m* u {/ i. [
器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全/ Y! m. H/ Y' m% U/ }7 d
局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL' m1 {; l, l4 q9 {$ Z
Server工作机,执行负载均衡,副本拷贝等管理操作。4 A) y2 b+ o# f3 S+ l9 U
●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
: I0 _# C) E7 \+ \区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事2 m4 G. s; Z$ ~! [' ~3 F- U; r
务操作都在网关与SQL Server实例之间进行。
8 [+ x; L) p4 y1 g0 ?●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器& |/ S5 O" s9 g' E
故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个* Z# i- }& l# H8 A. }) ~
守护进程。: a+ b, x1 X1 q" \! ~( \2 ^1 q
7.2.3 复制与一致性. q( ~! h$ ?& S
云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少
) @& V8 s$ A4 ^( i- q) f) o写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操; S, {7 |+ G" }+ |1 \: S/ M( d) H
作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副
; n9 e- S' d# K+ g7 a2 v- b4 t1 g本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送( ?- y( m6 p w: j8 u# E2 s( u
COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),0 Z) v0 }* ^0 s
每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如
' t! A r* [4 ^' K0 b1 G果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并# X8 F" V8 r7 z* @$ \3 T
成功返回客户端。% u, X& w" {' B: u
图 7-5 云SQL Server主备同步# R* ~. ?* [2 }5 H3 |
某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事
, n# \) @' \) e务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果
8 T; s% b/ [/ D k两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日! }8 Q) e) w1 H8 C3 o
志传给备副本。6 O! `: U( k' I( e0 ?
主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日6 j* |6 K: c6 y+ W' L
志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实
1 I; C v6 { U8 O( p6 V0 b$ H践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之& L$ D0 V) ?! f4 a" w
间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因
8 j1 k$ V9 y" X& @. x3 ^此,对写入到磁盘的数据也做校验。
! T/ z6 W: B( Z7 W7.2.4 容错
7 r" u- m: c0 z; f: O如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服( L& g, h3 D2 F4 V$ W5 [3 O$ f
务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一
: _' D" G/ c9 G1 T8 b. i: A! @调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
1 t# v+ m3 z! t& e" n) A$ G备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分
: c3 J. R& N0 k区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选 c6 B5 {9 k& @$ |4 E+ @
择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。. q' }( L) R B b& ?. N
由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少
/ f9 V, n0 o6 L8 l7 U保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。
8 k' I; u) m8 ]9 {1 k7 e全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。" T' X+ G) y0 H' \
比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
$ Q( F' K# f/ z+ o5 @* x副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很
. t" X! G7 c% [7 Z. t短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策3 {0 n' c& j3 T9 V
略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才
9 ?1 a/ X" a. v6 r$ f, `8 N开始复制第三个副本。
T* k' r# F% | q全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一
, P0 [- V% u/ U) h# M2 O时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果1 S2 W5 O7 z) f* o2 U+ R( r
全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最: O! x5 G* X8 @8 i1 S
新的副本作为新的主副本。
Y% J% ?' W0 K! u5 g. ]7.2.5 负载均衡- K7 e2 F" ^; J5 x! Z* P! ~
负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点
8 M1 A9 R) n8 t' G' C加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多
( a' m1 Q. _' |8 ]" N的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能% U# N0 P' m& j2 H1 W) C( d! [
可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本
6 Y- q$ B* Y4 m7 R# X3 c替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。
6 d' d; n1 u8 X5 J5 s4 q影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局 z3 h$ K' S9 j) q- L2 r( t
分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。
" ?4 L' l# r1 E7.2.6 多租户
8 j* i8 b+ M4 Y+ i0 `+ @3 T云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
2 T* n8 ^( V! p使用的系统资源:3 J6 H1 T1 [( L" {' r0 n) d
1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将9 l# u, v3 O" T$ K
在10秒内拒绝相应的用户请求;
7 S6 r& R! Z1 R# Q2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容
u( m" s; i; [! _% p量,超过限制时拒绝更新请求,但允许删除操作;
9 F- b4 N/ H# V& X! i+ o! o3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,
* U, i8 Y( d; O m8 ?此时需要人工介入。
+ q# O% U+ L% V* u) p7.2.7 讨论" C* l$ A) @. Y+ [1 m' r
Microsoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合
9 n2 p2 o E* e用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:4 |* w$ k7 r2 B x1 n& O
●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支; L) X! Z* U9 W5 M
持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通
6 y5 X! Z* q) ^+ \8 s2 J过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
9 W) M. @' }9 u( A1 J$ X% B不同的物理机器。
9 h7 E3 k% k- s4 K$ b5 T$ C. Q$ K●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接" E' v; D: E0 ]+ f' Q- P( v) G5 B
除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我
. T5 K! N7 q* O5 ]# i4 f们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
, ~& j) J7 \8 P! ]' T0 p2 M, W M# F了微软,可能会有更多的精力关注业务系统架构。( s+ t* R+ R7 G; a' j; U$ V3 g
相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL
% g; @- ?" J2 j+ ?8 Y+ d9 LAzure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节, y) W, j! j0 F8 W$ ^
点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
Q9 L& d" M+ a! T& l' g% E0 t) J据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比& X" y8 G3 ^/ T" u% k3 _3 Y/ ?
较麻烦。$ j8 J8 t+ g% ~6 v* Y% N# n
) s6 n) @( c) S" w( F
* F: z4 U) Y* K0 v/ `7 D8 K
|
|