java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2703|回复: 0

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

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

    [LV.Master]出神入化

    2062

    主题

    3720

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66592

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

    发表于 2017-3-4 14:06:55 | 显示全部楼层 |阅读模式
    7.3 Google Spanner
    / f; J7 M3 b+ cGoogle Spanner是Google的全球级分布式数据库(Globally-Distributed2 I$ t* S1 M, D: Z/ r9 C
    Database)。Spanner的扩展性达到了全球级,可以扩展到数百个数据中心,数百万
    7 ?% r, K! ~% B; \  n台机器,上万亿行记录。更为重要的是,除了夸张的可扩展性之外,它还能通过同
    : X3 g1 Q- I. o& i# @$ l; v$ C2 A步复制和多版本控制来满足外部一致性,支持跨数据中心事务。' y& i' q6 y) v
    无论从学术研究还是工程实践的角度看,Spanner都是一个划时代的分布式存储, a6 ^6 o0 S; l
    系统。Spanner的成功说明了一点,分布式技术能够和数据库技术有机地结合起来,! F$ T4 I0 B' T+ j6 s# w7 E
    通过分布式技术实现高可扩展性,并呈现给使用者类似关系数据库的数据模型。
    4 r3 \0 n* `  g. j7 ~4 n7.3.1 数据模型1 d! C7 \/ H- N8 y% L$ v+ h
    Spanner的数据模型与6.2节中介绍的Megastore系统比较类似。$ N; e- f# J6 v1 C# p( r0 }. _
    如图7-6所示,对于一个典型的相册应用,需要存储其用户和相册,可以用上面
    8 K% w+ n; ^" m& x的两个SQL语句来创建表。Spanner的表是层次化的,最底层的表是目录表' D, U6 s, h  l8 h; p0 j
    (Directorytable),其他表创建时,可以用INTERLEAVE IN PARENT来表示层次关7 Q3 ?; b1 M7 _
    系。Spanner中的目录相当于Megastore中的实体组,一个用户的信息(user_id,email)
    ' v  r1 p! Z, B% F0 p0 c以及这个用户下的所有相片信息构成一个目录。实际存储时,Spanner会将同一个目
    ! K$ X. a! ]' |录的数据存放到一起,只要目录不太大,同一个目录的每个副本都会分配到同一台
    % ?) U  K! N3 k6 Z1 t. U) u4 v" g机器。因此,针对同一个目录的读写事务大部分情况下都不会涉及跨机操作。
    ! b2 T+ I& G( A4 j图 7-6 Spanner数据模型
    ) U  x! }* v: Z' v( P7 ]7.3.2 架构
    4 Q) A  C3 D& X1 ^# SSpanner构建在Google下一代分布式文件系统Colossus之上。Colossus是GFS的延2 f) f9 N) W  I1 \; N
    续,相比GFS,Colossus的主要改进点在于实时性,并且支持海量小文件。
    3 {0 \- S2 C5 ?! [* _% e( s由于Spanner是全球性的,因此它有两个其他分布式存储系统没有的概念:
    & z% q# t3 O& c" v* j+ t+ F●Universe。一个Spanner部署实例称为一个Universe。目前全世界有3个,一个开
    , d# o" @: O. P发、一个测试、一个线上。Universe支持多数据中心部署,且多个业务可以共享同一
    & w; v6 n/ t% E个Universe。% I. B/ o7 L* }4 b0 x! j
    ●Zones。每个Zone属于一个数据中心,而一个数据中心可能有多个Zone。一般% h$ a! x( O  Q0 G
    来说,Zone内部的网络通信代价较低,而Zone与Zone之间通信代价很高。+ g4 d7 T( V% J- Y' q6 e/ b
    如图7-7所示,Spanner系统包含如下组件:  }  Y* V9 G) c3 v5 U0 c) e, k
    图 7-7 Spanner整体架构8 U/ M4 ~8 x" M) P4 W
    ●Universe Master:监控这个Universe里Zone级别的状态信息。& V  @  r' `! X* W
    ●Placement Driver:提供跨Zone数据迁移功能。& n! Y* G1 z4 k0 o4 d- F* j
    ●Location Proxy:提供获取数据的位置信息服务。客户端需要通过它才能够知道6 X; u4 ~; l2 e) [
    数据由哪台Spanserver服务。0 h8 d  p' @, u- r! P( Q1 J( Z
    ●Spanserver:提供存储服务,功能上相当于Bigtable系统中的Tablet Server。6 R* Z( x3 K% V. ^% T  j1 o: _' n
    每个Spanserver会服务多个子表,而每个子表又包含多个目录。客户端往Spanner/ b+ G+ C9 N* l
    发送读写请求时,首先查找目录所在的Spanserver,接着从Spanserver读写数据。
    : {0 U5 u* j, o  V; O, f! m这里面有一个问题:如何存储目录与Spanserver之间的映射关系?假设每个用户
    ! U* y% g$ t: ~. M2 h2 ~; u. W对应一个目录,全球总共有50亿用户,那么,映射关系的数据规模为几十亿到几百
    3 w3 p( b$ K8 c& b0 z+ r0 B亿,单台服务器无法存放。Spanner论文中没有明确说明,笔者猜测这里的做法和
    + a8 M( i0 O( B. ]1 TBigtable类似,即将映射关系这样的元数据信息当成元数据表格,和普通用户表格采- ~9 I; x" }; @, `* p- t* c
    取相同的存储方式。
    / i" z* V$ F; a: w0 I0 o( O6 N7.3.3 复制与一致性
    2 E$ f. Q7 K) h. L. c# Z* W5 f如图7-8所示,每个数据中心运行着一套Colossus,每个机器有100~1000个子
    ! s3 u4 G1 C% d2 J. x" q9 Z4 e表,每个子表会在多个数据中心部署多个副本。为了同步系统中的操作日志,每个7 X( Z( f1 q2 _4 m% O
    子表上会运行一个Paxos状态机。Paxos协议会选出一个副本作为主副本,这个主副本( j& H& k' ?! x+ l& B7 w$ d
    的寿命默认是10秒。正常情况下,这个主副本会在快要到期的时候将自己再次选为
    " q8 m& o/ ^+ ~$ h主副本;如果出现异常,例如主副本所在的spanserver宕机,其他副本会在10秒后通
    ' H5 N. N% A. [- l) d过Paxos协议选举为新的主副本。
    ! A3 y1 b( [% @图 7-8 Spanner多集群复制: ^. C  v3 r1 B) N0 s, S! |3 m
    通过Paxos协议,实现了跨数据中心的多个副本之间的一致性。另外,每个主副
    4 i/ F* t$ K; [: J% Q* v: D本所在的Spanserver还会实现一个锁表用于并发控制,读写事务操作某个子表上的目& {7 V0 \* O" j9 ^
    录时需要通过锁表避免多个事务之间互相干扰。& o, n/ P3 @0 F: E) P- {
    除了锁表,每个主副本上还有一个事务管理器。如果事务在一个Paxos组里面,+ f+ x) v8 A% b( t' \! |% U
    可以绕过事务管理器。但是一旦事务跨多个Paxos组,就需要事务管理器来协调。# U6 H" b) a8 J  ]+ S: A1 ?
    锁表实现单个Paxos组内的单机事务,事务管理器实现跨多个Paxos组的分布式事  H1 d0 i' n0 Z& ~4 L3 a1 h
    务。为了实现分布式事务,需要实现3.7.1节中提到的两阶段提交协议。有一个Paxos
    ! c7 @/ T4 p3 G$ T& Q7 b组的主副本会成为两阶段提交协议中的协调者,其他Paxos组的主副本为参与者。2 w2 L1 ~* K9 o
    7.3.4 TrueTime( b0 F" Z1 n, T) [" V% a% A6 o
    为了实现并发控制,数据库需要给每个事务分配全局唯一的事务id。然而,在分. h0 B3 P& ~6 {% c
    布式系统中,很难生成全局唯一id。一种方式是采用Google Percolator(Google. V3 F5 L0 O$ h6 F
    Caffeine的底层存储系统)中的做法,即专门部署一套Oracle数据库用于生成全局唯
    1 b6 u3 Q* g2 T  y/ o一id。虽然Oracle逻辑上是一个单点,但是实现的功能单一,因而能够做得很高效。
    - n% j' I$ j6 l* p/ w# J3 USpanner选择了另外一种做法,即全球时钟同步机制TrueTime。
    1 E  i3 E" ?. i+ @: qTrueTime是一个提供本地时间的接口,但与Linux上的gettimeofday接口不一样的2 r" Z" e5 @7 Z, U
    是,它除了可以返回一个时间戳t,还会给出一个误差e。例如,返回的时间戳是20点
    - C/ N/ S$ c( P4 v* b23分30秒100毫秒,而误差是5毫秒,那么真实的时间在20点23分30秒95毫秒到105毫
    % I& s1 [. O, R秒之间。真实的系统e平均下来只有4毫秒。
    5 @9 R- O! `6 R, [4 H4 E* D/ [TrueTime API实现的基础是GPS和原子钟。之所以要用两种技术来处理,是因为
    8 x: R8 o9 Y2 c3 k. @" B# I导致这两种技术失效的原因是不同的。GPS会有一个天线,电波干扰会导致其失灵。% F; G% R+ F9 }, R) \
    原子钟很稳定。当GPS失灵的时候,原子钟仍然能保证在相当长的时间内,不会出现4 j# A! f1 T5 N# G2 z& S, f
    偏差。
    6 s5 C* t& y3 ?3 n每个数据中心需要部署一些主时钟服务器(Master),其他机器上部署一个从时
    9 b0 T! H2 @( L+ M钟进程(Slave)来从主时钟服务器同步时钟信息。有的主时钟服务器用GPS,有的
    6 k6 ~0 l( o! F3 w主时钟服务器用原子钟。每个从时钟进程每隔30秒会从若干个主时钟服务器同步时
    " R" l$ S. X, c8 c9 m钟信息。主时钟服务器自己还会将最新的时间信息和本地时钟比对,排除掉偏差比5 m2 B  _9 y! k# D
    较大的结果。. t& l- F" Z  A' [, j7 f3 {
    7.3.5 并发控制
    " j, Y1 c3 Y) Q, j* u; sSpanner使用TrueTime来控制并发,实现外部一致性,支持以下几种事务:+ Z: I/ h/ R: A9 A
    ●读写事务
    $ _) E# W0 ]: o" u  U& J9 K% f●只读事务
    , D, r& _! e6 N. T0 W( A0 r●快照读,客户端提供时间戳8 e3 [: z3 A4 q9 j
    ●快照读,客户端提供时间范围
    3 a# Q2 L/ i4 Z5 V. L  i) c( m, }1.不考虑TrueTime
    # A( ?8 t4 c& p& N8 `) E1 Z: k首先,不考虑TrueTime的影响,也就是说,假设TrueTime API获得的时间是精确
    & `* K2 o) X7 z# B的。如果事务读写的数据只属于同一个Paxos组,那么,每个读写事务的执行步骤如% q+ l( i/ M' W# e1 A) u
    下:9 h& l! s5 ~4 o4 Y% Y6 F2 N
    1)获取系统的当前时间戳;2 {7 G4 Z  ~: [4 S
    2)执行读写操作,并将第1步取得的时间戳作为事务的提交版本。0 C; \2 e' W& M2 w3 z  ?7 h
    每个只读事务的执行步骤如下:: S, O4 a$ n7 ~! {1 y) C- M
    1)获取系统的当前时间戳,作为读事务的版本;( b. ^) F/ R! k0 N
    2)执行读取操作,返回客户端所有提交版本小于读事务版本的事务操作结果。7 w+ ^0 a0 d- [
    快照读和只读事务的区别在于:快照读将指定读事务的版本,而不是取系统的
    ! P( H8 v. w4 S; R* P当前时间戳。
    ( ?- h. O% _6 S. `  j如果事务读写的数据涉及多个Paxos组,那么,对于读写事务,需要执行一次两/ u4 c$ S/ O( J* h- L
    阶段提交协议,执行步骤如下:: L/ O" l$ M  \
    1)Prepare:客户端将数据发往多个Paxos组的主副本,同时,协调者主副本发
    1 n. x& V9 D3 _# l0 ^! Y9 ^. X, @起prepare协议,请求其他的参与者主副本锁住需要操作的数据。% J/ t% ?: K$ R. E# [$ p  z4 W
    2)Commit:协调者主副本发起Commit协议,要求每个参与者主副本执行提交操
    ) `1 m( K0 |9 P: \& t4 Y& \作并解除Prepare阶段锁定的数据。协调者主副本可以将它的当前时间戳作为该事务
    8 B. X6 d* G, {. }的提交版本,并发送给每个参与者主副本。
    6 m, m$ q6 w6 q& }6 @, r- J# q! g只读事务读取每个Paxos组中提交版本小于读事务版本的事务操作结果。需要注4 q" E( h6 b* S: i- I- T6 T
    意的是,只读事务需要保证不会读到不完整的事务。假设有一个读写事务修改了两: ^, @) u: X: F
    个Paxos组:Paxos组A和Paxos组B,Paxos组A上的修改已提交,Paxos组B上的修改还未
    ( N, Y0 y6 G' k# T. i提交。那么,只读事务会发现Paxos组B处于两阶段提交协议中的Prepare阶段,需要
    3 H4 f  ^9 h3 I. d等待一会,直到Paxos组B上的修改生效后才能读到正确的数据。6 w5 b* J) p: h8 {3 @) X
    2.考虑TrueTime
    3 q. X4 c8 d" P如果考虑TrueTime,并发控制变得复杂。这里的核心思想在于,只要事务T1的0 C3 Q/ e( `* G& o9 T
    提交操作早于事务T2的开始操作,即使考虑TrueTime API的误差因素(-e到+e之间,, O$ |! j4 s5 V( V& O
    e值平均为4ms),Spanner也能保证事务T1的提交版本小于事务T2的提交版本。
    * t& @4 ?9 p5 QSpanner使用了一种称为延迟提交(Commit Wait)的手段,即如果事务T1的提交版本
    6 O3 y" Y3 B4 \) I6 D- L. C为时间戳t commit ,那么,事务T1会在t commit +e之后才能提交。另外,如果事务T2开始
    7 E$ z# ^3 {3 v/ Q的绝对时间为t abs ,那么事务T2的提交版本至少为t abs +e。这样,就保证了事务T1和T2
    . U7 B' X# R) q) d: ]+ a  ~之间严格的顺序,当然,这也意味着每个写事务的延时至少为2e。从这一点也可以$ q4 `+ \  h  c
    看出,Spanner实现功能完备的全球数据库是付出了一定代价的,设计架构时不能盲
    ; O9 ^  |+ O+ B1 x0 M- \目崇拜。- r9 A6 x2 n' v5 G, y( j( L
    7.3.6 数据迁移
    0 Q2 w- y. |' z9 e! r目录是Spanner中对数据分区、复制和迁移的基本单位,用户可以指定一个目录
    4 B+ ?+ v4 W, f, k' ^0 ]) b: S有多少个副本,分别存放在哪些机房中,例如将用户的目录存放在这个用户所在地3 V% Y. i3 U+ q1 n  k. G/ C: Z8 [
    区附近的几个机房中。% A5 n8 p2 I3 X. y( Z+ u9 }5 l& A
    一个Paxos组包含多个目录,目录可以在Paxos组之间移动。Spanner移动一个目9 ]) x/ a- w, S  A8 a+ N) b! [3 u
    录一般出于以下几种考虑:" u; I, ?' Y( P
    ●某个Paxos组的负载太大,需要切分;( s/ g8 B& N4 t9 y
    ●将数据移动到离用户更近的地方,减少访问延时;7 {$ {& s/ S, p- f! }" O! ~2 {' ~
    ●把经常一起访问的目录放进同一个Paxos组。' b0 z0 @/ u7 P/ ]+ B
    移动目录的操作在后台进行,不影响前台的客户端读写操作。一般来说,移动* w9 [! j( |  j2 p0 O$ Q+ C
    一个50MB的目录大约只需要几秒钟时间。实现时,首先将目录的实际数据移动到指
    , `' _3 N, p7 u定位置,然后再用一个原子操作更新元数据,从而完成整个移动过程。6 A1 H8 s* ~2 ?, F8 l; |5 {' Z2 M) b
    7.3.7 讨论
    5 V* l8 H2 r* B5 S. U& M# }2 `Google的分布式存储系统一步步地从Bigtable到Megastore,再到Spanner,这也印
    + K/ o- C$ q- H0 Y证了分布式技术和传统关系数据库技术融合的必然性,即底层通过分布式技术实现
    6 c. q+ s* P# E可扩展性,上层通过关系数据库的模型和接口将系统的功能暴露给用户。# C& T- c5 z+ \, C; v
    阿里巴巴的OceanBase系统在设计之初就考虑到这两种技术融合的必然性,因1 c' P/ x! R& x9 Q8 F) G+ p) [6 q
    此,一开始就将系统的最终目标定为:可扩展的关系数据库。目前,OceanBase已经! d9 s5 `  M5 v, K, B9 O0 c& s! k- X
    开发完成了部分功能并在阿里巴巴各个子公司获得广泛的应用。本书第三篇将详细% F8 C+ L) t& L7 [* A% D
    介绍OceanBase的技术细节。- K( z% a9 m' x/ f# Y

    2 d9 X6 I/ ~8 C) @4 i$ q
    % Z9 g) j! W9 C, v- m7 A5 l# V2 j
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-23 12:42 , Processed in 0.111462 second(s), 30 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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