java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2587|回复: 0

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

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

    [LV.Master]出神入化

    2040

    主题

    3698

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66476

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

    发表于 2017-3-4 14:03:22 | 显示全部楼层 |阅读模式
    7.2 Microsoft SQL Azure7 F: G2 m5 s: q0 z
    Microsoft SQL Azure是微软的云关系型数据库,后端存储又称为云SQL- ^/ j3 v) V" G' y; u6 j! N
    Server(Cloud SQL Server)。它构建在SQL Server之上,通过分布式技术提升传统关% h" r) C" o: A7 t
    系型数据库的可扩展性和容错能力。) a4 d$ f1 R6 L1 H
    7.2.1 数据模型
    3 F0 \2 i0 }) s; q9 j1.逻辑模型
    4 N1 r( }( w& K6 {云SQL Server将数据划分为多个分区,通过限制事务只能在一个分区执行来规避
    ! B: D$ I5 }$ }9 ]+ a( o) [分布式事务。另外,它通过主备复制(Primary-Copy)协议将数据复制到多个副本,; Z! k+ }* m: @2 s3 f$ \" W8 A
    保证高可用性。! T  \! n$ ~. L& C  Z  f' u
    云SQL Server中一个逻辑数据库称为一个表格组(table group),它既可以是有
    / R, G5 M, q) u8 C  u主键的,也可以是无主键的,本节只讨论有主键的表格组。如果一个表格组是有主
    ; _/ v3 G7 D) P) b0 f键的,要求表格组中所有的表格都有一个相同的列,称为划分主键(partitioning
    3 |# [9 H  H; c# J& l3 {/ lkey)。图中的表格组包含两个表格,顾客表(Customers)和订单表(Orders),划$ V1 c6 N1 Z: j
    分主键为顾客ID(Customers表中的Id列)。如图7-2所示。
    2 l8 g0 E5 @1 u7 p4 f图 7-2 云SQL Server数据模型. y( N, W1 w" z. H* A% J0 s5 s
    划分主键不需要是表格组中每个表格的唯一主键。图7-2中,顾客ID是顾客表的
    5 K- R& \6 p  @% ?3 J唯一主键,但不是订单表的唯一主键。同样,划分主键也不需要是每个表格的聚集
    $ W7 m: M$ U% [* V1 G7 p索引,订单表的聚集索引为组合主键<顾客ID,订单ID>(<Id,Oid>)。: d( {0 o+ w1 V: c4 |
    表格组中所有划分主键相同的行集合称为行组(row group)。顾客表的第一行4 W# g  ?3 G* k: U
    以及订单表的前两行的划分主键均为34,构成一个行组。云SQL Server只支持同一个2 j5 v' h" R( o* G4 @
    行组内的事务,这就意味着,同一个行组的数据逻辑上会分布到一台服务器。
    ; F3 h  k; p' }# m- u2 m# f如果表格组是有主键的,云SQL Server支持自动地水平拆分表格组并分散到整个
    9 X3 F$ L* R7 z集群。同一个行组总是被一台物理的SQL Server服务,从而避免了分布式事务。这样
    ) k1 T4 V( W4 _' g的好处是避免了分布式事务的两个问题:阻塞及性能,当然,也限制了用户的使用
    % X! b9 n; p) F$ F模式。& Z/ n* b& {; W4 {
    只读事务可以跨多个行组,但事务隔离级别最多支持读取已提交(read-
    8 {/ y& k. y5 e0 ?committed)。# n+ T7 Y3 s& e7 R' a" {8 Z. _) A  d8 r  [
    2.物理模型% W8 @$ B  U  y# g
    在物理层面,每个有主键的表格组根据划分主键列有序地分成多个数据分区, R  p* s2 V- }2 D1 s
    (partition)。这些分区之间互相不重叠,并且覆盖了所有的划分主键值。这就确保
    ) z5 X8 ]$ F/ Y2 k5 t( W0 @* i了每个行组属于一个唯一的分区。
    8 j' L+ _( d- q2 s( ?分区是云SQL Server复制、迁移、负载均衡的基本单位。每个分区包含多个副本. Q7 ]- c, [0 F( o: a
    (默认为3),每个副本存储在一台物理的SQL Server上。由于每个行组属于一个分; _  E& r1 L" \
    区,这也就意味着每个行组的数据量不能超过分区允许的最大值,也就是单台SQL8 p+ w8 M, D. v% @3 `
    Server的容量上限。
    7 n: h- O9 e* b, n& @: T一般来说,同一个交换机或者同一个机架的机器同时出现故障的概率较大,因) E+ F7 j' q' W, b" t6 |, f  D
    而它们属于同一个故障域(failure domain)。云SQL Server保证每个分区的多个副本
    5 q4 w' x+ Z& P) P- X" X分布到不同的故障域。每个分区有一个副本为主副本(Primary),其他副本为备副1 Q- C) g( h& q% H/ m* Y4 V( l* \5 c
    本(Secondary)。主副本处理所有的查询,更新事务并以操作日志的形式将事务同8 ~; Q/ D1 T8 m8 q$ I
    步到备副本,备副本接收主副本发送的事务日志并应用到本地数据库。目前,备副
    " B4 {  @; p# b2 {/ e" R' ^本不支持读操作,当然,这是很容易实现的,只是可能读取到过期的数据。. B# h" P- x& I
    如图7-3所示,有四个逻辑分区PA、PB、PC、PD,每个分区有一个主副本和两
    7 T$ l' P# \5 w, o: O个备副本。例如,PA有一个主副本PA P 以及两个备副本PA S1 和PA S2 。每台物理SQL% e( P( V) Q6 J
    Server数据库混合存放了主副本和备副本。如果某台机器发生故障,它上面的分区能
    ) D, T! o3 _/ O3 w" v" B& B够很快分散到其他活着的机器上。5 f( ?1 s7 q' i6 [  Y/ \2 \" m
    图 7-3 云SQL Server物理模型: o+ E6 D- E4 u; y: d! {& j
    分区划分是动态的,如果某个分区超过了允许的最大分区大小或者负载太高,
    4 m3 f: @2 T- {) l, ~, S: k& }) `9 N这个分区将分裂为两个分区。假设分区A的主副本在机器X,它的备副本在机器Y和  `7 e4 W* Z5 w; b
    Z。如果分区A分裂为A1和A2,每个副本都需要相应地分裂为两段。为了更好地进行
    3 G. d( J; R; ?( q' n1 j负载均衡,每个副本分裂前后的角色可能不尽相同。例如,A1的主副本仍然在机器/ a9 s; z; P* d/ j( C  \' ^- w) ~3 o
    X,备副本在机器Y和机器Z;而A2的主副本可能在机器Y,备副本在机器X和机器
    # J: B& c' ^& T$ |5 s2 GZ。
    3 ]8 Z8 H& Y8 a6 S* n7.2.2 架构$ F' S; E! {6 \4 R1 w9 h
    云SQL Server分为四个主要部分:SQL Server实例、全局分区管理、协议网关、
    # K- K" ?! M- [9 k% s分布式基础部件,如图7-4所示。
    & h% g# L" e# p1 t( t! s9 E图 7-4 云SQL Server的分层架构+ t* r% N5 Y8 u, X- `; `6 p8 D
    下面分别介绍这几个部分:
    , U2 L+ O4 Q, p●每个SQL Server实例是一个运行着SQL Server的物理进程。每个物理数据库包
    1 e1 w. e, m. l& _, v) v& R含多个子数据库,它们之间互相隔离。子数据库是一个分区,包含用户的数据以及
    / M- D/ k, b$ C3 e6 G  y8 ]schema信息。
    * P2 k: o" l% j2 O1 M●全局分区管理器(Global Partition Mana- ger)维护分区映射表信息,包括每个
    : A0 s4 U" @/ X% |9 Z分区的主键范围,每个副本所在的服务器,以及每个副本的状态,包括副本当前是& g0 x4 _0 ^$ j: ]; ^
    主还是备,前一次是主还是备,正在变成主,正在被拷贝或者正在被追赶。当服务
    1 j1 b2 X" \7 c" ~8 R0 p: _器发生故障时,分布式基础部件检测并确保服务器故障后通知全局分区管理器。全
    ! E/ n1 G6 n5 N4 _9 z1 ]局分区管理器接着执行重新配置操作。另外,全局分区管理器监控集群中的SQL
    6 m9 T) r4 G( |' h1 p/ _8 n  \Server工作机,执行负载均衡,副本拷贝等管理操作。
    6 J8 w: s1 w! ?0 x" V4 }●协议网关(Protocol Gateway)负责将用户的数据库连接请求转发到相应的主分
    " _6 p& f; n& @9 Y% [$ G; k区上。协议网关通过全局分区管理器获取分区所在的SQL Server实例,后续的读写事/ s' d( c) ]; b
    务操作都在网关与SQL Server实例之间进行。  c( [, U$ ]/ D+ d
    ●分布式基础部件(Distributed Fabric)用于维护机器上下线状态,检测服务器
    1 [/ i1 D+ t& f) A: c故障并为集群中的各种角色执行选举主节点操作。它在每台服务器上都运行了一个
      J# T1 U9 o# K守护进程。
    8 s; |' A3 A7 O7.2.3 复制与一致性+ Y, W8 z1 y! Y
    云SQL Server采用"Quorum Commit"的复制协议,用户数据存储三个副本,至少' `1 S2 G# b( n! \1 G! t1 @
    写成功两个副本才可以返回客户端成功。如图7-5所示,事务T的主副本分区生成操
    6 @' u- @5 x. U7 w- {3 E作日志并发送到备副本。如果事务T回滚,主副本会发送一个ABORT消息给备副- c) p4 ]3 D; Q5 V3 Q$ g. r) N2 E
    本,备副本将删除接收到的T事务包含的修改操作。如果事务T提交,主副本会发送6 i1 O' R* p. F! `, D$ E
    COMMIT消息给备副本,并带上事务提交顺序号(Commit Sequence Number,CSN),; H9 U3 m; P  X# ]7 U4 X  U
    每个备副本会把事务T的修改操作应用到本地数据库并发送ACK消息回复主副本。如
      k1 c" t! w; y9 e' i果主副本接收到一半以上的成功ACK(包含主副本自身),它将在本地提交事务并
    6 K' z2 P7 X# x: A成功返回客户端。
    0 w7 ?  J% b, A7 n+ Q' ?图 7-5 云SQL Server主备同步% i: ?* t, q; t; v# |
    某些备副本可能出现故障,恢复后将往主副本发送本地已经提交的最后一个事3 r. E; Y* \( D  x
    务的提交顺序号。如果两者相差不多,主副本将直接发送操作日志给备副本;如果9 n& Y; e5 E3 }/ o  N
    两者相差太多,主副本将首先把数据库快照传给备副本,再把快照点之后的操作日( g% ~; T9 J* v" n( [
    志传给备副本。& m5 o1 {' s0 t' T4 B1 p4 {0 u  H% a
    主副本与备副本之间传送逻辑操作日志,而不是对磁盘物理页的redo&undo日
    0 N5 A9 S6 C5 E! |- f7 Y3 }$ L志。数据库索引及schema相关操作(如创建,删除表格)也通过操作日志发送。实0 A; l8 W: I* J5 L# k: m7 L) I
    践过程中发现了一些硬件问题,比如某些网卡会表现出错误的行为,因此对主备之
    $ V) z. d, O0 u1 V% S6 Z; ~: p间的所有消息都会做校验(checksum)。同样,某些磁盘会出现“位翻转”错误,因( X, Q; V+ d, {0 T* I, ?' M0 n: s
    此,对写入到磁盘的数据也做校验。; f. ^/ n% S/ W% c# \
    7.2.4 容错2 C. m4 p' Y1 I
    如果数据节点发生了故障,需要启动宕机恢复过程。每个SQL Server实例最多服7 Q0 n' m0 f$ X$ q4 Y# g2 h3 Q
    务650个逻辑分区,这些分区可能是主副本,也可能是备副本。全局分区管理器统一
    ) P$ G3 p2 k. f7 }& k3 H# ]9 b% A2 W) f调度,每次选择一个分区执行重新配置(Reconfiguration)。如果出现故障的分区是
    7 N3 d2 u- M- l" ]' y( q/ Q备副本,全局分区管理器首先选择一台负载较轻的服务器,接着从相应的主副本分/ `& _# D' o7 ]' \4 f0 O
    区拷贝数据来增加副本;如果出现故障的分区是主副本,首先需要从其他副本中选
    5 L' ?. L( x  q/ p择一个最新的备副本作为新的主副本,接着选择一台负载较轻的机器增加备副本。
    1 J, N! {" Z1 P由于云SQL Server采用"Quorum Commit"复制协议,如果每个分区有三个副本,至少7 m' e7 z, @0 Q6 F  P
    保证两个副本写入成功,主副本出现故障后选择最新的备副本可以保证不丢数据。
    5 v3 I: j2 ]5 d1 o3 J/ H全局分区管理器控制重新配置任务的优先级,否则,用户的服务会受到影响。
    ' G6 x4 \# ^5 L比如某个数据分片的主副本出现故障,需要尽快从其他副本中选择备副本切换为主
    5 E1 }: D- t# H副本;某个数据分片只有一个副本,需要优先复制。另外,某些服务器可能下线很
    5 u9 T7 E) U5 e: i8 k+ n: T  T短一段时间后重新上线,为了避免过多无用的数据拷贝,这里还需要配置一些策' l7 b7 q* s( {% K# r3 l
    略:比如只有两个副本的状态持续较长一段时间(SQL Azure默认配置为两小时)才/ G. d" y* T9 v1 c$ e1 x0 j
    开始复制第三个副本。  c" V2 |' d7 i9 b4 c8 I: S5 f) Q* W4 [+ U
    全局分区管理器也采用"Quorum Commit"实现高可用性。它包含七个副本,同一( q& o- e5 i3 K2 A
    时刻只有一个副本为主,分区相关的元数据操作至少需要在四个副本上成功。如果" v; G* H& T0 [, G+ m
    全局分区管理器主副本出现故障,分布式基础部件将负责从其他副本中选择一个最
    $ |# z. Q5 O1 a2 A# O新的副本作为新的主副本。0 K1 K1 C5 Y. H7 c5 w) V
    7.2.5 负载均衡
    4 Y, s. [: E: r6 A* u! I% T) o负载均衡相关的操作包含三种:副本迁移以及主备副本切换。新的服务器节点
    - V  v2 [5 V7 [加入时,系统内的分区会逐步地迁移到新节点,这里需要注意的是,为了避免过多0 X1 B1 ]; M0 ~6 h4 O7 }6 @; z& \
    的分区同时迁入新节点,全局分区管理器需要控制迁移的频率,否则系统整体性能' I3 U) U! f9 k. f2 |
    可能会下降。另外,如果主副本所在服务器负载过高,可以选择负载较低的备副本% i* D5 n. ]0 M- E4 z0 i7 w  n1 [# a
    替换为主副本提供读写服务。这个过程称为主备副本切换,不涉及数据拷贝。
    ; z8 ?  ]4 U+ b0 s0 x影响服务器节点负载的因素包括:读写次数,磁盘/内存/CPU/IO使用量等。全局
    0 A/ Z; @) V" D$ V" H7 E2 q分区管理器会根据这些因素计算每个分区及每个SQL Server实例的负载。  h$ [3 A* ?7 t: ~: j! R
    7.2.6 多租户5 G7 ]3 J1 ], t  R
    云存储系统中多个用户的操作相互干扰,因此需要限制每个SQL Azure逻辑实例
    ( m+ Z* m7 H4 f$ R使用的系统资源:
    ) m6 i# P5 Q: }* I1)操作系统资源限制,比如CPU、内存、写入速度,等等。如果超过限制,将
    % [( W7 S" E7 P/ R4 K3 i在10秒内拒绝相应的用户请求;
    3 Q# j* C' Y0 S2 k2)SQL Azure逻辑数据库容量限制。每个逻辑数据库都预先设置了最大的容- k, S7 ?# Z8 y
    量,超过限制时拒绝更新请求,但允许删除操作;' X  |7 W; V: D/ \* s
    3)SQL Server物理数据库数据大小限制。超过该限制时返回客户端系统错误,* h7 |) y4 k' y6 s( B7 I
    此时需要人工介入。' e+ K$ Z( n- M% {( d6 k( r
    7.2.7 讨论
    * J% p- c* F5 \' u1 @. oMicrosoft SQL Azure将传统的关系型数据库SQL Server搬到云环境中,比较符合
    ( j& v* }6 K# A% ?# r用户过去的使用习惯。当然,云SQL Server与单机SQL Server还是有一些区别:
    . s! `' u& h" F" D5 \●不支持的操作:Microsoft Azure作为一个针对企业级应用的平台,尽管尝试支
    # H% `; E1 h# q& f7 s1 ]持尽量多的SQL特性,仍然有一些特性无法支持。比如USE操作:SQL Server可以通
    6 Y6 c. c3 u' F8 H: ?1 k过USE切换数据库,不过在SQL Azure不支持,这是因为不同的逻辑数据库可能位于
    4 c& V+ |9 W% y7 ~5 c% M不同的物理机器。$ o9 U9 a" y/ M! v+ }$ I2 f
    ●观念转变:对于开发人员,需要用分布式系统的思维开发程序,比如一个连接  _5 w# x" R( r8 R7 C# z( R
    除了成功、失败还有第三种不确定状态:云端没有返回操作结果,操作是否成功我
    % o+ A7 h- H6 w2 Q1 j& L0 V们无从得知;对于DBA,数据库的日常维护,比如升级、数据备份等工作都移交给
    ; d# \1 g- ^* [* C. s7 R1 b了微软,可能会有更多的精力关注业务系统架构。
      A# T! \- S# _5 P+ r相比Azure Table Storage,SQL Azure在扩展性上有一些劣势,例如,单个SQL4 X; K& Q4 U7 d8 ?% Y+ h0 H) O
    Azure实例大小限制。Azure Table Storage单个用户表格的数据可以分布到多个存储节
    9 X3 w$ t: g! D9 _8 Q1 M0 W7 c点,数据总量几乎没有限制;而单个SQL Azure实例最大限制为50GB,如果用户的数
    + Q, b, v  \7 L1 S$ [据量大于最大值,需要用户在应用层对数据库进行水平或者垂直拆分,使用起来比
    * b# w: u9 h' r$ ?& |$ f较麻烦。% u* k$ J2 Q; N1 y7 @
    ) Z% g) M3 s2 U' x( F
    2 U5 s2 P( J9 [- z
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-1-22 15:08 , Processed in 0.151891 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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