一.Spanner功能概要
在Spanner面世篇中簡(jiǎn)單的介紹過(guò):Spanner具有高擴(kuò)展性,多版本(multi-version)、世界級(jí)分布(globally-distributed)及同步復(fù)制(synchronously-replicated)等特性。
Spanner立足于高抽象層次,使用Paxos協(xié)議橫跨多個(gè)數(shù)據(jù)集把數(shù)據(jù)分散到世界上不同數(shù)據(jù)中心的狀態(tài)機(jī)中。世界范圍內(nèi)響應(yīng),出故障時(shí)客戶(hù)副本之間的自動(dòng)切換。當(dāng)數(shù)據(jù)總量或服務(wù)器的數(shù)量發(fā)生改變時(shí),為了平衡負(fù)載和處理故障,Spanner自動(dòng)完成數(shù)據(jù)的重切片和跨機(jī)器(甚至跨數(shù)據(jù)中心)的數(shù)據(jù)遷移。
Spanner可以輕松的橫跨數(shù)百個(gè)數(shù)據(jù)中心將萬(wàn)億級(jí)數(shù)據(jù)庫(kù)行擴(kuò)展到數(shù)百萬(wàn)臺(tái)機(jī)器中。高可靠性更是讓?xiě)?yīng)用程序如虎添翼,即使面對(duì)大范圍的自然災(zāi)害,可靠性仍然能得到良好的保障(因?yàn)镾panner有著世界級(jí)的數(shù)據(jù)轉(zhuǎn)移)。最初的用戶(hù)來(lái)自F1 — 使用了美國(guó)境內(nèi)的5個(gè)拷貝。多數(shù)其他應(yīng)用程序都是在同一個(gè)地理區(qū)域?qū)?shù)據(jù)復(fù)制3到5份,使用相對(duì)獨(dú)立的故障模式。也就是說(shuō)多數(shù)的應(yīng)用程序會(huì)選擇低延遲超過(guò)高有效性,只用一兩個(gè)數(shù)據(jù)中心來(lái)保障數(shù)據(jù)的可靠性。
Spanner的主旨是數(shù)據(jù)中心的管理,但是在分布系統(tǒng)基礎(chǔ)設(shè)施的特色上同樣是下足了功夫。盡管Bigtable很討一些項(xiàng)目歡心,我們還是收到了一些Bigtable在某些應(yīng)用程序(復(fù)雜的、不斷變化的架構(gòu)或者需要在大區(qū)域響應(yīng)中保持強(qiáng)一致性)中使用會(huì)異常艱難的投訴。許多Google的應(yīng)用程序都在使用Megastore,因?yàn)樗陌腙P(guān)系數(shù)據(jù)模型支持同步復(fù)制,盡管它有著可憐的吞吐量。
因此,Spanner已經(jīng)從Bigtable-like版本的鍵值存儲(chǔ)進(jìn)化到現(xiàn)在的多版本數(shù)據(jù)庫(kù)。數(shù)據(jù)存放在系統(tǒng)化的半關(guān)系表格中;數(shù)據(jù)被版本化了,每個(gè)版本都會(huì)用提交時(shí)間進(jìn)行標(biāo)注;舊版本的數(shù)據(jù)服從結(jié)構(gòu)的垃圾回收策略;應(yīng)用程序可以通過(guò)數(shù)據(jù)以前的時(shí)間標(biāo)記來(lái)讀取。
Spanner支持多用途的事務(wù)處理,并且提供了一個(gè)基于SQL的查詢(xún)語(yǔ)言。作為世界級(jí)分布的數(shù)據(jù)庫(kù),Spanner更有一些令人感興趣的特色:
1. 應(yīng)用程序可以通過(guò)復(fù)制裝置動(dòng)態(tài)的對(duì)數(shù)據(jù)進(jìn)行微控制。還可以通過(guò)制定約束條件來(lái)指定數(shù)據(jù)中心和其中包含的數(shù)據(jù)(無(wú)視數(shù)據(jù)與用戶(hù)間的距離,數(shù)據(jù)與數(shù)據(jù)間的距離及數(shù)據(jù)保持的份數(shù))。系統(tǒng)動(dòng)態(tài)的和透明的在數(shù)據(jù)中心之間轉(zhuǎn)移數(shù)據(jù)來(lái)保證資源的平衡利用。
2. Spanner有兩個(gè)特性是很難在分布式數(shù)據(jù)庫(kù)中實(shí)現(xiàn)的:讀寫(xiě)的外部一致性和基于時(shí)間標(biāo)記的全局讀一致性。這讓Spanner可以在全球范圍內(nèi)保持?jǐn)?shù)據(jù)的一致備份,MapReduce一致執(zhí)行和原子的Schema修改,即使是連續(xù)操作。
這些特性保證了Spanner可以有序的在世界范圍內(nèi)響應(yīng)事務(wù)處理,即使是分散式的事務(wù)。時(shí)間標(biāo)記反應(yīng)了事務(wù)的順序。另外,序列化的時(shí)間確保了外部一致性:如果事務(wù)T1在另一個(gè)事務(wù)T2之前提交,那么T1提交的時(shí)間標(biāo)記是小于T2的。
Spanner是首個(gè)提供如此保證的系統(tǒng)。促成這項(xiàng)跨越的關(guān)鍵是TrueTime API(具有原子時(shí)鐘和GPS)。TrueTime API直觀的揭示了時(shí)鐘的不可靠性,它運(yùn)行提供的邊界更決定了時(shí)間標(biāo)記。如果不確定性很大,Spanner會(huì)降低速度來(lái)等待不確定因素的消失。Google集群管理軟件更奠定了TrueTime的實(shí)施的基礎(chǔ)。通過(guò)新型原子時(shí)鐘將不確定性無(wú)限的放小。
二.Spanner的設(shè)計(jì)及一些重要組件(本部分特別感謝EMC研究院 顏開(kāi)提供翻譯支持)
由于Spanner是全球化的,所以有兩個(gè)其他分布式數(shù)據(jù)庫(kù)沒(méi)有的概念。
- Universe。一個(gè)Spanner部署實(shí)例稱(chēng)之為一個(gè)Universe。目前全世界有3個(gè)。一個(gè)開(kāi)發(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í),來(lái)構(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信息??蛻?hù)端要先訪問(wèn)他才知道數(shù)據(jù)在那個(gè)Spanserver上。
- Spanserver:相當(dāng)于BigTable的ThunkServer。用于存儲(chǔ)數(shù)據(jù)。