|
7.2 Microsoft SQL Azure' h/ F- s1 B! o3 m% B$ A3 F7 P
Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL
" g' B& o# j6 B) mServer(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关
; ?0 O7 |* ]. q) k+ K, }6 o系型数据库的可扩展性和容错能力。6 _. c N+ w, E/ g5 F
7.2.1 数据模型
* X0 F9 s" a) C/ j# t9 R4 Z8 R" ]* o1.逻辑模型' x4 y5 s) V9 S! n3 m
云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避
5 Q% t7 j2 P7 a' @# J% z: ?5 s分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,
1 q, L9 p+ K7 K! q: q7 q% S保证高可用性。
- j9 V2 c! A; V W1 R1 {( p0 P. I云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有; ]$ A! {# P! u. R/ C
主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主5 t$ P0 j) c D& w& J h
键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning0 \+ J1 n1 R5 R" v
key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划
& Q; T/ H" b# S; S分主键为顾客ID(Customers表中的Id列)。如图7-2所示。
& S) D+ j& s0 r" W" r图 7-2 云SQL Server数据模型
$ g% q% p3 M* h- Z( V$ |# _8 k7 u划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的
. X" |# g" o* {- O) y唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集
! O! P8 ^4 Q' _! X* D3 D, N索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。* C6 s% X; Y" i! E
表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行' G9 H9 @1 }; a) O
以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个. u! I6 L2 b. i) i* L
行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。
- c) F( @5 |9 ^9 J$ p如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个
. X8 q: h7 z3 _$ D7 y; C& t! ]集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
2 p* F" {' h0 j3 w; O的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
3 ~/ {4 t+ i8 k模式。: {4 z/ r( h# m7 j0 \" Z
只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-
( r8 i) D! q9 q- fcommitted)。4 Q$ _7 c; J/ T8 ]8 T
2.物理模型
) X- a1 ]2 D+ Q在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区) z2 g6 O7 B' {6 O8 i9 q6 i# P/ Z
(partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保; ^) u9 L+ c) z8 w
了每个行组属于一个唯一的分区。! y! l+ J5 \% u1 X6 c3 X: k4 ~* p! o. a
分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本
* G' ?6 x" A, B! F' a2 F. C+ r0 F(默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
) u$ {! K, k- e- i. E区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL4 c9 Z" E s q+ I, |
Server的容量上限。
' k) i# a! U" ?$ H2 Y/ }0 ]一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因
- ]6 i7 h( C: s9 _而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本
9 F( W1 F2 }% l) \8 @& T# o1 m分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副0 o. B+ J. g& ~' l
本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同4 U# }6 E ]7 I# \: Q) A6 ?+ Y8 Q
步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
0 |& v: z7 O, C1 @本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。
2 U: `- ~3 c! O2 S! W* |2 e如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两
; B v: J% m$ C* k; n) F个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL" e9 Q. Q( i: y; q( u# f: m- U
Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能( M; a) c8 r8 T" B% _
够很快分散到其他活着的机器上。
# p+ u# L' U! R图 7-3 云SQL Server物理模型% ~3 H6 j. L, M
分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,
7 V Q& l9 E' Q$ P0 `" ]这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和# i4 o7 K z0 A3 Z& O
Z。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行
% ^: x( T8 Z3 G& D" e2 l负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器
8 \2 \" }6 t# F* v- L* O0 L; }X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器' Z w7 R L+ M- x. D, x
Z。
, v* N$ P# e# w0 f9 h7.2.2 架构
( ]* p; c. C, w$ f- d& b0 H云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、" Q# U) Q2 y7 X g5 P* u
分布式基础部件,如图7-4所示。
$ J' O% ~+ ~% l: l7 C7 e* b图 7-4 云SQL Server的分层架构
% Z; @+ n8 z/ N8 |- ^/ X下面分别介绍这几个部分:
5 X# c0 H9 E+ I7 s5 [( ~●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包! p# r3 k* X4 E9 ?, E
含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及, i2 A, f# f& u2 K4 C
schema信息。9 q) d, h5 K" S `: o) }
●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
: H' O3 H/ v* T. V3 |- I$ B分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是; \; A6 ^6 G9 p ]. ~/ V! v
主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务3 e2 _# [& X& ?( q8 o) \ ?6 h
器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全' ?, B+ A# K( I
局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL( q6 D2 u1 K2 ^7 c% R, D+ I
Server工作机,执行负载均衡,副本拷贝等管理操作。3 O4 Y% ?$ s+ b, e
●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
0 O7 u2 V( u1 h6 j: i: ?5 }区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事
k/ Y' ]/ Q; J8 f7 a4 H务操作都在网关与SQL Server实例之间进行。
7 m4 H( b. l6 g8 I; i●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器
) t; z0 I. c4 Z" n; f4 ~故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个4 ~4 Y/ ]/ ^4 t( ?6 d
守护进程。
; y& b% _4 p1 L% [7.2.3 复制与一致性
) W- Y2 d1 T, q* M云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少# n8 v. u2 D7 J1 t
写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操8 _7 z2 b) x1 K W$ }
作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副) Z$ u8 \2 l$ Z3 g( c4 i$ G+ F- k
本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送7 [5 S0 [( S. q* P w. t3 J
COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),# z7 F0 h/ @. q# ~
每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如, y8 L. H2 X2 }! y7 l" j& `
果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并6 ^5 [5 k% N, f/ L$ z
成功返回客户端。
. A+ H x- m* S; W图 7-5 云SQL Server主备同步
3 c& I$ A* @1 y p! s1 ]某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事1 \, A t$ y7 X$ s
务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果* i6 b( v) [( o# W- ]
两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日
# a4 @4 o1 M* v1 O1 g9 ~志传给备副本。2 B z$ J0 \+ Q8 J
主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日7 H$ ?; }6 [+ r
志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实+ n: D9 A, w3 N6 Y/ L
践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之
9 e. J1 Q, F( r1 b' C间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因
' C, N S, L2 u6 M6 [: ^此,对写入到磁盘的数据也做校验。
1 D; b0 U5 B& {( H8 I7.2.4 容错% [* k. c5 `7 V K2 h" C
如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服# H) J5 Q; K$ O8 ]# {7 C3 u" g9 O6 ]
务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一
0 W- p' Y u2 q8 C. H" g" ]4 j3 S调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
' C4 ~7 |% D8 q4 R# q备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分- B/ L6 u9 b; V6 I) s8 [0 o
区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选. Z1 Z6 v! E% ]' I
择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。8 {! A7 o) p3 e* P
由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少6 }+ C) j. R2 T8 d) r' J: V1 [
保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。
! y. c. \! b3 D* b9 d5 t全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。
0 K: _3 |1 K, C2 A7 }3 R8 m比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主2 Q @4 ~1 `' s9 K7 w" ^" P
副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很
0 ~5 C9 _ d$ Z短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策
9 r7 Y) t3 s7 c$ r" s* h1 E略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才. r1 {$ y0 S" k3 F! R
开始复制第三个副本。; r4 G1 b/ e$ u# D4 t% R+ n
全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一
/ G+ P! S0 B$ M5 q9 Y, B2 }时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果# A2 }: Z7 t6 \# q% n$ [
全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最& H+ M! ~# D! p% j
新的副本作为新的主副本。
1 o' r+ D" U. s0 z; f( c7.2.5 负载均衡0 F* l' ~! D% {7 N# }' [
负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点
1 e4 D$ y$ G" X0 b' A0 \3 o# F: u加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多 x7 a' A+ S! Y( p. m4 I. c D
的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能5 H$ ^' v+ m H: f8 m: l
可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本& W9 a" l2 o! Q4 _
替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。/ A0 Y9 [- `9 J6 u/ w. r/ I
影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局
+ B Q9 [# o A+ x" m: l5 p- m' Y9 x分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。' V( E& t1 d1 W4 g% n
7.2.6 多租户& E1 P& b" q" U
云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例1 U1 D; I& N% z& z
使用的系统资源:3 V# l2 m$ Q, _1 Y
1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
; a# K) U. g+ c7 Q在10秒内拒绝相应的用户请求;* ?$ X1 K+ b: B+ p9 q
2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容9 f2 U5 l, o/ S/ z6 i; i
量,超过限制时拒绝更新请求,但允许删除操作;. m1 ^' D2 a& N
3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,1 b! _, A. c6 ?$ T/ e8 u
此时需要人工介入。2 J- m( {0 S4 ~/ N
7.2.7 讨论4 B8 i$ \7 X! w) g- U( ^ |
Microsoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合
# f4 H. X6 K/ L' M7 @; X) G) w1 p1 o7 j用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:
/ V. [9 `+ s5 r5 F I: I7 t5 w7 N: q●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支2 m! _4 s7 b# J, W" R0 m. t
持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通
" S! e. V2 `0 N+ h过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
6 e- a R& k3 A不同的物理机器。( t) z/ G/ ]; e: i
●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接
! J+ V. B6 }9 L; K% }+ `7 G+ Y4 S除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我7 z3 O K. i8 h/ y2 s: ?# j. V
们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给7 \2 ]2 g$ Z& t( q
了微软,可能会有更多的精力关注业务系统架构。. ]! y- F6 d0 V& i0 C" G8 d4 G, D
相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL/ t. C+ w6 }6 y/ ?3 F' j* y
Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节" C' x, t6 B. M- K6 A
点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
1 q; k& l2 y5 Q' M" R! p1 W据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比
! M6 ?, i9 b8 v较麻烦。+ C& G+ R$ U5 |8 j, v# W8 X; ~
1 m$ ? o9 R+ m7 |
1 J9 @% e0 t& K: Q |
|