|
7.2 Microsoft SQL Azure+ v3 Q) ~' }) T) p
Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL! ]% V) O" D0 z7 |/ X4 u' A4 Q }
Server(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关
. l6 {1 K( E9 ~0 M+ M4 ]系型数据库的可扩展性和容错能力。
; O. L0 j4 G7 B' M. w/ w/ U5 Z7.2.1 数据模型
+ A( _) k/ U% I& {0 Q3 c2 n% N1.逻辑模型
7 R0 H6 D$ d3 i! m5 v' X2 I云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避
* r# } X- |- h, V# ^" D分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,
2 `7 r0 \9 E4 e9 U Q* `' p保证高可用性。
/ _* U- X* q. f: X4 w0 W s1 L云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有
- q! [# z6 Q1 J主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主. F9 G2 r0 J- y# H/ r6 G9 J! S$ \
键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning
8 e$ ]& T" w. _+ |key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划: z i( `0 }9 j# o3 h) P
分主键为顾客ID(Customers表中的Id列)。如图7-2所示。
: }' A/ b1 ^ v+ k" f3 F图 7-2 云SQL Server数据模型/ ?# m. Y6 j& ?; ^. o
划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的 D. }4 `5 z( j$ J3 Q+ F
唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集, E _& `( _( D0 B" a4 L8 a
索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。
1 F3 J, m$ |, {# l4 f表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行1 t. e, ?" J* J9 @+ `
以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个
+ Q; |+ j7 _$ j0 h行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。
, I0 r9 }; I4 Z如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个' A* |- [0 ]+ s2 U; W# ~7 o" {
集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
! F3 n' D0 I; k# l( e9 I3 l; J" u的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
; U4 m) a4 ]% C& Q/ z) g模式。
3 V/ R: X* |6 b' Z只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-
; {$ u* ~0 X) A+ jcommitted)。+ S) ^* d3 J; R s8 W
2.物理模型
0 L4 @5 p8 v! Y在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区
* \: l; K# r2 l. e- q: `- L(partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保
3 h8 m! M1 O7 m5 J* `7 [: J; Q ^& o了每个行组属于一个唯一的分区。- r3 j0 M/ E- ?( O. \3 n
分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本# g; u8 f- B) k8 O9 Z
(默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
5 q& @# P" r) b/ Z区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL
3 O* \$ \) x7 A* WServer的容量上限。+ i; ?4 |- i0 t, V2 @6 X ]9 T- q
一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因) u; L, }( u# o# p* i
而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本- s( a* ?+ C) E& w$ c# I$ c/ D& W
分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
2 R& b/ \' {9 y* b# n- U6 w本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同9 ^2 j# W. i# e7 I% y3 q) l/ B
步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
5 k6 N! b% S4 ]本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。; _' ^% ]. Q; s# a3 Y. C3 t' i
如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两9 Q# g3 Z: |, @2 B9 h; p' S
个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL* H% Y; O9 n* z. e c! ?+ O1 E) Z
Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能
: M Z7 \3 U0 T. `+ r5 `- u# T够很快分散到其他活着的机器上。$ o! g5 t. c2 g
图 7-3 云SQL Server物理模型$ \% C8 q, L( T3 c3 L5 _5 s
分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,% I, Q* ?0 H" H1 I
这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和
" n3 E% s1 F! ^. `Z。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行
: \- E- t! ]+ F1 R5 x( w: @' G负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器
% @ c8 p! W! H0 gX,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器, |) D L& a) L
Z。1 b' C, b, C$ p0 m8 V
7.2.2 架构& ?/ X6 [4 y! d7 J- C4 {# d
云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、2 o9 E) I. S5 N& b: M+ I
分布式基础部件,如图7-4所示。
$ A; ?8 _. \, Q, n: [图 7-4 云SQL Server的分层架构
( d) b0 r8 A8 ~ ^" T下面分别介绍这几个部分:3 ]3 v# d* @( @& [3 j' H: \* v7 j% S
●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包. \2 O3 M0 }7 n4 A8 }* p
含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及# X4 ]- H8 {3 T8 b/ T
schema信息。
' o/ |' ?' A( T. d; Y●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
- Q8 e' C2 i$ r" \7 B" ~分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是 f; E" Y2 b& Y( C
主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务
+ [, J8 N8 v6 b" \) [器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全5 E( [4 ~3 z8 [
局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL
' X0 O" r3 Q6 M9 b0 w1 IServer工作机,执行负载均衡,副本拷贝等管理操作。
& j! U2 k$ d2 f ]' o●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
4 v, s+ s K3 p+ Q. S6 r* V区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事
8 W: R" q- s$ ?6 G务操作都在网关与SQL Server实例之间进行。; A4 Z$ T" T( R9 J2 W' f, A
●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器
' n' @: b$ Y8 d f6 E% I( V故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个6 w, C; }8 H! j, y3 r. A0 @
守护进程。- D! F/ c r( o3 i3 T5 i6 g- F
7.2.3 复制与一致性7 }* {; A4 \8 ]) t& O+ n
云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少: i7 E. p, V4 |5 L1 R+ K0 s! V
写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操( t+ ?1 R- }: ^4 V
作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副/ n1 k( Y8 s' d! h" _, r8 I1 o& }
本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送3 y) `" ?5 [6 D5 m* n9 j8 ^
COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),) [$ u% d4 i6 B, l3 H
每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如/ k- C) j6 O/ Q3 u2 K$ [6 z
果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并$ x+ {; s+ T: T9 |
成功返回客户端。( }: j) ?1 Q# H" L/ W% I4 u
图 7-5 云SQL Server主备同步3 P# I' k/ t! R8 e" I# W0 y
某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事
& I$ L% L0 @( _8 T# S务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果
# I T6 Q; ]9 p两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日
& x( f9 \$ j! A# A5 v4 \志传给备副本。. d+ l: _0 A. k9 m
主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日
4 |. b( T+ \1 J& j: U* n志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实 X! t( a: r4 G% B
践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之
7 `5 g& \6 y1 W& X# p9 i: w: a- }间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因! i' a6 o4 ?9 x
此,对写入到磁盘的数据也做校验。
- y! C6 |9 Z7 }! L3 G+ [7.2.4 容错
: p) j8 T( o, l如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服
1 V5 s) o" q1 y4 j8 _ l务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一& U& {, b$ ~8 }* g+ q; k6 a G* L
调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
' G$ Y7 T$ P" w$ B7 s. n备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分
/ Q$ N7 r$ o; p0 d \区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选
% N7 ]9 O% I/ ~1 S/ ^择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。& i! I' b; B4 P" w2 g- L* X9 r
由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少. \7 V: A5 k% r3 z& f. F- f( L$ b% \
保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。* z( ~$ r4 m! {) l' {" U
全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。
5 K: r" ?: h2 ]) m# c$ M6 T% ?. W i比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
7 ^: O3 G1 g& l2 L1 m副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很
; N/ J* U7 Y9 W) | R. A6 M短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策
" O$ e% j( u) r! l; f略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才2 Q% m/ q( T2 {+ w& L
开始复制第三个副本。& x: w! e1 S: Y* v0 O
全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一# V4 m* C/ o- m- y( s4 ]% }' e
时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果- @0 ^& Q. c# ]" m4 Z" v
全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
: y+ [/ c$ o- z* b y" n新的副本作为新的主副本。% h7 p# [' U4 v9 d: ~. f+ G
7.2.5 负载均衡+ R {7 Q8 p6 }* m" `" S: z r
负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点! w8 |5 l) T/ Z, T
加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多1 z% \* O- p: T3 f' q1 z
的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能
* ^2 `1 A" q0 w6 _可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本9 Y( p# {. g+ y) ~
替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。; h7 O% d2 U& Z! ~. e+ U$ a
影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局, v# H' x% \$ A( j+ a% \4 R
分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。
5 s& G( A* ~) f7.2.6 多租户
% ?) Q. |* z1 I8 M2 z8 c云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
: n" d$ {% n/ p/ }. }) g# ?使用的系统资源:
) C- s; U! C/ ?1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
8 b/ J7 |, X ]* M在10秒内拒绝相应的用户请求;
5 W1 ~, u- D9 r3 `6 m% z, u2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容
+ \7 ]9 T, p0 Z7 F& H7 z量,超过限制时拒绝更新请求,但允许删除操作;
" w( m* N& p0 G) Z3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,2 y5 q/ q6 }- d
此时需要人工介入。2 P2 D! t7 L/ c; \$ K
7.2.7 讨论2 ^( `2 p) E. I1 l! W
Microsoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合
) E7 j% p: y) _, m9 Z, C/ f0 M用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:8 P+ [" N# v4 C7 p1 E8 C4 C
●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支/ ], @1 U! ]8 l0 p
持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通- P8 N7 x8 G6 K5 T( ^
过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于- P* \/ u* |6 R! s4 X
不同的物理机器。
# X& T7 I0 Z! o0 g- Y●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接, |2 b% h9 y d3 H7 D/ K
除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我
4 B$ y; v7 l5 J) @" u5 G/ M们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给. X8 w) {! ?& F) G; J7 \; D( Q
了微软,可能会有更多的精力关注业务系统架构。+ G5 I" U( w% Q K y
相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL2 i- q' T9 t7 b3 K
Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节
! D t% k6 G! Y! w4 U1 r& U点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
* G0 L# `4 e3 L4 _7 Q) _据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比( b# T0 w7 \) S" x
较麻烦。
- U) G( _( q: o4 v R/ x l) f! ~ c7 c. i& l
& ^+ V+ v- @9 }4 }! ? |
|