精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

全球級(jí)的分布式數(shù)據(jù)庫(kù)Google Spanner原理

大數(shù)據(jù) 分布式
Spanner 是Google的全球級(jí)的分布式數(shù)據(jù)庫(kù) (Globally-Distributed Database) 。Spanner的擴(kuò)展性達(dá)到了令人咋舌的全球級(jí),可以擴(kuò)展到數(shù)百萬的機(jī)器,數(shù)已百計(jì)的數(shù)據(jù)中心,上萬億的行。更給力的是,除了夸張的擴(kuò)展性之外,他還能 同時(shí)通過同步復(fù)制和多版本來滿足外部一致性,可用性也是很好的。沖破CAP的枷鎖,在三者之間完美平衡。

Google Spanner簡(jiǎn)介

Spanner 是Google的全球級(jí)的分布式數(shù)據(jù)庫(kù) (Globally-Distributed Database) 。Spanner的擴(kuò)展性達(dá)到了令人咋舌的全球級(jí),可以擴(kuò)展到數(shù)百萬的機(jī)器,數(shù)已百計(jì)的數(shù)據(jù)中心,上萬億的行。更給力的是,除了夸張的擴(kuò)展性之外,他還能 同時(shí)通過同步復(fù)制和多版本來滿足外部一致性,可用性也是很好的。沖破CAP的枷鎖,在三者之間完美平衡。

Spanner是個(gè)可擴(kuò)展,多版本,全球分布式還支持同步復(fù)制的數(shù)據(jù)庫(kù)。他是Google的第一個(gè)可以全球擴(kuò)展并且支持外部一致的事務(wù)。 Spanner能 做到這些,離不開一個(gè)用GPS和原子鐘實(shí)現(xiàn)的時(shí)間API。這個(gè)API能將數(shù)據(jù)中心之間的時(shí)間同步精確到10ms以內(nèi)。因此有幾個(gè)給力的功能:無鎖讀事務(wù), 原子schema修改,讀歷史數(shù)據(jù)無block。

EMC中國(guó)研究院實(shí)時(shí)緊盯業(yè)界動(dòng)態(tài),Google最近發(fā)布的一篇論文《Spanner: Google’s Globally-Distributed Database》, 筆者非常感興趣,對(duì)Spanner進(jìn)行了一些調(diào)研,并在這里分享。由于Spanner并不是開源產(chǎn)品,筆者的知識(shí)主要來源于Google的公開資料,通過現(xiàn)有公開資料僅僅只能窺得Spanner的滄海一粟,Spanner背后還依賴有大量Google的專有技術(shù)。

下文主要是Spanner的背景,設(shè)計(jì)和并發(fā)控制。

Spanner背景

要搞清楚Spanner原理,先得了解Spanner在Google的定位。

從上圖可以看到。Spanner位于F1和GFS之間,承上啟下。所以先提一提F1和GFS。

#p#

F1

和眾多互聯(lián)網(wǎng)公司一樣,在早期Google大量使用了Mysql。Mysql是單機(jī)的,可以用Master-Slave來容錯(cuò),分區(qū)來擴(kuò)展。但是需 要大量的手工運(yùn)維工作,有很多的限制。因此Google開發(fā)了一個(gè)可容錯(cuò)可擴(kuò)展的RDBMS——F1。和一般的分布式數(shù)據(jù)庫(kù)不同,F(xiàn)1對(duì)應(yīng)RDMS應(yīng)有的 功能,毫不妥協(xié)。起初F1是基于Mysql的,不過會(huì)逐漸遷移到Spanner。

F1有如下特點(diǎn):

  • 7×24高可用。哪怕某一個(gè)數(shù)據(jù)中心停止運(yùn)轉(zhuǎn),仍然可用。
  • 可以同時(shí)提供強(qiáng)一致性和弱一致。
  • 可擴(kuò)展
  • 支持SQL
  • 事務(wù)提交延遲50-100ms,讀延遲5-10ms,高吞吐

眾所周知Google BigTable是重要的NoSql產(chǎn)品,提供很好的擴(kuò)展性,開源世界有HBase與之對(duì)應(yīng)。為什么Google還需要F1,而不是都使用 BigTable呢?因?yàn)锽igTable提供的最終一致性,一些需要事務(wù)級(jí)別的應(yīng)用無法使用。同時(shí)BigTable還是NoSql,而大量的應(yīng)用場(chǎng)景需 要有關(guān)系模型。就像現(xiàn)在大量的互聯(lián)網(wǎng)企業(yè)都使用Mysql而不愿意使用HBase,因此Google才有這個(gè)可擴(kuò)展數(shù)據(jù)庫(kù)的F1。而Spanner就是 F1的至關(guān)重要的底層存儲(chǔ)技術(shù)。

Colossus(GFS II)

Colossus也是一個(gè)不得不提起的技術(shù)。他是第二代GFS,對(duì)應(yīng)開源世界的新HDFS。GFS是著名的分布式文件系統(tǒng)。

初代GFS是為批處理設(shè)計(jì)的。對(duì)于大文件很友好,吞吐量很大,但是延遲較高。所以使用他的系統(tǒng)不得不對(duì)GFS做各種優(yōu)化,才能獲得良好的性能。那為什么 Google沒有考慮到這些問題,設(shè)計(jì)出更完美的GFS ?因?yàn)槟莻€(gè)時(shí)候是2001年,Hadoop出生是在2007年。如果Hadoop是世界領(lǐng)先水平的話,GFS比世界領(lǐng)先水平還領(lǐng)先了6年。同樣的 Spanner出生大概是2009年,現(xiàn)在我們看到了論文,估計(jì)Spanner在Google已經(jīng)很完善,同時(shí)Google內(nèi)部已經(jīng)有更先進(jìn)的替代技術(shù)在 醞釀了。筆者預(yù)測(cè),最早在2015年才會(huì)出現(xiàn)Spanner和F1的山寨開源產(chǎn)品。

Colossus是第二代GFS。Colossus是Google重要的基礎(chǔ)設(shè)施,因?yàn)樗梢詽M足主流應(yīng)用對(duì)FS的要求。Colossus的重要改進(jìn)有:

  • 優(yōu)雅Master容錯(cuò)處理 (不再有2s的停止服務(wù)時(shí)間)
  • Chunk大小只有1MB (對(duì)小文件很友好)
  • Master可以存儲(chǔ)更多的Metadata(當(dāng)Chunk從64MB變?yōu)?MB后,Metadata會(huì)擴(kuò)大64倍,但是Google也解決了)

Colossus可以自動(dòng)分區(qū)Metadata。使用Reed-Solomon算法來復(fù)制,可以將原先的3份減小到1.5份,提高寫的性能,降低延遲。客戶端來復(fù)制數(shù)據(jù)。具體細(xì)節(jié)筆者也猜不出。

與BigTable, Megastore對(duì)比

Spanner主要致力于跨數(shù)據(jù)中心的數(shù)據(jù)復(fù)制上,同時(shí)也能提供數(shù)據(jù)庫(kù)功能。在Google類似的系統(tǒng)有BigTable和Megastore。和這兩者相比,Spanner又有什么優(yōu)勢(shì)呢。

BigTable在Google得到了廣泛的使用,但是他不能提供較為復(fù)雜的Schema,還有在跨數(shù)據(jù)中心環(huán)境下的強(qiáng)一致性。Megastore 有類RDBMS的數(shù)據(jù)模型,同時(shí)也支持同步復(fù)制,但是他的吞吐量太差,不能適應(yīng)應(yīng)用要求。Spanner不再是類似BigTable的版本化 key-value存儲(chǔ),而是一個(gè)“臨時(shí)多版本”的數(shù)據(jù)庫(kù)。何為“臨時(shí)多版本”,數(shù)據(jù)是存儲(chǔ)在一個(gè)版本化的關(guān)系表里面,存儲(chǔ)的時(shí)間數(shù)據(jù)會(huì)根據(jù)其提交的時(shí)間 打上時(shí)間戳,應(yīng)用可以訪問到較老的版本,另外老的版本也會(huì)被垃圾回收掉。

Google官方認(rèn)為 Spanner是下一代BigTable,也是Megastore的繼任者。

Google Spanner設(shè)計(jì)

功能

從高層看Spanner是通過Paxos狀態(tài)機(jī)將分區(qū)好的數(shù)據(jù)分布在全球的。數(shù)據(jù)復(fù)制全球化的,用戶可以指定數(shù)據(jù)復(fù)制的份數(shù)和存儲(chǔ)的地點(diǎn)。 Spanner可以在集群或者數(shù)據(jù)發(fā)生變化的時(shí)候?qū)?shù)據(jù)遷移到合適的地點(diǎn),做負(fù)載均衡。用戶可以指定將數(shù)據(jù)分布在多個(gè)數(shù)據(jù)中心,不過更多的數(shù)據(jù)中心將造成 更多的延遲。用戶需要在可靠性和延遲之間做權(quán)衡,一般來說復(fù)制1,2個(gè)數(shù)據(jù)中心足以保證可靠性。

作為一個(gè)全球化分布式系統(tǒng),Spanner提供一些有趣的特性。

  • 應(yīng)用可以細(xì)粒度的指定數(shù)據(jù)分布的位置。精確的指定數(shù)據(jù)離用戶有多遠(yuǎn),可以有效的控制讀延遲(讀延遲取決于最近的拷貝)。指定數(shù)據(jù)拷貝之間有多遠(yuǎn),可以控制 寫的延遲(寫延遲取決于最遠(yuǎn)的拷貝)。還要數(shù)據(jù)的復(fù)制份數(shù),可以控制數(shù)據(jù)的可靠性和讀性能。(多寫幾份,可以抵御更大的事故)
  • Spanner還有兩個(gè)一般分布式數(shù)據(jù)庫(kù)不具備的特性:讀寫的外部一致性,基于時(shí)間戳的全局的讀一致。這兩個(gè)特性可以讓Spanner支持一致的備份,一致的MapReduce,還有原子的Schema修改。

這寫特性都得益有Spanner有一個(gè)全球時(shí)間同步機(jī)制,可以在數(shù)據(jù)提交的時(shí)候給出一個(gè)時(shí)間戳。因?yàn)闀r(shí)間是系列化的,所以才有外部一致性。這個(gè)很容易理解,如果有兩個(gè)提交,一個(gè)在T1,一個(gè)在T2。那有更晚的時(shí)間戳那個(gè)提交是正確的。

這個(gè)全球時(shí)間同步機(jī)制是用一個(gè)具有GPS和原子鐘的TrueTime API提供了。這個(gè)TrueTime API能夠?qū)⒉煌瑪?shù)據(jù)中心的時(shí)間偏差縮短在10ms內(nèi)。這個(gè)API可以提供一個(gè)精確的時(shí)間,同時(shí)給出誤差范圍。Google已經(jīng)有了一個(gè)TrueTime API的實(shí)現(xiàn)。筆者覺得這個(gè)TrueTimeAPI 非常有意義,如果能單獨(dú)開源這部分的話,很多數(shù)據(jù)庫(kù)如MongoDB都可以從中受益。

#p#

體系結(jié)構(gòu)

Spanner由于是全球化的,所以有兩個(gè)其他分布式數(shù)據(jù)庫(kù)沒有的概念。

  • Universe。一個(gè)Spanner部署實(shí)例稱之為一個(gè)Universe。目前全世界有3個(gè)。一個(gè)開發(fā),一個(gè)測(cè)試,一個(gè)線上。因?yàn)橐粋€(gè)Universe就能覆蓋全球,不需要多個(gè)。
  • Zones. 每個(gè)Zone相當(dāng)于一個(gè)數(shù)據(jù)中心,一個(gè)Zone內(nèi)部物理上必須在一起。而一個(gè)數(shù)據(jù)中心可能有多個(gè)Zone。可以在運(yùn)行時(shí)添加移除Zone。一個(gè)Zone可以理解為一個(gè)BigTable部署實(shí)例。

如圖所示。一個(gè)Spanner有上面一些組件。實(shí)際的組件肯定不止這些,比如TrueTime API Server。如果僅僅知道這些知識(shí),來構(gòu)建Spanner是遠(yuǎn)遠(yuǎn)不夠的。但Google都略去了。那筆者就簡(jiǎn)要介紹一下。

  • Universemaster: 監(jiān)控這個(gè)universe里zone級(jí)別的狀態(tài)信息
  • Placement driver:提供跨區(qū)數(shù)據(jù)遷移時(shí)管理功能
  • Zonemaster:相當(dāng)于BigTable的Master。管理Spanserver上的數(shù)據(jù)。
  • Location proxy:存儲(chǔ)數(shù)據(jù)的Location信息。客戶端要先訪問他才知道數(shù)據(jù)在那個(gè)Spanserver上。
  • Spanserver:相當(dāng)于BigTable的ThunkServer。用于存儲(chǔ)數(shù)據(jù)。

可以看出來這里每個(gè)組件都很有料,但是Google的論文里只具體介紹了Spanserver的設(shè)計(jì),筆者也只能介紹到這里。下面詳細(xì)闡述Spanserver的設(shè)計(jì)。

Spanserver

本章詳細(xì)介紹Spanserver的設(shè)計(jì)實(shí)現(xiàn)。Spanserver的設(shè)計(jì)和BigTable非常的相似。參照下圖

從下往上看。每個(gè)數(shù)據(jù)中心會(huì)運(yùn)行一套Colossus (GFS II) 。每個(gè)機(jī)器有100-1000個(gè)tablet。Tablet概念上將相當(dāng)于數(shù)據(jù)庫(kù)一張表里的一些行,物理上是數(shù)據(jù)文件。打個(gè)比方,一張1000行的表,有 10個(gè)tablet,第1-100行是一個(gè)tablet,第101-200是一個(gè)tablet。但和BigTable不同的是BigTable里面的 tablet存儲(chǔ)的是Key-Value都是string,Spanner存儲(chǔ)的Key多了一個(gè)時(shí)間戳:

(Key: string, timestamp: int64) ->string。

因此spanner天生就支持多版本,tablet在文件系統(tǒng)中是一個(gè)B-tree-like的文件和一個(gè)write-ahead日志。

每個(gè)Tablet上會(huì)有一個(gè)Paxos狀態(tài)機(jī)。Paxos是一個(gè)分布式一致性協(xié)議。Table的元數(shù)據(jù)和log都存儲(chǔ)在上面。Paxos會(huì)選出一個(gè) replica做leader,這個(gè)leader的壽命默認(rèn)是10s,10s后重選。Leader就相當(dāng)于復(fù)制數(shù)據(jù)的master,其他replica的 數(shù)據(jù)都是從他那里復(fù)制的。讀請(qǐng)求可以走任意的replica,但是寫請(qǐng)求只有去leader。這些replica統(tǒng)稱為一個(gè)paxos group。

每個(gè)leader replica的spanserver上會(huì)實(shí)現(xiàn)一個(gè)lock table還管理并發(fā)。Lock table記錄了兩階段提交需要的鎖信息。但是不論是在Spanner還是在BigTable上,但遇到?jīng)_突的時(shí)候長(zhǎng)時(shí)間事務(wù)會(huì)將性能很差。所以有一些操 作,如事務(wù)讀可以走lock table,其他的操作可以繞開lock table。

每個(gè)leader replica的spanserver上還有一個(gè)transaction manager。如果事務(wù)在一個(gè)paxos group里面,可以繞過transaction manager。但是一旦事務(wù)跨多個(gè)paxos group,就需要transaction manager來協(xié)調(diào)。其中一個(gè)Transactionmanager被選為leader,其他的是slave聽他指揮。這樣可以保證事務(wù)。

#p#

Directories and Placement

之所以Spanner比BigTable有更強(qiáng)的擴(kuò)展性,在于Spanner還有一層抽象的概念directory, directory是一些key-value的集合,一個(gè)directory里面的key有一樣的前綴。更妥當(dāng)?shù)慕蟹ㄊ莃ucketing。 Directory是應(yīng)用控制數(shù)據(jù)位置的最小單元,可以通過謹(jǐn)慎的選擇Key的前綴來控制。據(jù)此筆者可以猜出,在設(shè)計(jì)初期,Spanner是作為F1的存 儲(chǔ)系統(tǒng)而設(shè)立,甚至還設(shè)計(jì)有類似directory的層次結(jié)構(gòu),這樣的層次有很多好處,但是實(shí)現(xiàn)太復(fù)雜被摒棄了。

Directory作為數(shù)據(jù)放置的最小單元,可以在paxos group里面移來移去。Spanner移動(dòng)一個(gè)directory一般出于如下幾個(gè)原因:

  • 一個(gè)paxos group的負(fù)載太大,需要切分
  • 將數(shù)據(jù)移動(dòng)到access更近的地方
  • 將經(jīng)常同時(shí)訪問的directory放到一個(gè)paxos group里面

Directory可以在不影響client的前提下,在后臺(tái)移動(dòng)。移動(dòng)一個(gè)50MB的directory大概需要的幾秒鐘。

那么directory和tablet又是什么關(guān)系呢。可以理解為Directory是一個(gè)抽象的概念,管理數(shù)據(jù)的單元;而tablet是物理的東 西,數(shù)據(jù)文件。由于一個(gè)Paxos group可能會(huì)有多個(gè)directory,所以spanner的tablet實(shí)現(xiàn)和BigTable的tablet實(shí)現(xiàn)有些不同。BigTable的 tablet是單個(gè)順序文件。Google有個(gè)項(xiàng)目,名為L(zhǎng)evel DB,是BigTable的底層,可以看到其實(shí)現(xiàn)細(xì)節(jié)。而Spanner的tablet可以理解是一些基于行的分區(qū)的容器。這樣就可以將一些經(jīng)常同時(shí)訪問 的directory放在一個(gè)tablet里面,而不用太在意順序關(guān)系。

在paxos group之間移動(dòng)directory是后臺(tái)任務(wù)。這個(gè)操作還被用來移動(dòng)replicas。移動(dòng)操作設(shè)計(jì)的時(shí)候不是事務(wù)的,因?yàn)檫@樣會(huì)造成大量的讀寫 block。操作的時(shí)候是先將實(shí)際數(shù)據(jù)移動(dòng)到指定位置,然后再用一個(gè)原子的操作更新元數(shù)據(jù),完成整個(gè)移動(dòng)過程。

Directory還是記錄地理位置的最小單元。數(shù)據(jù)的地理位置是由應(yīng)用決定的,配置的時(shí)候需要指定復(fù)制數(shù)目和類型,還有地理的位置。比如(上海, 復(fù)制2份;南京復(fù)制1分) 。這樣應(yīng)用就可以根據(jù)用戶指定終端用戶實(shí)際情況決定的數(shù)據(jù)存儲(chǔ)位置。比如中國(guó)隊(duì)的數(shù)據(jù)在亞洲有3份拷貝, 日本隊(duì)的數(shù)據(jù)全球都有拷貝。

前面對(duì)directory還是被簡(jiǎn)化過的,還有很多無法詳述。

數(shù)據(jù)模型

Spanner的數(shù)據(jù)模型來自于Google內(nèi)部的實(shí)踐。在設(shè)計(jì)之初,Spanner就決心有以下的特性:

  • 支持類似關(guān)系數(shù)據(jù)庫(kù)的schema
  • Query語句
  • 支持廣義上的事務(wù)

為何會(huì)這樣決定呢?在Google內(nèi)部還有一個(gè)Megastore,盡管要忍受性能不夠的折磨,但是在Google有300多個(gè)應(yīng)用在用它,因?yàn)?Megastore支持一個(gè)類似關(guān)系數(shù)據(jù)庫(kù)的schema,而且支持同步復(fù)制 (BigTable只支持最終一致的復(fù)制) 。使用Megastore的應(yīng)用有大名鼎鼎的Gmail, Picasa, Calendar, Android Market和AppEngine。 而必須對(duì)Query語句的支持,來自于廣受歡迎的Dremel,筆者不久前寫了篇文章來介紹他。 最后對(duì)事務(wù)的支持是比不可少了,BigTable在Google內(nèi)部被抱怨的最多的就是其只能支持行事務(wù),再大粒度的事務(wù)就無能為力了。Spanner的 開發(fā)者認(rèn)為,過度使用事務(wù)造成的性能下降的惡果,應(yīng)該由應(yīng)用的開發(fā)者承擔(dān)。應(yīng)用開發(fā)者在使用事務(wù)的時(shí)候,必須考慮到性能問題。而數(shù)據(jù)庫(kù)必須提供事務(wù)機(jī)制, 而不是因?yàn)樾阅軉栴},就干脆不提供事務(wù)支持。

數(shù)據(jù)模型是建立在directory和key-value模型的抽象之上的。一個(gè)應(yīng)用可以在一個(gè)universe中建立一個(gè)或多個(gè) database,在每個(gè)database中建立任意的table。Table看起來就像關(guān)系型數(shù)據(jù)庫(kù)的表。有行,有列,還有版本。Query語句看起來 是多了一些擴(kuò)展的SQL語句。

Spanner的數(shù)據(jù)模型也不是純正的關(guān)系模型,每一行都必須有一列或多列組件。看起來還是Key-value。主鍵組成Key,其他的列是Value。但這樣的設(shè)計(jì)對(duì)應(yīng)用也是很有裨益的,應(yīng)用可以通過主鍵來定位到某一行。

上圖是一個(gè)例子。對(duì)于一個(gè)典型的相冊(cè)應(yīng)用,需要存儲(chǔ)其用戶和相冊(cè)。可以用上面的兩個(gè)SQL來創(chuàng)建表。Spanner的表是層次化的,最頂層的表是 directory table。其他的表創(chuàng)建的時(shí)候,可以用interleave in parent來什么層次關(guān)系。這樣的結(jié)構(gòu),在實(shí)現(xiàn)的時(shí)候,Spanner可以將嵌套的數(shù)據(jù)放在一起,這樣在分區(qū)的時(shí)候性能會(huì)提升很多。否則Spanner 無法獲知最重要的表之間的關(guān)系。

TrueTime

TrueTime API 是一個(gè)非常有創(chuàng)意的東西,可以同步全球的時(shí)間。上表就是TrueTime API。TT.now()可以獲得一個(gè)絕對(duì)時(shí)間TTinterval,這個(gè)值和UnixTime是相同的,同時(shí)還能夠得到一個(gè)誤差e。 TT.after(t)和TT.before(t)是基于TT.now()實(shí)現(xiàn)的。

那這個(gè)TrueTime API實(shí)現(xiàn)靠的是GFS和原子鐘。之所以要用兩種技術(shù)來處理,是因?yàn)閷?dǎo)致這兩個(gè)技術(shù)的失敗的原因是不同的。GPS會(huì)有一個(gè)天線,電波干擾會(huì)導(dǎo)致其失靈。原子鐘很穩(wěn)定。當(dāng)GPS失靈的時(shí)候,原子鐘仍然能保證在相當(dāng)長(zhǎng)的時(shí)間內(nèi),不會(huì)出現(xiàn)偏差。

實(shí)際部署的時(shí)候。每個(gè)數(shù)據(jù)中心需要部署一些Master機(jī)器,其他機(jī)器上需要有一個(gè)slave進(jìn)程來從Master同步。有的Master用 GPS,有的Master用原子鐘。這些Master物理上分布的比較遠(yuǎn),怕出現(xiàn)物理上的干擾。比如如果放在一個(gè)機(jī)架上,機(jī)架被人碰倒了,就全宕了。另外 原子鐘不是并很貴。Master自己還會(huì)不斷比對(duì),新的時(shí)間信息還會(huì)和Master自身時(shí)鐘的比對(duì),會(huì)排除掉偏差比較大的,并獲得一個(gè)保守的結(jié)果。最終 GPS master提供時(shí)間精確度很高,誤差接近于0。

每個(gè)Slave后臺(tái)進(jìn)程會(huì)每個(gè)30秒從若干個(gè)Master更新自己的時(shí)鐘。為了降低誤差,使用Marzullo算法。每個(gè)slave還會(huì)計(jì)算出自己的誤差。這里的誤差包括的通信的延遲,機(jī)器的負(fù)載。如果不能訪問Master,誤差就會(huì)越走越大,知道重新可以訪問。

#p#

Google Spanner并發(fā)控制

Spanner使用TrueTime來控制并發(fā),實(shí)現(xiàn)外部一致性。支持以下幾種事務(wù)。

  • 讀寫事務(wù)
  • 只讀事務(wù)
  • 快照讀,客戶端提供時(shí)間戳
  • 快照讀,客戶端提供時(shí)間范圍

例如一個(gè)讀寫事務(wù)發(fā)生在時(shí)間t,那么在全世界任何一個(gè)地方,指定t快照讀都可以讀到寫入的值。

上表是Spanner現(xiàn)在支持的事務(wù)。單獨(dú)的寫操作都被實(shí)現(xiàn)為讀寫事務(wù) ; 單獨(dú)的非快照被實(shí)現(xiàn)為只讀事務(wù)。事務(wù)總有失敗的時(shí)候,如果失敗,對(duì)于這兩種操作會(huì)自己重試,無需應(yīng)用自己實(shí)現(xiàn)重試循環(huán)。

時(shí)間戳的設(shè)計(jì)大大提高了只讀事務(wù)的性能。事務(wù)開始的時(shí)候,要聲明這個(gè)事務(wù)里沒有寫操作,只讀事務(wù)可不是一個(gè)簡(jiǎn)單的沒有寫操作的讀寫事務(wù)。它會(huì)用一個(gè) 系統(tǒng)時(shí)間戳去讀,所以對(duì)于同時(shí)的其他的寫操作是沒有Block的。而且只讀事務(wù)可以在任意一臺(tái)已經(jīng)更新過的replica上面讀。

對(duì)于快照讀操作,可以讀取以前的數(shù)據(jù),需要客戶端指定一個(gè)時(shí)間戳或者一個(gè)時(shí)間范圍。Spanner會(huì)找到一個(gè)已經(jīng)充分更新好的replica上讀取。

還有一個(gè)有趣的特性的是,對(duì)于只讀事務(wù),如果執(zhí)行到一半,該replica出現(xiàn)了錯(cuò)誤。客戶端沒有必要在本地緩存剛剛讀過的時(shí)間,因?yàn)槭歉鶕?jù)時(shí)間戳讀取的。只要再用剛剛的時(shí)間戳讀取,就可以獲得一樣的結(jié)果。

讀寫事務(wù)

正如BigTable一樣,Spanner的事務(wù)是會(huì)將所有的寫操作先緩存起來,在Commit的時(shí)候一次提交。這樣的話,就讀不出在同一個(gè)事務(wù)中寫的數(shù)據(jù)了。不過這沒有關(guān)系,因?yàn)镾panner的數(shù)據(jù)都是有版本的。

在讀寫事務(wù)中使用wound-wait算法來避免死鎖。當(dāng)客戶端發(fā)起一個(gè)讀寫事務(wù)的時(shí)候,首先是讀操作,他先找到相關(guān)數(shù)據(jù)的leader replica,然后加上讀鎖,讀取最近的數(shù)據(jù)。在客戶端事務(wù)存活的時(shí)候會(huì)不斷的向leader發(fā)心跳,防止超時(shí)。當(dāng)客戶端完成了所有的讀操作,并且緩存 了所有的寫操作,就開始了兩階段提交。客戶端閑置一個(gè)coordinator group,并給每一個(gè)leader發(fā)送coordinator的id和緩存的寫數(shù)據(jù)。

leader首先會(huì)上一個(gè)寫鎖,他要找一個(gè)比現(xiàn)有事務(wù)晚的時(shí)間戳。通過Paxos記錄。每一個(gè)相關(guān)的都要給coordinator發(fā)送他自己準(zhǔn)備的那個(gè)時(shí)間戳。

Coordinatorleader一開始也會(huì)上個(gè)寫鎖,當(dāng)大家發(fā)送時(shí)間戳給他之后,他就選擇一個(gè)提交時(shí)間戳。這個(gè)提交的時(shí)間戳,必須比剛剛的所有時(shí)間戳晚,而且還要比TT.now()+誤差時(shí)間 還有晚。這個(gè)Coordinator將這個(gè)信息記錄到Paxos。

在讓replica寫入數(shù)據(jù)生效之前,coordinator還有再等一會(huì)。需要等兩倍時(shí)間誤差。這段時(shí)間也剛好讓Paxos來同步。因?yàn)榈却?后,在任意機(jī)器上發(fā)起的下一個(gè)事務(wù)的開始時(shí)間,都比如不會(huì)比這個(gè)事務(wù)的結(jié)束時(shí)間早了。然后coordinator將提交時(shí)間戳發(fā)送給客戶端還有其他的 replica。他們記錄日志,寫入生效,釋放鎖。

只讀事務(wù)

對(duì)于只讀事務(wù),Spanner首先要指定一個(gè)讀事務(wù)時(shí)間戳。還需要了解在這個(gè)讀操作中,需要訪問的所有的讀的Key。Spanner可以自動(dòng)確定Key的范圍。

如果Key的范圍在一個(gè)Paxos group內(nèi)。客戶端可以發(fā)起一個(gè)只讀請(qǐng)求給group leader。leader選一個(gè)時(shí)間戳,這個(gè)時(shí)間戳要比上一個(gè)事務(wù)的結(jié)束時(shí)間要大。然后讀取相應(yīng)的數(shù)據(jù)。這個(gè)事務(wù)可以滿足外部一致性,讀出的結(jié)果是最后 一次寫的結(jié)果,并且不會(huì)有不一致的數(shù)據(jù)。

如果Key的范圍在多個(gè)Paxos group內(nèi),就相對(duì)復(fù)雜一些。其中一個(gè)比較復(fù)雜的例子是,可以遍歷所有的group leaders,尋找最近的事務(wù)發(fā)生的時(shí)間,并讀取。客戶端只要時(shí)間戳在TT.now().latest之后就可以滿足要求了。

最后的話

本文介紹了GoogleSpanner的背景,設(shè)計(jì)和并發(fā)控制。希望不久的將來,會(huì)有開源產(chǎn)品出現(xiàn)。

原文出處:全球級(jí)的分布式數(shù)據(jù)庫(kù) Google Spanner原理

責(zé)任編輯:林師授 來源: mysqlops.com
相關(guān)推薦

2012-09-29 13:18:23

分布式數(shù)據(jù)庫(kù)Google Span

2025-06-11 08:01:06

2022-06-28 09:49:51

數(shù)據(jù)庫(kù)分布式

2018-03-02 15:17:16

分布式數(shù)據(jù)庫(kù)MySQL

2022-04-14 09:00:22

開源數(shù)據(jù)存儲(chǔ)Ignite

2021-12-20 15:44:28

ShardingSph分布式數(shù)據(jù)庫(kù)開源

2023-12-05 07:30:40

KlustronBa數(shù)據(jù)庫(kù)

2023-07-31 08:27:55

分布式數(shù)據(jù)庫(kù)架構(gòu)

2023-07-28 07:56:45

分布式數(shù)據(jù)庫(kù)SQL

2020-04-14 11:14:02

PostgreSQL分布式數(shù)據(jù)庫(kù)

2023-11-14 08:24:59

性能Scylla系統(tǒng)架構(gòu)

2022-06-09 10:19:10

分布式數(shù)據(jù)庫(kù)

2011-05-19 09:18:48

分布式數(shù)據(jù)庫(kù)

2020-06-23 09:35:13

分布式數(shù)據(jù)庫(kù)網(wǎng)絡(luò)

2024-09-09 09:19:57

2023-03-07 09:49:04

分布式數(shù)據(jù)庫(kù)

2022-08-01 18:33:45

關(guān)系型數(shù)據(jù)庫(kù)大數(shù)據(jù)

2022-03-10 06:36:59

分布式數(shù)據(jù)庫(kù)排序

2024-03-11 08:57:02

國(guó)產(chǎn)數(shù)據(jù)庫(kù)證券
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

韩国三级一区| 亚洲大尺度在线观看| 欧美h版在线观看| 亚洲第一成人在线| 欧美主播一区二区三区美女 久久精品人 | 黄色成人在线观看网站| 亚洲精品久久久蜜桃| 精品欧美一区二区在线观看视频| 无码免费一区二区三区| 欧美激情五月| 中文字幕日韩电影| a级片在线观看视频| 免费高清视频在线一区| 亚洲风情在线资源站| 亚洲精品在线免费看| 好男人www在线视频| 日韩福利视频导航| 国内精品400部情侣激情| 国产精品情侣呻吟对白视频| 国产精品xxxav免费视频| 欧美天天综合网| 日韩av在线播放不卡| 日本电影在线观看网站| av成人免费在线观看| 亚洲va欧美va国产综合久久| 中文字幕在线欧美| 在线成人www免费观看视频| 自拍偷拍免费精品| 四虎永久免费在线观看| 国产66精品| 日韩欧美亚洲一区二区| 午夜视频在线网站| 免费电影日韩网站| 精品露脸国产偷人在视频| 永久免费看av| 五月婷婷在线视频| 日本一区二区三区高清不卡 | 精品久久电影| 亚洲精品久久视频| 亚洲麻豆一区二区三区| 玖玖玖电影综合影院| 欧美日韩1234| 免费一区二区三区在线观看| 美女福利一区二区| 色综合天天综合狠狠| 毛片在线视频播放| 91九色国产在线播放| 亚洲精选一二三| 亚洲自拍偷拍二区| 天堂资源在线中文| 亚洲国产岛国毛片在线| 亚洲国产欧美日韩| av在线中文| 国产精品无圣光一区二区| 欧美日韩成人一区二区三区| 青青九九免费视频在线| 91免费观看视频| 欧美极品色图| а天堂8中文最新版在线官网| 久久精品一区二区| 日韩中文字幕一区二区| a√在线中文网新版址在线| 中文字幕不卡三区| 美国av在线播放| 在线观看a级片| 一区二区视频在线| 欧美一级片免费播放| 日韩欧美精品一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 无码人妻丰满熟妇区毛片18 | 国产这里只有精品| 97在线视频人妻无码| 国产一区二区三区国产| 痴汉一区二区三区| 你懂的在线看| 中文字幕日韩av资源站| 日本道在线视频| 成人女同在线观看| 色综合久久88色综合天天6| 成人免费视频久久| 小说区图片区亚洲| 亚洲精品在线观看网站| av直播在线观看| 9999国产精品| 久久久免费高清电视剧观看| 中文字幕黄色片| 久久国内精品视频| 国产精品免费观看高清| 国产在线网站| 亚洲精品乱码久久久久久黑人| 黄色www网站| 久久人体av| 亚洲精品在线免费观看视频| 人妻熟人中文字幕一区二区| 国语对白精品一区二区| 欧洲美女7788成人免费视频| 一级黄色a毛片| caoporn国产一区二区| 亚洲精品乱码视频| а√天堂8资源在线| 欧美性猛交xxxx乱大交退制版| 宇都宫紫苑在线播放| 西野翔中文久久精品国产| 最近中文字幕2019免费| 四虎永久在线精品| 久久99国产精品久久99果冻传媒| 国产91精品一区二区绿帽| avtt亚洲| 色中色一区二区| 亚洲精品一区二区18漫画| 欧美日韩老妇| 国语自产精品视频在免费| 一本色道久久综合无码人妻| 99久久99久久精品免费看蜜桃| 国产日本欧美在线| 欧美大片1688| 日韩精品免费在线观看| 九九热只有精品| 韩国v欧美v亚洲v日本v| 欧美精品一区二区三区在线看午夜 | 女人十八岁毛片| 国产成人精品网址| 在线一区日本视频| 欧美free嫩15| 日韩高清中文字幕| 国产精品成人aaaa在线| 国产剧情av麻豆香蕉精品| 无遮挡亚洲一区| 一区二区三区四区日本视频| 亚洲国产91精品在线观看| 婷婷在线精品视频| 久久99国产精品尤物| 欧美一区二区三区在线免费观看| 91福利在线尤物| 精品国产乱码久久久久久夜甘婷婷| 91精品国产闺蜜国产在线闺蜜| 青娱乐精品视频| 日韩视频专区| 色综合一本到久久亚洲91| 日韩成人中文字幕在线观看| 国产在线观看99| 国产麻豆成人精品| 400部精品国偷自产在线观看| 国产a亚洲精品| 伊人伊人伊人久久| 中文字幕 视频一区| 久久精品夜色噜噜亚洲a∨| 无码播放一区二区三区| 欧美偷窥清纯综合图区| 亚州欧美日韩中文视频| 国模私拍视频在线| 亚洲成人福利片| 日本少妇毛茸茸| 99国产精品| 精品免费视频123区| 日韩伦理在线一区| 亚洲欧美在线免费观看| 在线观看亚洲黄色| 中文字幕在线观看一区二区| 天堂av2020| 欧美黄色大片网站| 国产精品乱码| 日本综合字幕| 日韩中文字幕国产精品| 国产高清免费av| 亚洲一区二区免费视频| 欧美精品欧美极品欧美激情| 久久一区精品| 亚洲一区二区三区加勒比| 99精品美女视频在线观看热舞| 另类美女黄大片| 人妻无码中文字幕免费视频蜜桃| 亚洲 欧美综合在线网络| 国产麻豆天美果冻无码视频| 日本视频中文字幕一区二区三区| 宅男av一区二区三区| 综合成人在线| 日本精品视频在线观看| 亚洲乱亚洲乱妇| 精品国产伦理网| 丰满少妇xoxoxo视频| 国产精品久久久久久久久免费相片 | 成人不卡视频| 欧美大片在线免费观看| 日韩av资源站| 911精品产国品一二三产区| www.99re7.com| 久久久久久毛片| 奇米777在线视频| 性色一区二区三区| 综合久久国产| 伊人精品一区| 99高清视频有精品视频| 成人性教育av免费网址| 欧美成人精品影院| 九色视频成人自拍| 日韩视频中午一区| 亚洲欧美日韩一区二区三区四区| 亚洲女人小视频在线观看| 噜噜噜在线视频| 国产一区二区三区久久悠悠色av | 日本不卡网站| 久久中国妇女中文字幕| 日韩亚洲视频在线观看| 日韩美女一区二区三区四区| 免费又黄又爽又猛大片午夜| 亚洲一区中文日韩| 日本不卡一二区| 久久蜜臀精品av| 国产高清成人久久| 国产最新精品精品你懂的| avav在线看| 国产一区视频在线观看免费| 一区二区三区av| 五月国产精品| 国产精品一区二区不卡视频| 欧美午夜三级| 国产精品久久久久久久久久久久| 国产欧洲在线| 久久视频精品在线| 91社区在线观看播放| 日韩精品在线视频美女| 亚洲成a人片77777精品| 制服丝袜亚洲精品中文字幕| 欧美日韩一级黄色片| 婷婷综合五月天| 国产一级特黄a高潮片| 一区二区三区在线视频播放| 午夜激情福利电影| 国产片一区二区三区| 久久精品无码一区| 久久女同互慰一区二区三区| 免费黄色三级网站| 成人手机在线视频| 日本久久久久久久久久| 国产激情偷乱视频一区二区三区 | 国产真人无遮挡作爱免费视频| 欧美天天综合色影久久精品| 日韩成年人视频| 亚洲第一激情av| 日本少妇全体裸体洗澡| 亚洲高清免费观看| 国产精品suv一区二区| 亚洲午夜视频在线观看| 黄页网站免费观看| 亚洲影院理伦片| 精品无码久久久久久久| 亚洲一区视频在线观看视频| 欧美成欧美va| 亚洲一区二区三区免费视频| 精品无码久久久久| 精品美女国产在线| 视频一区二区三区四区五区| 日本丶国产丶欧美色综合| 成人h动漫精品一区二区下载| 色丁香久综合在线久综合在线观看| 在线观看日本视频| 欧美亚洲综合另类| 97在线播放免费观看| 日韩欧美成人激情| 婷婷在线免费观看| 亚洲精选一区二区| 国产视频网址在线| 久久人人爽人人爽人人片亚洲| 91中文在线| 欧美精品xxx| 免费亚洲电影| 国产免费一区视频观看免费| 日韩成人视屏| 久久久久久欧美精品色一二三四| 国产精品亚洲片在线播放| 亚洲一区3d动漫同人无遮挡 | 国产福利资源在线| 亚洲国产中文字幕久久网| 国产鲁鲁视频在线观看免费| 色偷偷av亚洲男人的天堂| 91小视频xxxx网站在线| 欧美一性一乱一交一视频| 91福利精品在线观看| 91超碰rencao97精品| 牛牛影视一区二区三区免费看| 日韩aⅴ视频一区二区三区| 国产精品99视频| 无码专区aaaaaa免费视频| 日韩av一区二| 久久国产劲爆∧v内射| 国产午夜一区二区三区| 亚洲欧美精品aaaaaa片| 精品高清一区二区三区| 亚洲熟女乱色一区二区三区久久久| 欧美大片顶级少妇| 国产福利免费在线观看| 欧美精品aaa| 福利视频亚洲| 久久99精品国产一区二区三区| 日韩大片在线| 欧美日韩黄色一级片| 精品一区二区三区免费| 超碰97人人干| 一区二区三区欧美日韩| 自拍偷拍18p| 亚洲精品videossex少妇| 日本中文字幕在线观看| 欧美尤物巨大精品爽| 麻豆一区在线| 亚洲电影一二三区| 国产欧美午夜| 四虎国产精品免费| 中文字幕欧美三区| 老熟妇仑乱一区二区av| 日韩精品一区二区三区四区| 日本综合在线| 国产成人精品免高潮在线观看 | 人人鲁人人莫人人爱精品| 国产精品美女黄网| 中文字幕一区二区精品区| 日本肉体xxxx裸体xxx免费| 久久综合狠狠综合久久激情| 久久久久久久极品内射| 91麻豆精品国产91久久久资源速度 | **欧美日韩在线| 视频一区视频二区视频三区高| 国产日韩1区| 水蜜桃av无码| 亚洲第一久久影院| 丰满人妻一区二区| 九九久久国产精品| 91精品福利观看| 亚洲视频在线二区| 日韩avvvv在线播放| 美女100%无挡| 欧美性猛交xxxx免费看漫画| 日韩中文字幕免费观看| 国内精品一区二区三区四区| 久久久国产精品入口麻豆| 亚洲第一综合网站| 精品午夜久久福利影院| 亚洲综合久久av一区二区三区| 在线观看国产一区二区| 九九在线视频| 国产精品日韩专区| 成人精品久久| 我要看一级黄色大片| 中文字幕欧美国产| 中文在线观看av| 久热精品视频在线| 日韩视频一区二区三区四区| 精品无码av无码免费专区| 国产成人午夜精品影院观看视频| www.色小姐com| 精品美女一区二区| 99热99re6国产在线播放| 激情小说综合区| 久久国产精品99国产| 国产三级短视频| 91麻豆精品国产91久久久久久久久| 国产丝袜在线| 国产精品久久波多野结衣| 亚洲国产三级| 国产男男chinese网站| 欧美在线色视频| 日本不卡视频| 91嫩草视频在线观看| 精品96久久久久久中文字幕无| 亚洲精品乱码久久| 色视频一区二区| 男人在线资源站| 高清国产在线一区| 性色av一区二区怡红| 2014亚洲天堂| 欧美成人猛片aaaaaaa| 神马午夜在线视频| 小说区图片区图片区另类灬| 国产一区视频导航| 国产精品国产三级国产专区52| 亚洲午夜精品久久久久久性色| 视频欧美精品| www精品久久| 欧美国产精品一区二区| 国产精品综合在线| 91精品国产91久久久久久不卡| 精品一区欧美| 国产资源中文字幕| 欧美日韩亚洲高清| 1769在线观看| 国产精品区一区| 蜜臀久久久99精品久久久久久| 男人操女人的视频网站| 日韩大片免费观看视频播放| 999精品嫩草久久久久久99| 成人综合视频在线| 亚洲欧洲精品天堂一级| 三级国产在线观看| 亚洲一区二区三| 久久久久久一区二区| 美女视频黄免费| 一区二区在线免费视频| jizzjizzjizz欧美| 色免费在线视频| 色综合中文综合网|