java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2376|回复: 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
    # L7 y: ~% m, \Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL
      X0 T9 V% B/ i: P& ?Server(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关
    - ~- C/ H4 A( ]% P+ P系型数据库的可扩展性和容错能力。8 Q. _  C  ~; Y
    7.2.1 数据模型' g$ e0 }( [/ T  D' ?( [8 ~5 [
    1.逻辑模型
    $ n' {9 h& t: Z: s# b云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避2 y) `1 p5 ~0 E' }1 t, A% O; x
    分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,; h% I+ @5 }' `; c' u
    保证高可用性。
    4 v; c* W1 I) j% u云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有0 U9 H8 @' [5 K9 I
    主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主1 q0 x4 `7 P0 K# }
    键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning* s8 v1 U2 i7 _- i6 R
    key)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划; v- S6 A/ Y: d9 ^/ i/ V
    分主键为顾客ID(Customers表中的Id列)。如图7-2所示。
    # r. v4 p7 `* \5 T图 7-2 云SQL Server数据模型
    * y" A- c; C3 x1 W" H划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的
    " {3 y: s' y2 g/ X, s9 Q唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集
    : E! B9 G% b/ Z# I5 w索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。( J, J" n+ a# S, W/ \
    表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行
    / b& E& x  k" P8 \+ b以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个& X0 ^, H  c) ^: C8 Q
    行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。5 l: h  ]7 C( u9 O. q7 w
    如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个- m4 v- e, }7 u# V/ [$ Z
    集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
    2 c( m3 U4 r: E; S) A- Y的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
    , ~! }7 }$ P9 |: t! F+ r模式。! A! a! O; _7 ~* N5 ^1 g, C" s( {
    只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-7 ]4 y0 }/ D4 a& ~
    committed)。
    ( h. x& l6 P; s' K0 ]6 M! L% ^6 e2.物理模型8 f5 d7 N2 Z: t7 _
    在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区7 F& ]# a6 j$ d& i# R
    (partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保' q' I  l! ]4 p$ n9 i3 X' Y
    了每个行组属于一个唯一的分区。
    ' }2 W! h3 Z7 E! T+ k0 K- x' _* `1 s分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本
    " N9 d6 |* g' L7 t4 R9 D(默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分
    2 ^. q. J7 Q4 l$ |区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL- U9 D% d0 F8 W( o+ n: V  B3 Z
    Server的容量上限。" H& e; z/ N% [% u
    一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因
    / Z4 q- U  D6 h6 c$ V而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本3 {$ a( ]% c( I$ m
    分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副
    ) R4 O* M5 [4 j! [9 V0 U本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同
    * e( O. j% n/ j# |! A9 i步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副; P4 v4 j$ E9 n$ @/ \3 l# z* v+ u
    本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。/ B' w% p# b1 J  x+ G  _' B) H2 ?
    如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两5 D2 K# C0 M0 s0 H& x6 B/ U
    个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL: Q+ ~& C; e. Q' n& _+ `$ w+ u
    Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能  q; Y5 R2 ~- i9 b6 g, H
    够很快分散到其他活着的机器上。
    $ |& l6 P% Q! D% O图 7-3 云SQL Server物理模型. @7 h2 R" L5 f; U8 y' S- x
    分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,+ y1 o& t7 x* d# e, i& i0 g+ C+ Z$ i
    这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和/ D9 T$ x3 I. q- j- p+ o
    Z。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行/ {6 F! i" [: f+ O* t9 u' A
    负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器  O9 W' P5 u- {
    X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器4 B; f- w7 P" ^% _/ y: ?, T
    Z。# o' E$ V2 s. F8 [
    7.2.2 架构
    " _% ~9 _- Z* x, t  ]云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、: N, e0 @& T9 q/ I9 V
    分布式基础部件,如图7-4所示。6 ?5 o! |: X& n
    图 7-4 云SQL Server的分层架构/ }3 q* Z! N/ v8 Y$ X+ W& h$ _( y
    下面分别介绍这几个部分:
    . m& R* R( d5 {●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包
    % Q& \6 d) ~3 s! l/ B含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及4 ^3 B  ~  i* N* J' Y
    schema信息。
    : L. q8 z; w+ J. |! Y●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个0 |! z" ?5 y: e
    分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是4 U7 x, g; P! i
    主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务) ~- C5 F0 x# q# d7 X: o6 G  {
    器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全2 a, l5 L! E: u  d$ D
    局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL
    3 e9 _# [6 S5 f1 [, r. h* ^& FServer工作机,执行负载均衡,副本拷贝等管理操作。# T7 k- y( E3 w4 s, `
    ●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
    $ j7 j- o! n; h# i& u0 Z8 m8 \区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事0 w+ k1 b$ {& i
    务操作都在网关与SQL Server实例之间进行。
    ; m7 J" V9 x# @●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器4 B2 K" ~( Y6 E" C& m/ ?- P; o( E
    故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个" W$ R" p' W. H4 j+ q
    守护进程。
    ' t: L# c3 O( F7.2.3 复制与一致性
      d3 d1 w; e+ }  I0 }云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少) M3 ]" I# ~* [: ?5 a, h7 S6 T
    写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操! H8 N4 P& j8 W8 x. P. a
    作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副
    ; |, `0 H3 ?/ o9 ^本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送
    7 W, K: A- F( a& |6 m7 \$ S0 m9 \COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),
    - M5 M: Y7 D% ^4 z; _# ^" r) ]7 D每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如) D% |# K8 b; W& n% R: u' H
    果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并
      R1 q; b' X  k, d& [) n$ Y0 ]成功返回客户端。
    $ y; T: g0 R3 J7 A3 ~图 7-5 云SQL Server主备同步
    1 U! e+ e; H7 q6 L: t: s某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事2 u% s( ~+ p3 S; Z
    务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果
    ! U0 m# w% [5 D' n2 O0 ~) V! F7 a两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日
    & S6 @3 U2 l) I1 o' ^志传给备副本。8 l6 M4 Z) [/ s7 J
    主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日
    ; [' s. O: r0 o  Y* l) a' V5 x. X, Q志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实
    ! J3 ^% `2 H  ?" I/ v4 }3 d  D4 k践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之
    1 t4 n/ \$ m% @( S5 V间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因9 d5 i5 _+ a  F5 o
    此,对写入到磁盘的数据也做校验。
    - |" Z2 Q2 M# t: F/ U* p4 P7.2.4 容错
    8 \' H& g! T+ T' z( G# K如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服& Y/ W: Y  Y& G3 i& {3 a. H+ r
    务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一- r# }+ R, P) |$ G" E0 [2 t$ p
    调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
    $ R3 m' Y" I. W) @' S" y/ J备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分+ }; J$ C9 f! K6 a
    区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选
    ; E: f3 T8 v- c% k" @! v择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。
    6 Q$ k5 @; D2 b- W由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少
    1 r. M# C6 s5 N+ k: o* ?% ?; r保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。/ z9 U. l, e) d, s, I- z8 h5 `
    全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。( A4 U, G$ H$ \8 I/ T5 U
    比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
    4 \% r7 T' E4 k2 n副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很+ n3 T% Q% r; S: r4 l) s
    短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策
    ) `, K8 ~" N& T/ y4 q% j略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才1 u) u1 W: L8 J8 M! a0 }
    开始复制第三个副本。
    0 ~1 ^" T% I' ]. T  C全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一, m8 \/ L2 |  n3 R1 A4 j
    时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果
    ) M2 \" W! x( i# h! m+ H全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
    : [. R/ @6 W* J新的副本作为新的主副本。' G' D* O& E8 ?5 |8 E/ K9 m
    7.2.5 负载均衡; m3 i2 K" y" Z$ ^
    负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点  \4 V# @) w) Q
    加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多& C& p: k# K+ r! C8 T
    的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能
    & D% q" M7 A- G0 B# j  y可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本% X2 `6 {. Q, A5 d  ]( `9 Z
    替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。
    - I+ ?0 t) \. u0 C3 E影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局+ }: \$ Q" \0 {% b- n; {6 M
    分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。0 W: n# w' R' n. e
    7.2.6 多租户
      J+ \  ~$ Y2 i, {8 a8 Z云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
    % R; K1 K4 z# l. G  R使用的系统资源:
    2 h) D: N$ r6 g1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将( p5 ?3 a4 W/ u% r, _
    在10秒内拒绝相应的用户请求;9 e# F+ v/ a# A2 N  Z0 O: C
    2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容0 N1 T, p3 G2 t. [1 D' \- @8 q# a
    量,超过限制时拒绝更新请求,但允许删除操作;3 c3 A1 ]6 T3 z/ ]& s
    3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,
    ! i! {" r0 n5 m$ v: d/ A  v+ f此时需要人工介入。
    8 M2 w. M- l+ Z. V7.2.7 讨论8 o- [" X- b( ^* B- c" N
    Microsoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合2 {$ A; C" s9 j7 \; I, }( K
    用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:
    0 n+ r- j& E9 k) u/ l+ ~! L●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支! i6 s+ j; V* V
    持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通
    ) v' R) t9 @5 T: s过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
    , m6 z# Z5 |/ `1 P) w0 @不同的物理机器。
      ^! ], m# D7 A) X, j: I●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接" m/ S. A' C' g! X# A' k* t
    除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我
    % f  B: q# B( ]5 w% V+ X  u% l/ u们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
      x7 {' q4 U0 C1 k% n) p7 R9 d了微软,可能会有更多的精力关注业务系统架构。5 ?) t+ z7 ]# l! z2 @) a1 L
    相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL
    ! ?- S) v" ^4 F2 NAzure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节, b. R4 t2 I7 v; X7 c' p6 C
    点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
    - j5 v7 W& t8 w) _9 i/ e5 |$ c$ B据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比
      Z- d7 H) w) Y4 A5 L  [3 z较麻烦。. o9 L6 k, H9 M" C1 Z! I
    $ q5 p. l- k! S6 B* Q. Z$ u

    , t! d0 w* A6 b0 s$ g
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-16 07:30 , Processed in 0.157666 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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