java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2375|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66151

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

    发表于 2017-3-4 14:03:22 | 显示全部楼层 |阅读模式
    7.2 Microsoft SQL Azure
    9 a, G2 y' j* JMicrosoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL. l* A  l: M! Y$ q3 u  q7 _
    Server(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关
    . {5 b/ a" x" T, z8 d% ?5 I系型数据库的可扩展性和容错能力。* q8 ~9 y  ~) T. a6 R1 }$ R
    7.2.1 数据模型6 b) }# t, c# s
    1.逻辑模型
    % {, P+ t# f) D2 w. i6 l云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避
    7 v! ], r: V( T: ^4 R. x分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,$ x4 V+ _9 U, }
    保证高可用性。
    * C9 h' |) o& Z8 l& |& p  e) x云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有0 W; Z1 x$ N0 J3 X$ S6 d
    主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主. u: Z. Q& x3 k3 B- ^
    键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning
    5 g6 M! \. x$ ikey)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划( g- t4 ?- d2 ~' n8 q' P) m9 T$ n
    分主键为顾客ID(Customers表中的Id列)。如图7-2所示。! V  ^6 ~9 W! T9 W
    图 7-2 云SQL Server数据模型
    , U/ ]% x  X" ]4 [划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的
    3 V) @3 U9 `! p; f* A/ _唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集9 B2 c4 k6 V( G( m; o
    索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。
    3 D0 @$ M) _0 {1 j; D9 z表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行' P& _( v, L; _# u' B- e! t
    以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个1 c% k! d' @1 p* d; F. r, W
    行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。4 u; ?6 I. H- s" g) X0 Q- Y9 q
    如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个" d2 @- L" t8 X% C
    集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
      p1 S( b4 \/ U, x$ Z; V: d, x3 d的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
    6 b, l5 w/ e1 _0 [# z! F模式。- }; Z9 S0 }- i, ^. n- L
    只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-" s% w6 w& K, I; W5 _
    committed)。7 K  ~9 U/ i! x: o# H
    2.物理模型' ?. `3 W$ V5 }1 r. W, D% C" _
    在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区0 [( ^$ r7 X/ `. J6 w
    (partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保
    2 X7 c$ h! a6 z  @4 y了每个行组属于一个唯一的分区。
    9 l6 w" l* L) `7 \- [0 P分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本! |( n" O, i: K5 Q+ H1 K* y
    (默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分: s# a) D1 _) Y3 ^- I! H, ^/ A/ y
    区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL( n: r' l* [0 H( o
    Server的容量上限。
    & L) J% |4 o# f# j" P5 E9 H一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因
    4 `- {4 d' I' _1 N, \而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本- u7 m, a; _; Y( u- x
    分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
    ) x. {8 z9 {) R  F本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同. Z" R; D  P9 @' B
    步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
    ' S2 I2 X) l4 W3 Y- y! r0 K6 Y本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。
    7 {/ j. w: Z3 i# W+ l! K% h2 ?如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两
    0 W4 s" L% p8 U" ~+ J" X; H" ^个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL- e/ r3 t% z- w
    Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能. w( u! `4 F% q5 q6 \3 l6 I$ V8 {
    够很快分散到其他活着的机器上。: H$ P# ?5 j( i; ^
    图 7-3 云SQL Server物理模型1 H: [8 N! d8 @* r- Q/ e
    分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高," E. L$ X6 c  {# v4 }) L
    这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和
    ( p5 v# C- L5 O$ nZ。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行" P9 X/ u5 I% {- v8 A
    负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器
    + ~: ]8 q1 W1 D3 GX,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器
    1 k- `1 K/ K, P  j" m5 E9 I, SZ。
    . ?4 C- T2 ~% t* n2 c8 M7.2.2 架构! ^* A7 o- g1 O0 ?$ n3 g* ~
    云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、
    7 V% q5 H  V7 V& @$ p9 T# N5 C% Z& ]分布式基础部件,如图7-4所示。: V6 N' F# l/ X6 n: U8 \7 N- S+ a7 y
    图 7-4 云SQL Server的分层架构) ^/ C. q2 j6 I# D' g
    下面分别介绍这几个部分:) ]. u$ G" F/ Q" j: x' d
    ●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包. C6 J9 R& N; S( q) V
    含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及
    ) _$ @. C  z. Vschema信息。3 f6 R8 l" Q# N+ Y& l1 X5 H
    ●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个" t5 z: _7 R  w0 J  I8 v+ a
    分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是
    & J5 T& R$ A7 `0 d) R6 t3 u% D7 r主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务
    $ Q) A9 V9 |) Z" O) x0 e) X3 X9 q2 y器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全
    " @# s2 T4 v, w% I4 p局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL$ o" V, n* s8 W# I1 c
    Server工作机,执行负载均衡,副本拷贝等管理操作。
    " z: R) D9 U: T7 i' p●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
    3 `  e3 v) G, J, [* K区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事
    - M7 c# Z2 X) N务操作都在网关与SQL Server实例之间进行。- y! |3 w* E3 b# D: r
    ●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器( ~6 z$ k6 P) v5 T1 j( h8 |3 x
    故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个+ a' o0 c4 O5 ?$ g! X" {
    守护进程。! }. Q- G4 O: d5 C! P5 C) I
    7.2.3 复制与一致性: x; B8 G' H1 n9 I5 J- @0 y
    云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少
    0 V9 F7 J4 l: c/ G! P) T9 w写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操6 @/ g7 r1 {+ t
    作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副
    4 S$ y' ]- {% ?$ N+ e" b9 @1 `$ l本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送" t3 L0 f* w0 s( M7 S
    COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),
    ; m9 u3 j2 Q# e% t每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如
    % Y; G$ z- P. q* @, g果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并
    " e- T/ s6 E# y! a成功返回客户端。
    $ o6 P% q6 ?& A$ G$ ]图 7-5 云SQL Server主备同步2 E' U! U# U' l* Q) a3 }& n( D
    某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事
    ; J& Q5 c* ]3 |; [' ~, }' Q( X+ q务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果
    ( V# w0 h$ t+ s  T0 ?! Q两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日
    & i* [% T* s# }+ L$ s志传给备副本。5 f9 r7 n- C. G' n) k" {$ ]
    主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日/ e/ M* r: f& Y) x8 @) j: K" t
    志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实
    8 t9 k. M5 r' u6 ^3 K践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之$ r3 e; A2 Z7 [- Q" L% Z: F9 S7 f
    间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因
    6 N: g* n1 e2 w2 L: v3 ?; ^此,对写入到磁盘的数据也做校验。
    . ?- J. l! j. i  t) {7.2.4 容错
    0 w2 I! x& ^# W/ |: W如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服
    $ D) A4 p% _1 D( i务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一, k8 S/ {: j2 f8 O4 y
    调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
    7 q, B; \4 f8 w% N) L% j备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分0 F# i) e% j1 l4 H9 j+ [9 F. }
    区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选0 u" [6 [8 }* K- u: j
    择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。* l. Z& F: ]/ P" X
    由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少' ^7 s3 Q( `1 g* Y
    保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。
    8 Y( u0 j  e  i全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。& X6 ~& _: c* a2 l4 {  r) _. u
    比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
    , _/ y, b3 j5 e# V7 @副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很0 }$ J3 e  i) c5 c. b6 Z
    短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策" _" z, L: {; D4 m- ~. H
    略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才$ ~# f7 y9 a3 ^! r, Z' o
    开始复制第三个副本。
    3 A, i  {4 F$ T. ~) g全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一5 @7 e" `% y. [' k3 f' n
    时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果) ]* K7 v5 V3 e1 W4 k6 o/ M
    全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
    4 b+ x, U8 x. g7 t  d新的副本作为新的主副本。
    $ i( }# ~) g! g9 L3 a4 [8 ~8 H+ n7.2.5 负载均衡+ S; d# ?. Y/ |+ w  {
    负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点+ j* X# d5 f. R4 j; T% F# q
    加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多4 b; z! Q/ ~+ I6 b; [
    的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能
    4 d2 b3 w& g/ {5 i% l+ B2 N可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本- h/ i/ M+ t+ s& E, p# J: C& _
    替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。* m* ~& g+ ?- [9 V- t) Y
    影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局: _0 o! Y, `! @
    分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。! l9 f% u5 Y3 i, K
    7.2.6 多租户
    : K7 j2 D$ N( P6 K, K  L; |云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例, u: N. R& j7 u% G, N
    使用的系统资源:
    ' O" v! N! Y( @/ j4 ?6 ?$ R1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
    4 O& K" Y6 I4 Y- C# I/ O6 L在10秒内拒绝相应的用户请求;8 _; w" U0 B% J8 _8 [7 U7 t
    2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容
    ; ~0 V& S" G3 c8 R4 T. t8 T2 d# v' S量,超过限制时拒绝更新请求,但允许删除操作;+ J/ `! M( H' o/ E! Q; B) y
    3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,; B5 W6 C% L2 x: {9 x! I0 _# t
    此时需要人工介入。
    " s' p: F3 y7 ?2 K3 p+ k7.2.7 讨论
    ( |( P7 I: e  Y7 b; o  CMicrosoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合2 `' H* f7 {5 x/ E" }0 D$ M% W! G
    用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:' m, M1 i4 Q4 A
    ●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支
    + m9 k: \* X; c6 D1 K$ g; C持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通: n' _0 Z8 \9 b$ N8 |2 r
    过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
    8 U" y, u3 f0 V+ V' X" ^7 A不同的物理机器。3 p. J( R  M5 z  ~3 _: M! D
    ●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接
    1 V4 t6 X7 k6 n- O/ Q4 ?& O9 F除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我
    3 @8 @; `/ X" r& J# D* M们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
    : I$ H5 }: T" t了微软,可能会有更多的精力关注业务系统架构。* {+ J- o( l' G6 R) r5 }
    相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL
    $ @3 E$ {2 b" \Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节
    4 |9 w* N+ i- l7 V8 c, U4 T7 K8 H点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数- t' L# A3 h( O7 E7 o0 g( b
    据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比
    . f# u* j$ d3 X, }, F! [. T: E较麻烦。$ q$ V* L; Y4 e5 P

    * @! \4 v% u( p. D
    ' P4 y, Y, B3 V# n
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-16 01:50 , Processed in 0.071304 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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