|
7.2 Microsoft SQL Azure6 Y- d' r' }* g$ z$ `' f U6 s
Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL
! N8 X9 R, y" {0 z- cServer(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关
* Z* T! M! `1 U5 B系型数据库的可扩展性和容错能力。
% a* g4 Q8 [% F: E( L% V3 i# N7.2.1 数据模型
: R; s3 }( |( Y9 F, E; p: d1.逻辑模型
- I; w. _4 H, x' ]( B1 [% B0 }# I云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避" w2 t/ ?' z' L2 H
分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,/ x; V* K; ?. p' M
保证高可用性。% _4 C6 U# C& F. c) [* ]
云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有
0 e' b3 a% p$ V" I1 t2 M主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主) b, n8 a& Q) _+ X! ]6 e; E' A
键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning* a) E" C* I9 U4 F! @
key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划1 S8 w* k3 ]8 f/ ]% i# y: p
分主键为顾客ID(Customers表中的Id列)。如图7-2所示。- T( _( v- }. @1 ` t
图 7-2 云SQL Server数据模型
0 e$ q- ^ j8 e4 s# Z# N5 N划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的4 n$ ?8 p3 C- v8 z
唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集2 ]( L) v/ l: n& i0 e
索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。6 q6 N: Y! J$ q$ c
表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行
7 s7 ~# _! `9 [$ |7 G. P# G以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个
5 a, `# f+ z& m) h行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。8 @3 l( A6 }' U; \: K- |6 C+ C
如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个
) E$ G& X, ~7 V/ c) w集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
; M% P, ~( X8 k2 C的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用) P9 ~6 l. [' e4 H, m9 }/ }
模式。& k3 m( Y% A. U/ T/ U+ Y4 R% ^6 s" O
只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-& j+ m: x4 v1 [ X" p7 N
committed)。
! z" k0 S2 w% D! {" }2.物理模型
" J3 v1 N! P5 t3 K$ U# p; \在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区+ z" L( Z7 g3 a8 b3 _( A6 a! L
(partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保9 ~! D4 R: D9 M1 m" M
了每个行组属于一个唯一的分区。
9 E6 M8 Y3 M1 h5 \3 S. W分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本
1 H7 s. g1 g0 h$ z: N(默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
9 ]( J( W% Q2 Q; b0 q* j区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL& C3 [) {. F& O) W- ?
Server的容量上限。
. W2 y5 W: i. l6 q N% S一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因
1 i" b4 c v' L% U$ A& w而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本
- M, N U3 Y/ u7 k2 a分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
! Q* P5 t: s- r本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同! Y$ v) x! M! \8 D4 L
步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
3 I! A ?7 m1 j ?1 x6 l5 Z* s本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。 o, o. l4 _4 L5 A: Z6 n6 H$ `) X
如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两" O$ W8 v2 n+ l
个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL
" }( a8 E+ m& T" {' a2 c" {3 tServer数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能" `. ]# O8 Q9 \. H
够很快分散到其他活着的机器上。% r$ D" V* B% t( c, l
图 7-3 云SQL Server物理模型4 p. O6 M+ B/ t. b# r
分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,
1 L! D8 W8 C. {2 J' ?这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和
; u# t. P% M4 N- tZ。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行% W s& c+ C) x) J8 a& N
负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器0 u8 O* K3 l, u2 l/ J( y6 m2 B
X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器7 e$ l# D! Y+ y s- _6 V5 V& V6 N
Z。
6 M' \# J) H( U7.2.2 架构5 v3 m: n9 X) N
云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、' {; a5 F; y0 S' T5 e! V; B
分布式基础部件,如图7-4所示。
8 ^5 A6 Z4 C# p7 b* ^/ ?) ~4 z; K6 x% o图 7-4 云SQL Server的分层架构
0 D* @2 |4 \( N# r4 |0 v. z( X9 X下面分别介绍这几个部分:
7 c# Q6 T2 f" D! S% Q8 u; _" T( P●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包
( {; ^% u/ y/ M& Q0 u7 w& P6 [9 @含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及
1 t7 q9 ^' y4 Z2 t/ [. B% Aschema信息。$ w- Q# K8 M2 I5 {, v* L
●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
& u3 l# L% y! G: W分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是
) v) A+ O, @8 e0 U/ E* m, v5 ]: j主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务
0 p" Y3 I' {: b; E7 Y器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全
- r% X6 E. ]+ H% r! M3 a8 o局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL
# p- a' s; x3 U# G- g! mServer工作机,执行负载均衡,副本拷贝等管理操作。
" P$ ? @ a# _- W' p●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分' w, E. W" A8 o p: ` X
区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事
" P3 T5 {4 u2 N" J. z+ H# M/ d- B务操作都在网关与SQL Server实例之间进行。4 w2 n3 ?1 }3 {
●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器
8 B) u, X3 d$ m, y4 j! @故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个$ [8 Q! s+ ~, n# x2 n
守护进程。0 i0 @9 s2 L3 Y% S9 I' x7 K) [1 F
7.2.3 复制与一致性& C( ^9 o$ b: Y" z) n- p
云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少 {/ V8 p O# \, `1 x$ r
写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操
% N, [- S5 T' h1 I2 q作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副3 l# W, m& I+ \4 M3 l$ |
本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送
9 b+ `; t! E6 b& BCOMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),. r/ j- G! q# p; o
每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如 X' I4 W' L1 o- R" F$ _. ~
果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并" Z; _9 l6 S/ z2 v
成功返回客户端。
) u8 j( r& k- F# }9 j图 7-5 云SQL Server主备同步
8 Z; e9 Y3 m( S) Z7 D某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事1 K( x- s# x/ h7 K, y! ]* `
务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果
6 I1 `, o, p" C+ Y2 L* @两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日
1 x r" l4 X4 [# h# d9 |/ W7 P- {6 w7 _志传给备副本。4 j! d* _' `7 w; r" b1 y
主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日/ L, f' A( E+ H) B
志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实
6 T0 {2 e7 a/ |1 k践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之* u% }% J2 k6 C, y' h) i( h
间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因7 X! ~, |- A' x8 L
此,对写入到磁盘的数据也做校验。# y- }; B/ r& s6 M6 d+ V
7.2.4 容错8 F/ ^+ _! H6 o1 L
如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服5 d' g' L# D& J9 C" a( t7 w0 G
务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一( p6 n4 I3 G3 y
调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是 l7 X3 Z4 e$ q% S. L/ ~
备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分
! W( Q. Z! f9 ?区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选% V! r- X; m7 k* M L. I
择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。0 r5 h) ]1 x1 ^. r
由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少
- r* e( K8 U( F- i保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。3 Q/ L8 j. s" X6 B' k/ H7 p
全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。7 f5 ~% p7 j* }2 R+ z0 F
比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
; a1 P5 {- i& V. h, m: d% n' d6 |副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很2 s3 s1 ]. I0 X: s0 t
短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策
5 B4 R4 @5 H; T9 ]- e2 c略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才/ {6 I) q4 H4 }& l3 w# Y: y
开始复制第三个副本。
* l& i! M% l! V% K5 {' |全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一5 u' R4 Z# g* g; s0 f$ x
时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果. A$ i+ ]# D2 c& c8 Z% v2 S j
全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
3 A* O- l* c( X/ D新的副本作为新的主副本。8 R# X3 V" ] |7 ?
7.2.5 负载均衡
% x: f8 O8 i$ \8 z负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点4 c" d" O: T3 f* o2 u
加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多
/ ?; c [2 j2 z$ k的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能/ M. ]8 y! a# b* s0 P: `0 f+ H7 i. i
可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本1 Y: w. w7 _ C1 y( c
替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。7 p( l+ p/ B u6 A+ H1 v g
影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局
" D0 N3 G5 |8 T: Y# X分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。# ^( x6 n. C, A1 k; c J
7.2.6 多租户& S- E. C7 S+ r
云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
) u/ Y: o2 l7 O/ Y1 m0 X3 d) @0 I使用的系统资源:
1 ?6 ?6 |$ K; X$ j& q! k1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
' ?7 b# E9 N. q! V- O: Q: a在10秒内拒绝相应的用户请求;
9 ]6 ~1 t8 a" C& G! ^& \2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容% W' W9 M. `0 }* }* p0 b* W
量,超过限制时拒绝更新请求,但允许删除操作;8 @1 [: Z" v! P! V7 P- Q
3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,0 d3 f2 Q7 x/ A% G" l! y+ @8 u
此时需要人工介入。
: k1 ^( g1 _# x# V" e5 ]7 G7.2.7 讨论
6 W6 b/ C: Y; X0 f/ p; U E% k" W# JMicrosoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合9 L' o# `4 M L7 T$ s( D& ^
用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:
) }2 Y1 {8 E- @, R' s- [●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支
! u. \8 D1 m( Q3 u5 P; O1 o- i持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通
( y G0 r" d' G9 ]' o: l过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
) |' @3 D* y* x T+ d+ C- t' T不同的物理机器。. A: @4 t1 W; B3 o% o3 z1 ~
●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接4 ~1 G( ]) W6 n; n
除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我2 }) \& ?: U8 L+ k: I7 [1 S
们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
+ e8 {# o e2 R! Y% g, `. H了微软,可能会有更多的精力关注业务系统架构。
( e+ L/ Z' C6 L相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL# Z, F- l% [0 t
Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节& _% \2 K1 b% ^) c3 r+ Z: d
点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
; j8 u6 D) n; Y据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比+ t( U" O9 m# N) p# Y) s, Q
较麻烦。
) D1 d; X" ?2 a# [" a; c/ c' B3 w5 U- ]5 ~
1 N: P4 k7 ^1 q7 G
|
|