java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2317|回复: 0

《大规模分布式存储系统》第7章 分布式数据库【7.2】

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66101

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-3-4 14:03:22 | 显示全部楼层 |阅读模式
    7.2 Microsoft SQL Azure% H6 z7 y  M! G0 s- F
    Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL
    3 r2 T& g' l1 A- S) E' {Server(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关- |6 K( f6 j0 K' M5 o, ?
    系型数据库的可扩展性和容错能力。) t+ {( Q5 I2 W# M$ k& I
    7.2.1 数据模型$ |" e3 P4 K  ]( J7 d" F
    1.逻辑模型
    % b4 H1 \* _8 {/ Z4 L云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避+ b( E5 A& ~$ ]) e2 a% L
    分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,+ c& t- @- e1 e; A! r( ?1 c/ [, x
    保证高可用性。0 O5 g% v# j) D) E
    云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有2 j5 R2 E5 L8 ]5 P8 H( k
    主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主
    ' L( B- Q- q) c- Z1 v! A9 |键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning+ i1 c- q  |# `
    key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划5 b5 g* u" Y1 }) G4 H8 v
    分主键为顾客ID(Customers表中的Id列)。如图7-2所示。; }( h, s* E1 Z, f+ ^- {$ k
    图 7-2 云SQL Server数据模型
    5 y) }  C0 F) e- t' ?8 b' {划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的# _" p; F$ ^1 C8 z
    唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集
    + E" q+ [  _5 r" L/ K/ e索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。5 ~: Y# u7 C1 B7 U: U1 N
    表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行; {/ B9 m5 Z% |. o9 j+ J
    以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个
    , W' h0 s6 @4 @" `6 j% o行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。+ v! N, g/ Y# h2 S% n% A
    如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个, c" w4 A: H4 a
    集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
    6 d9 a" i3 J5 x, s' |的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用1 a9 J$ o5 e. M, i' r
    模式。
    7 _  D8 ^% P( Y* y) J4 f% H! S# s$ a' W# Z只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-: ?2 I5 D0 C  T
    committed)。
    ! z: j+ I2 D# G* q% u# @% z3 T2.物理模型
    ! x' u! x/ q7 m  y) f8 I  q在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区
    & s- z6 C! Z8 N! i/ Q& `(partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保0 W9 G0 w4 ]" w: o6 v
    了每个行组属于一个唯一的分区。
      _9 B, p! ?8 n! S( L- J. u分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本7 }' e7 I# C  ]
    (默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
    : H4 l/ L7 l* D& N5 T区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL3 M, A3 T4 b: n; \2 b
    Server的容量上限。2 Z6 a7 m9 E# R3 [* U) Z
    一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因$ j* g1 O8 K, f
    而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本
    4 t6 Z  `" s6 P. D* {1 ~/ G- d分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
    , ^3 |% \% R- o* X# H/ j' P本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同4 d( a+ q( R9 s
    步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
    ( l6 {) j) u  W4 x1 Z0 D- @4 t3 M$ V本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。* f& f) @: D. V; T5 }' \  D
    如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两7 f/ d% i+ @% H
    个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL% j, J3 H3 K" p) B7 M+ v3 z. x+ u
    Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能
    & {) I9 U! t# h+ x够很快分散到其他活着的机器上。
    * |6 }7 ~: N* p& U, m' m图 7-3 云SQL Server物理模型$ Y1 k& |; o% o: L
    分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,5 d" I7 a$ F% |
    这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和
    4 T, p$ V8 U, b* c: B: BZ。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行
    9 S. S  Z7 i, a# b, T# C负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器" z1 ^" u$ z( F: E& Z
    X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器) l% v$ p. V& n
    Z。# Y; _& w+ j5 w: R
    7.2.2 架构
    2 |* p/ j# m8 b0 R云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、
    - }( s/ }9 z/ K分布式基础部件,如图7-4所示。
    ' V: `+ x/ O. U( Q9 i4 l图 7-4 云SQL Server的分层架构1 j: t# c( \& J1 }& Y# T, B  ~8 S
    下面分别介绍这几个部分:
    ! ~0 y8 Z" q: k/ p: U/ v! p●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包8 N, X% d7 ]& S4 o; `) T2 h2 T
    含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及2 d& y7 `: H$ N/ ?
    schema信息。
    3 h6 D' t: r3 x' i, T( B9 {! y% d●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
    , F) n$ Z  D) J3 D% k* X分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是' w- X# D5 i, ^2 z
    主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务
    ! ?3 G* Q* H3 x! }; Q3 D器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全
    - s3 c  h  F# @, E2 _- r局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL: j5 ~8 t( W4 w' U& {; ]2 m
    Server工作机,执行负载均衡,副本拷贝等管理操作。* U; ^; P2 E. ?' ^; G& f( Q
    ●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分' s8 X) q/ d, |5 x+ Y0 Y/ J
    区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事. K$ w6 V5 J" S# ~
    务操作都在网关与SQL Server实例之间进行。" Q! N3 {  Y, }& P, ~  A
    ●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器3 o2 z/ L" r5 I$ q9 g# o
    故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个
      h3 v7 O/ Z$ I3 n5 y- p( Q8 l守护进程。
    # `3 G% O5 T6 Y( s8 g7.2.3 复制与一致性
      n2 E' v% [/ d4 K8 R) |云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少
    ) }0 Q$ g8 I, {写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操
    6 P6 H: c5 g1 c9 L4 r作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副
      Z2 H: g% }% f/ }! k; V本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送3 }+ n* o" _  Y' v1 `! U/ A6 l
    COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),
      Q7 \. h  C4 h每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如
    ( t" Q: `- {3 r# C: |果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并& G2 ~: @2 u- C0 }! R' _3 K' F; f, j
    成功返回客户端。+ w4 u) a& X3 }1 Q9 Y
    图 7-5 云SQL Server主备同步
    ' Z4 B) j: G7 w$ R9 x某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事
    4 l5 P4 H# ]+ Q3 T0 X; m务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果: ^) E3 X, ^. k0 k3 Y9 q' k0 D
    两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日# f8 O" G& j/ W! B. S
    志传给备副本。& W+ N$ v, X3 E9 O! O0 ]
    主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日
    / l' U, c5 ]+ n% R志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实
    ! t3 k. Q  Q; R$ V$ g3 ~践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之4 k% S/ R! _, H
    间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因# Y2 @8 \. g/ D9 N" o3 n
    此,对写入到磁盘的数据也做校验。
    ; V; m- u; G4 B! l, }7.2.4 容错, A" T! s9 L% i7 I% [  |- X$ P
    如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服
    % V8 ~5 |$ D' q: |务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一7 Y" b4 _6 [4 I& R1 o7 g7 `
    调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
    % u1 Q1 P. A) c备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分1 @# _7 @' ~  \- u) C
    区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选. o  W6 C2 j  i9 |0 O" x- P
    择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。9 |2 B. s9 m' C( j$ o$ f8 @8 w
    由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少
    + r! h7 }/ V; }: {/ {- J8 s保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。
    ' R+ e& K3 \7 A1 B$ ?3 _5 E全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。
    1 X7 Y# c& o& i, d比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
    9 e0 ?, y- D2 s, p副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很
    4 X. G+ G- d% `, I5 E3 l短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策
      m5 e/ R; k. S3 d+ D: q- |  m. _! Z略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才& ?2 t: Q* `1 F" `
    开始复制第三个副本。- ?: a8 ?- n7 h$ b
    全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一" I/ V+ |. N; d% `$ b
    时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果
    3 K& G3 g' l; [) t9 f全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
    8 s8 d9 g6 X: d, \( l, M* x新的副本作为新的主副本。
    4 M5 Q, I4 ^. V( F. P( S7.2.5 负载均衡
    , n2 l: H  `& X( L6 w0 G  f) Q负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点5 P4 k3 j9 z& o6 y5 a# f
    加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多) Y- I' ?1 J: |6 y/ \( o: q( r
    的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能" [( s- d0 ?9 ]& I$ ?
    可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本
    ! D1 V# I9 i2 [; o0 N' h# A' w替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。
    7 [# r. i# R5 Y3 I2 s, \影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局: T; D# B6 {# @! @+ g
    分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。
    2 \( l. n0 G& `& }; ~. H" r% q  H7.2.6 多租户9 y6 X( v- \! I. V" j; F4 G& d
    云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
    & f  Z0 p" G5 J8 B: S( T使用的系统资源:
    / [* `. [1 Y; Z& [1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
    8 C8 y+ B, R: f7 W6 {& W在10秒内拒绝相应的用户请求;
    & C0 l6 B' A0 ^) n2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容7 l% X$ j" N- R3 f
    量,超过限制时拒绝更新请求,但允许删除操作;
    ' T$ k- @! X) V  z3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,2 |5 M; r; ]! @, m1 H5 z
    此时需要人工介入。' Y8 N; n4 k% ]/ Z3 {
    7.2.7 讨论
    0 Z5 i  [; b* n! ?Microsoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合9 G4 G8 T( f1 n! A" h( L
    用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:
    2 A! D. I) i9 ^' g3 k●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支8 W( X" w$ H0 W( k2 L9 i; B1 b
    持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通1 X3 {: \7 P% l+ B- v4 W2 C
    过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
    ; E! c$ U' _& C$ e! i2 q7 L不同的物理机器。6 ]" D; q5 F5 T0 N) I- n
    ●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接
    5 V" s/ F, t1 Y$ s/ S- N除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我- E- R: l+ U  W0 Y" L
    们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
    6 a2 s" H3 c' E  x: K# B* h了微软,可能会有更多的精力关注业务系统架构。$ S; W8 h, x0 C0 L* a( r
    相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL# t  M9 j/ T: W
    Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节
    1 U! b. V* |( J% [: R/ `. w点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数. q1 K& `2 C3 t5 M7 T
    据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比
    9 B0 a, R  n1 q  u较麻烦。
    2 `" h$ x; `, u) N6 G, z& `# R7 [/ V' N* Y2 v
    3 k8 y2 i% A0 p* G( _% x% u
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-4-29 13:04 , Processed in 0.081186 second(s), 35 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表