




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第14章云計(jì)算和軟件即服務(wù)14.1引言
14.2SaaS的成熟度模型
14.3多租戶SaaS的數(shù)據(jù)庫設(shè)計(jì)
14.4GoogleApp引擎
14.5Google文件系統(tǒng)
14.6BigTable14.7MapReduce14.8Hadoop48014.9微軟的Azure14.10S14.11優(yōu)先級(jí)和調(diào)度
14.12云計(jì)算算法
14.13數(shù)據(jù)區(qū)分器的應(yīng)用
14.14討論
近來,云計(jì)算受到了極大的關(guān)注,因?yàn)樗峁┝艘环N新的計(jì)算基礎(chǔ)設(shè)施,能夠以動(dòng)態(tài)的、可伸縮的、虛擬化的方式快速地把計(jì)算資源作為一種實(shí)用工具交付。與傳統(tǒng)的基于桌面的計(jì)算相比,云計(jì)算的優(yōu)勢(shì)包括靈活性、低成本、設(shè)備獨(dú)立、位置獨(dú)立以及可伸縮性(Aulbach,2009)。最近,IT巨頭如Google,Amazon,Microsoft和IBM都開始了他們的云計(jì)算項(xiàng)目。云計(jì)算和軟件即服務(wù)云計(jì)算為客戶提供了一種大規(guī)模的服務(wù)交付,并且允許客戶以“即用即付”的方式靈活支付而不需要擁有IT基礎(chǔ)設(shè)施或應(yīng)用軟件。這里,客戶可以是應(yīng)用軟件或應(yīng)用軟件的終端用戶,因此SaaS中的服務(wù)指的是軟件模塊以及終端用戶可用的應(yīng)用。
云計(jì)算通常有幾個(gè)關(guān)鍵組成部分,包括:
(1)頂層:該層托管用戶在應(yīng)用中使用的軟件即服務(wù)(SaaS)。
(2)第2層:該層提供了平臺(tái)即服務(wù)(PaaS)。
(3)第3層:該層提供了基本的支撐,即基礎(chǔ)設(shè)施即服務(wù)(IaaS)。
(4)第4層:這是最底層,提供了數(shù)據(jù)中心。14.1引言目前大多數(shù)云計(jì)算建立在現(xiàn)代數(shù)據(jù)中心上面,它把IaaS、PaaS和SaaS集成在一起,并以公用工具的方式提供這些服務(wù),這樣可按客戶的使用情況進(jìn)行計(jì)費(fèi)。圖14.1顯示了云計(jì)算的層次化視圖。
1.數(shù)據(jù)中心
該層提供了云運(yùn)行的硬件環(huán)境。數(shù)據(jù)中心通常建立在能量利用較低、自然災(zāi)害可能性小、人口稀疏的區(qū)域?,F(xiàn)代數(shù)據(jù)中心通常由數(shù)千臺(tái)具有大容量磁盤存儲(chǔ)和高速緩存的服務(wù)器組成,這些服務(wù)器通過高速網(wǎng)絡(luò)連接。
2.基礎(chǔ)設(shè)施即服務(wù)
IaaS建立在數(shù)據(jù)中心層之上,IaaS層虛擬化了計(jì)算能力、存儲(chǔ)和數(shù)據(jù)中心的網(wǎng)絡(luò)連接,并作為規(guī)定服務(wù)提供給客戶。用戶可以按需增加或減少他們的計(jì)算資源。IaaS比較典型的應(yīng)用是,多租戶共享相同的基礎(chǔ)設(shè)施資源。IaaS層的例子如Amazon的EC2,Microsoft的Azure平臺(tái)。
圖14.1云計(jì)算的層次化視圖3.平臺(tái)即服務(wù)
平臺(tái)即服務(wù)(PaaS)通常被稱為cloudware。PaaS提供了一個(gè)集成了許多服務(wù)的開發(fā)平臺(tái)來輔助應(yīng)用的設(shè)計(jì)、開發(fā)、測(cè)試、部署、監(jiān)控和云托管,并支持地理上分散的團(tuán)隊(duì)在項(xiàng)目中協(xié)同工作。它通常不需要下載或安裝軟件。Google的AppEngine,Microsoft的Azure,Amazon的MapReduce/SimpleStorageService都是PaaS層的例子。
4.軟件即服務(wù)
SaaS按需把應(yīng)用軟件作為服務(wù)提供給終端用戶,通常以瀏覽器的方式提供。它免去了用戶部署和維護(hù)軟件的麻煩。來自于云的軟件是自動(dòng)更新的,并且不需要購買額外的許可證。產(chǎn)品特征按需請(qǐng)求,并且頻繁使用。SaaS應(yīng)用通常是面向服務(wù)的程序,它可以很容易地和其他mashup應(yīng)用集成。GoogleMap是SaaS的一個(gè)例子,它可以參與Web上的多種mashup應(yīng)用。S和Zoho的生產(chǎn)及協(xié)作套件也是SaaS的例子。
這四層并沒有明顯的分界線。一層的組件和特征也可以認(rèn)為是另一層的。例如,數(shù)據(jù)存儲(chǔ)服務(wù)可以是IaaS層或PaaS層的。
在云環(huán)境中,每樣?xùn)|西都可以看做并被實(shí)現(xiàn)為服務(wù)。SaaS運(yùn)行在云環(huán)境的頂層,它把基于Web的服務(wù)交付給客戶,并把IT應(yīng)用的功能、部署、維護(hù)的職責(zé)轉(zhuǎn)移給服務(wù)提供商。客戶雖然沒有擁有軟件但是要支付軟件在Web上提供的服務(wù)。通常用戶通過API訪問Web上的服務(wù)。
PaaS運(yùn)行在云環(huán)境的中間層,它通過使用IaaS提供的計(jì)算、通信和存儲(chǔ)資源為SaaS的執(zhí)行提供計(jì)算環(huán)境。這些功能傳統(tǒng)上是由操作系統(tǒng)提供的,但是,和傳統(tǒng)的計(jì)算系統(tǒng)相比較,PaaS有更多的資源,并需要實(shí)時(shí)處理數(shù)以百萬計(jì)的用戶。PaaS使用的一個(gè)通用技術(shù)就是虛擬化,并且它為終端用戶或SaaS提供了許多虛擬系統(tǒng)。在一個(gè)典型的云環(huán)境中,IaaS可能有數(shù)千個(gè)甚至上萬個(gè)擁有巨大存儲(chǔ)容量的處理器。
注意,SaaS應(yīng)用也可以看做是傳統(tǒng)的服務(wù),因?yàn)槎叨际腔诿嫦蚍?wù)的計(jì)算并使用相同的面向服務(wù)技術(shù),例如發(fā)布、檢索、發(fā)現(xiàn)、本體、組合以及執(zhí)行策略。然而,在以下幾個(gè)方面,SaaS應(yīng)用確實(shí)不同于服務(wù)應(yīng)用:
(1)服務(wù)應(yīng)用可以放置在本地計(jì)算機(jī)(如筆記本或臺(tái)式機(jī)),或成為服務(wù)器支持的Web服務(wù);相反地,SaaS應(yīng)用必須是Web應(yīng)用,并且必須運(yùn)行在有巨大計(jì)算能力和存儲(chǔ)資源的服務(wù)器之上。
(2)用戶可以共享服務(wù)應(yīng)用,但是每個(gè)用戶看到的是具有相同功能的相同服務(wù);相反地,用戶共享SaaS應(yīng)用時(shí),每個(gè)用戶可能看到具有不同用戶界面和功能的相同SaaS應(yīng)用。例如,用戶可以定制用戶界面并要求特定的項(xiàng)作為優(yōu)先項(xiàng)顯示。Gmail是一個(gè)典型的SaaS應(yīng)用,用戶可以指定用戶界面并要求特殊的特征。在服務(wù)應(yīng)用中一般不具有這一特性。這是SaaS的可配置性。
(3)SaaS應(yīng)用通常使用多租戶體系結(jié)構(gòu),相同的軟件可以服務(wù)于具有不同特征的多個(gè)用戶。然而,一個(gè)典型的服務(wù)應(yīng)用沒有多租戶體系結(jié)構(gòu)。14.2節(jié)將介紹多租戶體系結(jié)構(gòu)。
本章將涉及SaaS的基本特征和它們的實(shí)現(xiàn)策略。
SOA和云計(jì)算是相聯(lián)系的,具體地說,SOA是一個(gè)體系結(jié)構(gòu)模式,是用來指導(dǎo)創(chuàng)建、組織及重用計(jì)算組件的業(yè)務(wù)解決方案;而云計(jì)算是一組技術(shù),為企業(yè)提供更大的、更靈活的平臺(tái)來構(gòu)建他們的SOA解決方案。換句話說,SOA和云計(jì)算是共存的、互補(bǔ)的和相互支持的。注意,SaaS應(yīng)用的參與者至少包括下面的人員:
(1)終端用戶:他們使用提供的服務(wù)并支付相應(yīng)的費(fèi)用。他們可以組成COI(興趣社團(tuán))來分享他們的服務(wù)和經(jīng)驗(yàn)。
(2)業(yè)務(wù)提供者:業(yè)務(wù)提供者影響、部署并支持服務(wù)的客戶使用。
(3)服務(wù)提供者:服務(wù)提供者為用戶創(chuàng)建、遷移和組合服務(wù)。注意,服務(wù)提供者不必提供服務(wù)運(yùn)行的平臺(tái);他們可以使用公有云、私有云或混合云環(huán)境運(yùn)行他們的軟件。
(4)平臺(tái)運(yùn)營商:他們?yōu)榉?wù)從創(chuàng)建、部署、運(yùn)營到退出的整個(gè)生命周期的管理提供了一個(gè)平臺(tái)。公有云指的是每個(gè)人都可以訪問。私有云指的是僅允許指定機(jī)構(gòu)中的人員訪問。混合云指的是部分資源可以公開使用,但是其他資源只允許指定人員使用。
一般來說,云計(jì)算有以下特征:
(1)面向服務(wù)計(jì)算:大多數(shù)云環(huán)境支持面向服務(wù)計(jì)算和SaaS。因此,云環(huán)境通常支持發(fā)布、發(fā)現(xiàn)及服務(wù)組合,這些服務(wù)包括應(yīng)用服務(wù)和支持服務(wù),例如信息服務(wù)、存儲(chǔ)服務(wù)和通信服務(wù)。
(2)基于Web的運(yùn)營:人們使用Web上提供的軟件,當(dāng)SaaS運(yùn)行在PaaS和IaaS上時(shí),這些軟件通常是可用的。這一特征提供了設(shè)備和位置的獨(dú)立性。
(3)動(dòng)態(tài)供應(yīng)的可伸縮性計(jì)算:典型的云環(huán)境將自動(dòng)提供充足的資源完成一個(gè)任務(wù)請(qǐng)求。這可能涉及工作負(fù)載的自動(dòng)監(jiān)控、資源的自動(dòng)分配、負(fù)載均衡、智能調(diào)度以及群集處理器上的并行處理。
(4)自動(dòng)配置和定制的多租戶體系結(jié)構(gòu):多個(gè)客戶可以共享相同的軟件,而不是每個(gè)客戶使用一個(gè)單獨(dú)的軟件。這樣,可以削減開發(fā)軟件的成本,因?yàn)橹恍枰_發(fā)一個(gè)軟件版本。但是,每個(gè)客戶仍然認(rèn)為軟件是定制的。
(5)可靠性和可用性:云環(huán)境通常有冗余資源,因此,如果系統(tǒng)的某些部分失效,系統(tǒng)其余部分可以自動(dòng)從故障中恢復(fù)。此外,這一工作的完成不需要用戶的知識(shí),因?yàn)榛謴?fù)工作由系統(tǒng)自動(dòng)完成。
(6)隔離和策略實(shí)施的安全性:因?yàn)樵骗h(huán)境通常提供了分散資源的集中管理,所以數(shù)據(jù)安全很重要。此外,在多租戶體系結(jié)構(gòu)中,彼此不認(rèn)識(shí)的不同用戶共享軟件和數(shù)據(jù)庫,用戶要求較高的安全保證。為了確保系統(tǒng)的安全性,在運(yùn)行期間強(qiáng)制實(shí)施多種安全策略。
(7)自動(dòng)的系統(tǒng)維護(hù)和升級(jí):云環(huán)境經(jīng)常自動(dòng)地維護(hù)它的資源,包括軟件和計(jì)算機(jī)的升級(jí)。可以通過服務(wù)更新、軟件配置和數(shù)據(jù)庫設(shè)計(jì)進(jìn)行軟件升級(jí);系統(tǒng)升級(jí)包括系統(tǒng)管理和硬件更換。此外,這些升級(jí)可能與用戶使用各種云服務(wù)同時(shí)執(zhí)行。
微軟已經(jīng)提出了如下的SaaS成熟度等級(jí)(Carraro,2006),其中每個(gè)等級(jí)在前一等級(jí)的基礎(chǔ)上添加了新的特征。
1.等級(jí)1——隨機(jī)的/定制的
這是最簡(jiǎn)單的等級(jí),它類似于傳統(tǒng)的應(yīng)用服務(wù)提供者(ASP)模型。14.2SaaS的成熟度模型在這一級(jí),每個(gè)客戶有他自己定制的應(yīng)用版本并在服務(wù)器上運(yùn)行自己的應(yīng)用實(shí)例。租戶之間不存在共享并且軟件的每個(gè)實(shí)例需要單獨(dú)開發(fā)。通過把軟件移到集中的服務(wù)器上為客戶提供服務(wù),現(xiàn)有的許多軟件程序都將滿足這一等級(jí)。圖14.2說明了這一點(diǎn)。
圖14.2隨機(jī)的/定制體系結(jié)構(gòu)2.等級(jí)2——可配置
該等級(jí)為軟件增加了靈活性。每個(gè)客戶有自己定制的軟件版本;但是,在這一級(jí)上,客戶通過選擇同一軟件提供的各種配置選項(xiàng)指定配置選擇。在前一等級(jí),每個(gè)軟件版本是為客戶獨(dú)立開發(fā)的,但是在這一級(jí),只需開發(fā)一個(gè)有許多配置選項(xiàng)的軟件程序,讓客戶自己選擇。與前一級(jí)相比,這一級(jí)的軟件更成熟、更復(fù)雜,但是只需開發(fā)一個(gè)版本。由于開發(fā)者不需要為滿足每個(gè)用戶的需要而開發(fā)成百上千個(gè)版本,因此,這一級(jí)軟件的管理和維護(hù)較容易。一般而言,定制化服務(wù)可是輕量級(jí)或重量級(jí)的:
(1)輕量級(jí)的變體:這些服務(wù)有不同的選項(xiàng)或特征,并且相同的服務(wù)使用不同的策略和/或SLA(服務(wù)等級(jí)協(xié)議)提供給不同的客戶。例如,具有高級(jí)功能,如大容量存儲(chǔ)、較好的用戶界面、允許24小時(shí)訪問的優(yōu)質(zhì)服務(wù);具有標(biāo)準(zhǔn)特征,如有限的存儲(chǔ)、普通的用戶界面、只在特定時(shí)間內(nèi)訪問的常規(guī)服務(wù)。可配置的體系結(jié)構(gòu)如圖14.3所示。
圖14.3可配置體系結(jié)構(gòu)(2)重量級(jí)的變體:這些服務(wù)提供了不同的業(yè)務(wù)過程,包括行業(yè)相關(guān)需求、不同的基礎(chǔ)設(shè)施以及通信需求。這些服務(wù)可能有相似的名字,但是如果你測(cè)試這些服務(wù),它們是明顯不同的。
3.等級(jí)3——可配置、高性能的多租戶
這一級(jí)在前一級(jí)基礎(chǔ)上添加了多租戶體系結(jié)構(gòu),如圖14.4所示。在這一級(jí),所有客戶將運(yùn)行相同的軟件版本;然而每個(gè)客戶可以看到同一軟件的不同配置。注意在前一級(jí),每個(gè)客戶看到的是一個(gè)定制的版本并單獨(dú)地運(yùn)行此版本,但是,在這一級(jí),盡管每個(gè)客戶看到的是一個(gè)定制的版本,但實(shí)際上每個(gè)客戶與成千上萬個(gè)其他客戶共享同一個(gè)軟件。很容易看到,這一級(jí)的SaaS軟件比前一級(jí)的SaaS軟件更加復(fù)雜。在前一級(jí),盡管軟件由客戶定制,因?yàn)槊總€(gè)客戶只能使用一個(gè)副本,因此它不需要處理運(yùn)行時(shí)管理。但是這一級(jí)的SaaS軟件需要解決這些新問題。SaaS軟件需要追蹤每個(gè)客戶的單獨(dú)配置、維護(hù)他們的數(shù)據(jù)庫、在運(yùn)行期間提供定制的服務(wù)。事實(shí)上,你可以認(rèn)為這一級(jí)的SaaS軟件后面有一個(gè)微型操作系統(tǒng),它可以運(yùn)行數(shù)據(jù)庫,并在運(yùn)行期間為成百上千個(gè)客戶劃分工作區(qū)。
圖14.4可配置、高性能的多租戶體系結(jié)構(gòu)4.等級(jí)4——可伸縮、可配置、高性能的多租戶
SaaS的這一級(jí)在前一級(jí)的基礎(chǔ)上添加了可伸縮性,如圖14.5所示。前一級(jí)SaaS軟件的問題是不能伸縮。因?yàn)槊總€(gè)SaaS軟件需要追蹤成千上萬個(gè)客戶并提供實(shí)時(shí)服務(wù),軟件負(fù)載過于沉重。解決這個(gè)問題的一個(gè)方法是讓等級(jí)3的同一SaaS軟件有多個(gè)副本,并且在運(yùn)行時(shí)每個(gè)都可以被調(diào)用以提供服務(wù)。客戶不與SaaS直接交互,但是首先和一個(gè)負(fù)載均衡器交互,負(fù)載均衡器將每個(gè)請(qǐng)求分配到一個(gè)合適的軟件副本上執(zhí)行。負(fù)載均衡器不斷地監(jiān)控每個(gè)軟件副本的工作量,并把客戶的新請(qǐng)求分配到合適的軟件副本上執(zhí)行。如果工作量增大,運(yùn)行在后臺(tái)的副本數(shù)量增加;如果工作量減小,副本數(shù)量減少。這樣,在服務(wù)器上維持合適的副本數(shù)量以提供最佳的性能。這一級(jí)的云環(huán)境比前一級(jí)的云環(huán)境更加復(fù)雜,因?yàn)樵谶\(yùn)行時(shí)負(fù)載均衡器要和多個(gè)SaaS副本交互。但這一級(jí)的云環(huán)境比前一級(jí)的云環(huán)境提供了更好的服務(wù),因?yàn)樗梢愿鶕?jù)環(huán)境的變化調(diào)整資源。
圖14.5可伸縮、可配置、有效的多租戶體系結(jié)構(gòu)不管是否有多租戶體系結(jié)構(gòu),SaaS軟件都可運(yùn)行在VM(虛擬機(jī))上。VM是實(shí)際機(jī)器或系統(tǒng)的隔離副本,多個(gè)VM可以運(yùn)行在同一物理系統(tǒng)上。一個(gè)VM可以和一個(gè)OS一樣大,例如,一個(gè)物理機(jī)可以運(yùn)行多個(gè)OS平臺(tái)為不同的客戶服務(wù)。VM的概念并不新穎,因?yàn)樗呀?jīng)出現(xiàn)了至少40年。在那時(shí),計(jì)算機(jī)非常昂貴,為了節(jié)省費(fèi)用,多個(gè)OS平臺(tái)運(yùn)行在一個(gè)物理機(jī)上。
盡管40年以后計(jì)算機(jī)便宜了,但是VM的概念仍然被大量地應(yīng)用,尤其在云計(jì)算中。因?yàn)樵谠朴?jì)算中,應(yīng)用和數(shù)據(jù)比物理機(jī)更貴重,但是許多應(yīng)用只運(yùn)行在某一平臺(tái)上,所以為了運(yùn)行這些應(yīng)用就需要很多VM。注意,在云計(jì)算中,多租戶體系結(jié)構(gòu)和VM是互補(bǔ)的。虛擬化允許提供不同的平臺(tái)而不需要大量額外的編程,但是,多租戶為軟件設(shè)計(jì)和編程提供了可伸縮性,因?yàn)橹恍枰_發(fā)一個(gè)軟件版本而不是獨(dú)立開發(fā)多個(gè)軟件版本。完全可以把VM和多租戶體系結(jié)構(gòu)結(jié)合起來實(shí)現(xiàn)可伸縮性和靈活性:VM為建立程序的執(zhí)行平臺(tái)提供了一種方便的方式,多租戶體系結(jié)構(gòu)用于軟件的共享。
每個(gè)SaaS應(yīng)用都有一個(gè)前臺(tái)和后臺(tái)。前臺(tái)為SaaS用戶定制需求提供條件,而后臺(tái)使用一種低成本、一致的和可伸縮的方法支持客戶。為了達(dá)到這個(gè)目標(biāo),多租戶成為SaaS的一個(gè)重要特征。在多租戶體系結(jié)構(gòu)中,SaaS軟件的一個(gè)單一實(shí)例支持多個(gè)客戶。以這種方式,服務(wù)提供者可以同時(shí)支持多個(gè)租戶,而從客戶的角度看,租戶是隔離的并按照他們的需求定制。14.3多租戶SaaS的數(shù)據(jù)庫設(shè)計(jì)多租戶體系結(jié)構(gòu)不同于多實(shí)例體系結(jié)構(gòu)。在多租戶體系結(jié)構(gòu)中,運(yùn)行在服務(wù)器上的一個(gè)軟件實(shí)例為多個(gè)客戶或租戶服務(wù);在多實(shí)例體系結(jié)構(gòu)中,有多個(gè)(不同的)軟件副本為它們的客戶服務(wù)。多租戶體系結(jié)構(gòu)需要在內(nèi)部對(duì)數(shù)據(jù)進(jìn)行分區(qū),并且需要追蹤不同客戶的不同配置。
據(jù)報(bào)道,目前的多實(shí)例體系結(jié)構(gòu)可以支持幾十個(gè)租戶,而多租戶體系結(jié)構(gòu)可以支持更大數(shù)量的租戶。但是,這要付出代價(jià)的,因?yàn)樯炜s性增加,隔離級(jí)別降低。換句話說,潛在地,多租戶體系結(jié)構(gòu)需要阻止一個(gè)租戶的QoS受到其他租戶的影響,因?yàn)樗麄児蚕碥浖约皵?shù)據(jù)庫。注意:等級(jí)1和等級(jí)2的SaaS主要使用多實(shí)例體系結(jié)構(gòu),本節(jié)主要關(guān)注等級(jí)3和等級(jí)4的SaaS應(yīng)用。
多租戶體系結(jié)構(gòu)需要解決以下問題。
1.資源隔離
因?yàn)樗凶鈶艄蚕硗粋€(gè)基礎(chǔ)設(shè)施和軟件,所以SaaS應(yīng)用以一種公平的方式為租戶隔離資源就很重要。每個(gè)租戶當(dāng)然希望能夠訪問所有需要的資源以獲得最好的服務(wù)性能,但是,在資源有限的情況下,這對(duì)于租戶來說是不現(xiàn)實(shí)的。因此,系統(tǒng)需要指定租戶的優(yōu)先權(quán),并為不同的客戶提供有差別的服務(wù)。一個(gè)簡(jiǎn)單的方法是分配資源,例如,如果用戶請(qǐng)求是規(guī)律的或經(jīng)常的,就為SaaS應(yīng)用靜態(tài)分配CPU和存儲(chǔ)器。但是,在一個(gè)云環(huán)境中,這是不可能的,因此需要一種動(dòng)態(tài)分配模式。一個(gè)租戶可以指定他的資源需求,如將來的使用模式,以便SaaS應(yīng)用相應(yīng)地調(diào)度資源。
2.定制
SaaS應(yīng)用通常允許租戶定制他們的服務(wù),包括QoS需求。例如,GoogleDoc允許不同的用戶指定不同的特征,包括軟件的外觀,可能在以后,也可以允許每個(gè)用戶指定SLA(服務(wù)等級(jí)協(xié)議)需求。注意:在多租戶體系結(jié)構(gòu)中,每個(gè)用戶使用軟件的同一實(shí)例,因此任何定制信息需要存儲(chǔ)在數(shù)據(jù)庫中。為了提供定制服務(wù),需要在運(yùn)行時(shí)檢索這些信息并使用。這增加了SaaS的靈活性,但是處理速度下降,因?yàn)樵谶\(yùn)行時(shí)需要額外的計(jì)算,還增加了數(shù)據(jù)庫的復(fù)雜性,這是因?yàn)槌艘鎯?chǔ)各種數(shù)據(jù),還要存儲(chǔ)個(gè)人定制信息。
3.安全性
在多租戶設(shè)計(jì)中,租戶共享軟件代碼和數(shù)據(jù),這導(dǎo)致了嚴(yán)重的安全風(fēng)險(xiǎn)問題:一個(gè)租戶意外地或故意地訪問另一個(gè)租戶的數(shù)據(jù)。事實(shí)上,安全問題是云計(jì)算和SaaS的重要的問題之一。
4.可伸縮性
從成熟度1級(jí)到3級(jí),伸縮性的考慮是軟件設(shè)計(jì)和編碼的問題。3級(jí)SaaS允許所有租戶使用同一軟件,因此明顯地節(jié)省了軟件設(shè)計(jì)和實(shí)現(xiàn)的工作量。但是,如果基礎(chǔ)設(shè)施沒有同一軟件的多個(gè)副本,而這個(gè)軟件是為提供服務(wù)而動(dòng)態(tài)創(chuàng)建的,3級(jí)SaaS應(yīng)用的可伸縮性就是有限的。
圖14.6是一個(gè)簡(jiǎn)單的體系結(jié)構(gòu)框架,用來幫助解決上面提到的多租戶體系結(jié)構(gòu)的挑戰(zhàn),顯然它在創(chuàng)建和運(yùn)行時(shí)都可以支持多租戶。租戶使用相同的應(yīng)用實(shí)例而不會(huì)導(dǎo)致性能、系統(tǒng)安全性、隔離和可配置性的顯著降低。
圖14.6多租戶實(shí)現(xiàn)框架在框架中有兩種類型的開發(fā)者/用戶:
(1)面向應(yīng)用的開發(fā)者(在頂層):他們負(fù)責(zé)開發(fā)或定制UI(用戶界面)的內(nèi)容、業(yè)務(wù)流程和服務(wù),不需要了解多租戶體系結(jié)構(gòu)。
(2)面向基礎(chǔ)設(shè)施的開發(fā)者(在底層):他們負(fù)責(zé)以最低成本確保應(yīng)用的有效性和可靠性。
多租戶層是框架的核心,它隔離了應(yīng)用和支持系統(tǒng)資源。租戶可以獲得多租戶的益處而不用擔(dān)心實(shí)現(xiàn)多租戶體系結(jié)構(gòu)的復(fù)雜性。14.3.1資源隔離模式
在多租戶體系結(jié)構(gòu)中,資源隔離是很重要的,其解決方案可以從完全隔離的設(shè)計(jì)到完全共享的設(shè)計(jì)。
1.獨(dú)立數(shù)據(jù)庫(SD)
這一模式中,每個(gè)租戶有自己的數(shù)據(jù)庫,與其他數(shù)據(jù)庫相分離,這是一種完全隔離的解決方案,如圖14.7所示。注意,盡管數(shù)據(jù)是隔離的,但是計(jì)算資源如CPU、存儲(chǔ)設(shè)備、應(yīng)用代碼仍由租戶共享。因?yàn)槊總€(gè)數(shù)據(jù)庫與其他數(shù)據(jù)庫相分離,所以每個(gè)客戶的數(shù)據(jù)模型就相對(duì)容易擴(kuò)展,這和傳統(tǒng)的系統(tǒng)一樣,并使用傳統(tǒng)技術(shù)從故障中恢復(fù)。這個(gè)解決方案簡(jiǎn)單但是昂貴,因?yàn)楠?dú)立數(shù)據(jù)庫需要維護(hù)備份。如果一個(gè)SaaS應(yīng)用有許多租戶,每個(gè)租戶需要一個(gè)獨(dú)立的數(shù)據(jù)庫,數(shù)據(jù)庫的數(shù)量將會(huì)很龐大,并且這大大地增加了云基礎(chǔ)設(shè)施的費(fèi)用和開銷。因此,這種方法的可伸縮性是有限的。
圖14.7隔離的數(shù)據(jù)庫2.共享數(shù)據(jù)庫但隔離的模式(SDSS)
這一模式中,多個(gè)租戶在同一數(shù)據(jù)庫中存儲(chǔ)各自的數(shù)據(jù)表,如圖14.8所示,但是每個(gè)租戶有他自己的數(shù)據(jù)庫模式和數(shù)據(jù)表。當(dāng)新租戶出現(xiàn)時(shí),系統(tǒng)使用傳統(tǒng)的SQL語句為他創(chuàng)建一組離散的表和模式。這一模式容易實(shí)現(xiàn),容易擴(kuò)展。如果一個(gè)租戶想要改變他的數(shù)據(jù)模型,其他的租戶將不會(huì)受到影響,因?yàn)樗麄冇歇?dú)立的表和模式。
圖14.8共享數(shù)據(jù)庫和隔離模式3.共享數(shù)據(jù)庫和共享模式(SDSHS)
這一模式中,多個(gè)客戶共享同一數(shù)據(jù)庫并在同一表集合中共享數(shù)據(jù),如圖14.9所示。這是一種靈活的方法,因?yàn)橹挥形ㄒ坏囊唤M模式為所有的租戶服務(wù),并且系統(tǒng)只維護(hù)一個(gè)數(shù)據(jù)庫。雖然這種方法對(duì)數(shù)據(jù)庫的設(shè)計(jì)和維護(hù)很方便,但是一個(gè)系統(tǒng)缺陷可能損壞整個(gè)數(shù)據(jù)庫,或把數(shù)據(jù)呈現(xiàn)給不同的租戶。考慮一個(gè)由多租戶共享的抵押貸款的數(shù)據(jù)庫,租戶ID是代表每個(gè)租戶的主鍵并把它作為關(guān)聯(lián)其他表的外鍵。因?yàn)樗试S同一個(gè)數(shù)據(jù)庫服務(wù)為大量的租戶服務(wù),所以在這種模式下,硬件和備份費(fèi)用較低。然而,考慮到安全性問題,這種方法將是最復(fù)雜的。這種模式也很難從故障中恢復(fù),因?yàn)檎麄€(gè)數(shù)據(jù)庫要恢復(fù)到以前的狀態(tài),而不僅僅是故障部分,但是系統(tǒng)不能精確地知道數(shù)據(jù)表的哪一部分出現(xiàn)故障。
圖14.9共享數(shù)據(jù)庫和共享模式從數(shù)據(jù)庫角度看,多租戶數(shù)據(jù)庫系統(tǒng)提供的模式需要具有下面的靈活性:
(1)可以通過擴(kuò)展基本模式來支持應(yīng)用的多個(gè)專用版本;
(2)基本模式可以動(dòng)態(tài)地變更和演化,并且擴(kuò)展在數(shù)據(jù)庫在線時(shí)完成。換句話說,完成擴(kuò)展不影響服務(wù)提供者維護(hù)數(shù)據(jù)庫。
把應(yīng)用中的多個(gè)單一租戶的邏輯模式映射到數(shù)據(jù)庫中的一個(gè)多租戶的物理模式不是很容易,因?yàn)槠髽I(yè)應(yīng)用通常允許每個(gè)租戶擴(kuò)展他的基本模式。如IBM文檔討論的,為SaaS應(yīng)用設(shè)計(jì)靈活的模式有7種可用技術(shù),可進(jìn)一步把它們分為兩類:
(1)數(shù)據(jù)庫“擁有”模式(用DDL或數(shù)據(jù)定義語言明確定義);
(2)應(yīng)用“擁有”模式(映射到數(shù)據(jù)庫中的通用結(jié)構(gòu))。
本節(jié)用一個(gè)例子來說明這些技術(shù)。一個(gè)SaaS應(yīng)用有3個(gè)租戶,每個(gè)租戶都有一個(gè)包含AccountID(Aid)和Name字段的賬戶表。租戶1屬于賓館行業(yè),用Hotel和Rooms兩個(gè)字段擴(kuò)展賬戶表。租戶3屬于抵押行業(yè),用Borkers字段擴(kuò)展賬戶表。租戶使用租戶ID列(租戶)共享表。分類1:數(shù)據(jù)庫擁有模式。
用戶視圖:數(shù)據(jù)庫視圖用于共享數(shù)據(jù)庫表,它只包含特定租戶的數(shù)據(jù)。當(dāng)出現(xiàn)一個(gè)新租戶時(shí),可以為其創(chuàng)建一個(gè)新的視圖。
私有表:每個(gè)租戶有自己的基本表的私有實(shí)例,可以根據(jù)需要擴(kuò)展,如圖14.10所示。而在所有其他的映像中,租戶共享表。
圖14.10私有表擴(kuò)展表:擴(kuò)展表是指將表垂直分割成單獨(dú)的表,它們根據(jù)一個(gè)ID列連接到基礎(chǔ)表,如圖14.11所示。圖14.11擴(kuò)展表稀疏列:每個(gè)租戶的每個(gè)擴(kuò)展字段作為稀疏列添加到與它關(guān)聯(lián)的基本表。如圖14.12所示。圖14.12稀疏列
一般而言,數(shù)據(jù)庫“擁有”模式技術(shù)表現(xiàn)良好,但是對(duì)現(xiàn)有的數(shù)據(jù)模式的演化提供的支持有限,而且在某一級(jí)別上不能伸縮。
分類2:應(yīng)用擁有模式。
XML:每個(gè)基本表通過列擴(kuò)展,列中存儲(chǔ)了XML文檔中租戶的所有擴(kuò)展字段。這些文檔會(huì)因租戶而變化,因此它們是無類型的,如圖14.13所示。
圖14.13XML圖14.14數(shù)據(jù)透視表“應(yīng)用”擁有模式中,應(yīng)用可以完全控制模式演化,但是在性能方面,可能受到很大影響。具體來講,對(duì)于基于XML的解決方案,必須解析XML文檔,然后重新組織行以處理那些擴(kuò)展字段。性能的下降與擴(kuò)展字段的數(shù)量成正比。對(duì)于基于透視表的解決方案,由于處理大型表的復(fù)雜性,使性能下降不止一個(gè)數(shù)量級(jí)。14.3.2安全性
安全機(jī)制是指防止一個(gè)租戶獲取訪問其他租戶數(shù)據(jù)的權(quán)限,目標(biāo)是使多租戶應(yīng)用有一個(gè)與傳統(tǒng)應(yīng)用軟件類似的安全保證。一般來說,實(shí)現(xiàn)數(shù)據(jù)安全有兩種方法。
1.應(yīng)用級(jí)別的過濾方法
對(duì)于SD或SDSS方法,可以使用數(shù)據(jù)庫名或模式名控制相應(yīng)租戶的訪問。對(duì)于SDSHS方法,過濾是通過每個(gè)表中的tenantID列訪問與之關(guān)聯(lián)的相應(yīng)租戶的記錄來實(shí)現(xiàn)的。它容易實(shí)現(xiàn),但為惡意訪問留下了機(jī)會(huì)。例如,一個(gè)黑客可以使用‘tenantID=XXXor1==1’訪問所有租戶的數(shù)據(jù)。SQL語句如下面所示:SELECT*
FROMTENANTS_TABLE
WHEREtenantID=2or1==1
2.DBMS級(jí)別的許可方法
這種方法為每個(gè)租戶分配一個(gè)專用的DB訪問賬號(hào)并且每個(gè)租戶只有訪問自己數(shù)據(jù)的權(quán)限,例如SD和SDSS方法。對(duì)于SDSHS,需要平衡DBMS提供的行級(jí)訪問機(jī)制,也就是LBAC(基于標(biāo)號(hào)的訪問控制)。例如,假設(shè)一個(gè)租戶在一個(gè)應(yīng)用表中對(duì)自己的數(shù)據(jù)有SELECT權(quán)限,當(dāng)這個(gè)租戶執(zhí)行一個(gè)SELECT語句時(shí),LabelSecurity評(píng)估選定的每一行并根據(jù)安全管理員分配給租戶的權(quán)限和訪問標(biāo)號(hào)來決定是否能夠訪問它。類似的,LabelSecurity可以對(duì)UPDATE、DELETE和INSERT語句進(jìn)行安全檢查。通過這種方法,可以防止?jié)撛诘腟QL注入攻擊。圖14.15顯示了LBAC的實(shí)體關(guān)系(ER)圖。三種類型的安全標(biāo)號(hào)授權(quán)給三種類型的數(shù)據(jù)庫對(duì)象,分別包括行、列和用戶。此外,一個(gè)安全標(biāo)號(hào)可以由幾個(gè)安全標(biāo)號(hào)組成。DB2V9是一個(gè)例子,它提供了這種支持,并使用DB2S
ecurityLabel保存安全標(biāo)號(hào)和為表提供安全策略。
圖14.15LBAC的實(shí)體關(guān)系圖可以使用一個(gè)預(yù)定義的LBAC規(guī)則集和安全標(biāo)號(hào)進(jìn)行比較。當(dāng)比較兩個(gè)安全表的值時(shí),規(guī)則集中的一個(gè)或多個(gè)規(guī)則用于判定一個(gè)是否阻塞另一個(gè)。例如,在DB2V9中,有一個(gè)叫做DB2LBACRULES的單一規(guī)則集,它有16個(gè)預(yù)創(chuàng)建的安全標(biāo)號(hào)組件。圖14.16中,為了共享CUSTOMER_ORDER表,產(chǎn)生了一個(gè)稱為“SecurityPolicy_Customer”的安全策略,它含有一組安全標(biāo)號(hào)。在CUSTOMER_ORDER表中,使用DB2S
ecurityLabel列把每個(gè)租戶和他的數(shù)據(jù)關(guān)聯(lián)起來。每個(gè)安全標(biāo)號(hào)包括一個(gè)從16個(gè)標(biāo)號(hào)組件中選出的元素。
圖14.16CUSTOMER_ORDER表的安全標(biāo)號(hào)的實(shí)例當(dāng)出現(xiàn)一個(gè)新租戶時(shí),操作員可以簡(jiǎn)單地選擇一個(gè)未使用的標(biāo)號(hào),并使用如下所示的SQL語句把它授權(quán)給該租戶:
GRANTSECUTIRYLABELSecurityPolicy_Customer.0001toUSERTenantXforallaccess
LBAC的優(yōu)勢(shì)是它可以控制DBMS級(jí)別的跨租戶數(shù)據(jù)的訪問,而不是應(yīng)用級(jí)別的。但是,它也有局限性,例如在DB2中,至多支持16個(gè)安全標(biāo)號(hào)和64個(gè)元素,因此租戶的最大數(shù)量是1024(16×64)。對(duì)于云計(jì)算,這個(gè)數(shù)量可能太小了。14.3.3可伸縮性
可伸縮性是多租戶的一個(gè)重要特征。隨著工作量的增大,為了保持系統(tǒng)的性能,需要的資源與工作量成比例增大。可伸縮性有兩種:
(1)向上伸縮或垂直伸縮:通過添加額外資源完成,例如在一個(gè)集群系統(tǒng)中,給一個(gè)節(jié)點(diǎn)添加CPU、內(nèi)存以及磁盤。這樣,由于擁有更多的資源,節(jié)點(diǎn)功能就更強(qiáng)大;
(2)向外伸縮或水平伸縮:通過給一個(gè)已有的集群系統(tǒng)添加額外的節(jié)點(diǎn)(處理器)完成。例如,一個(gè)集群系統(tǒng)原有30個(gè)節(jié)點(diǎn),現(xiàn)在可以擁有50個(gè)節(jié)點(diǎn)。垂直伸縮容易使用,但是由于資源管理的開銷,不能提供線性遞增伸縮。水平伸縮提供了一個(gè)性價(jià)比更好的方法,它可以通過為廉價(jià)的硬件設(shè)施添加更多的資源來遞增地?cái)U(kuò)展系統(tǒng)。此外,由于冗余,它可以提高系統(tǒng)的可靠性和可用性。
1.數(shù)據(jù)庫分區(qū)
在垂直伸縮中,可以在同一物理機(jī)上創(chuàng)建多個(gè)數(shù)據(jù)庫分區(qū);而在水平伸縮中,可以在多個(gè)物理機(jī)上創(chuàng)建分區(qū),并且每個(gè)分區(qū)有自己的內(nèi)存、CPU和存儲(chǔ)設(shè)備。數(shù)據(jù)庫中的數(shù)據(jù)可以分布到幾個(gè)分區(qū)中。分布碼是一列用來判定數(shù)據(jù)存儲(chǔ)在哪一行的分區(qū)。
數(shù)據(jù)庫分區(qū)有兩種方法:基于應(yīng)用的分布碼和基于租戶的分布碼。
(1)基于應(yīng)用的分布碼。這是數(shù)據(jù)庫分區(qū)的傳統(tǒng)方法,它根據(jù)領(lǐng)域知識(shí),通過選擇一個(gè)或多個(gè)屬性作為分布碼來進(jìn)行分區(qū)。例如,“REGION”可以用做一個(gè)分布碼。但是,這種方法需要一個(gè)合適的分布碼來平衡多個(gè)分區(qū)的負(fù)載,并且需要數(shù)據(jù)剖面信息。考慮到多租戶體系結(jié)構(gòu),這種解決方案需要更新,并解決相關(guān)的隔離問題。
(2)基于租戶的分布碼。這種方法把每個(gè)租戶的數(shù)據(jù)存儲(chǔ)在一個(gè)單一的分區(qū)中。它可以使用TenantID作為分布碼。使用這種方法,通過設(shè)定或變更TenantID,可把租戶自由地映射到任一指定分區(qū)。作為一種租戶感知方法,它提供了比前一種方法更好的隔離性和可用性。此外,它可以通過開發(fā)負(fù)載均衡算法確保大多數(shù)分區(qū)有相同的負(fù)載。
2.表分區(qū)
表分區(qū)提供了一種創(chuàng)建表的方法,表中數(shù)據(jù)的范圍分別存儲(chǔ)。這種分區(qū)的優(yōu)勢(shì)是提高了查詢性能并使表的改變更方便。例如,可以使用ALTERTABLE語句修改一個(gè)表。這要求用戶對(duì)表的存儲(chǔ)信息有清晰的了解,因此,它只適用于高級(jí)用戶。
GAE(GoogleApp引擎)是一種在Google管理數(shù)據(jù)中心開發(fā)和托管Web應(yīng)用的平臺(tái)。它提供了似乎無限計(jì)算資源,并虛擬化跨多個(gè)服務(wù)器和數(shù)據(jù)中心的應(yīng)用。GAE的基礎(chǔ)設(shè)施使托管的Web應(yīng)用容易伸縮,并使開發(fā)者從硬件配置和許多其他繁瑣的系統(tǒng)管理任務(wù)中解脫出來。GAE處理程序把代碼部署到一個(gè)集群上,并在必要時(shí)執(zhí)行監(jiān)控、故障恢復(fù)、創(chuàng)建應(yīng)用實(shí)例。GAE被設(shè)計(jì)為語言無關(guān)的,然而,當(dāng)前它僅支持Python、Java以及JVM兼容的語言。14.4GoogleApp引擎圖14.17GAE應(yīng)用體系結(jié)構(gòu)的一個(gè)簡(jiǎn)化的Java版本常支持JDK1.5和JDK1.6。Google提供了一個(gè)eclipse插件用來幫助開發(fā)者創(chuàng)建、開發(fā)和部署GAE應(yīng)用。編譯后的應(yīng)用被部署到Google云上的只讀文件系統(tǒng)。GAE提供了一個(gè)管理控制面板,它允許應(yīng)用管理員創(chuàng)建GAE應(yīng)用,監(jiān)控它們的運(yùn)行狀況,檢查使用/限額信息。
任何持久性數(shù)據(jù)通過JDO/JPA接口寫到數(shù)據(jù)存儲(chǔ)中,數(shù)據(jù)存儲(chǔ)類似于數(shù)據(jù)庫服務(wù)。通過SDC(安全數(shù)據(jù)連接),GAE允許它的應(yīng)用在公司數(shù)據(jù)庫中檢索數(shù)據(jù)并寫數(shù)據(jù),這使得企業(yè)系統(tǒng)和GAE的集成更容易。
GAE應(yīng)用使用資源的數(shù)量最多到一定的限額。通用的資源包括請(qǐng)求數(shù)、輸入帶寬、輸出帶寬、CPU時(shí)間、數(shù)據(jù)庫API調(diào)用、數(shù)據(jù)庫查詢。14.4.1服務(wù)
GAE通過JavaAPI暴露的服務(wù)如下:
(1)URL獲取服務(wù):它允許應(yīng)用訪問資源,并通過HTTP與HTTPS與Internet上的其他主機(jī)通信。
(2)郵件服務(wù):通過GAE的郵件服務(wù),應(yīng)用可以使用Google的基礎(chǔ)設(shè)施發(fā)送郵件消息。
(3)內(nèi)存緩沖服務(wù):內(nèi)存緩沖服務(wù)是一個(gè)分布式的內(nèi)存數(shù)據(jù)高速緩存,應(yīng)用的多個(gè)實(shí)例可以訪問它。
(4)圖像處理服務(wù):它提供了允許用戶處理圖像的API,如調(diào)整大小、旋轉(zhuǎn)、壓縮和翻轉(zhuǎn)。
(5)任務(wù)調(diào)度服務(wù):任務(wù)調(diào)度服務(wù)也可稱為cron服務(wù),它使應(yīng)用在指定的次數(shù)或時(shí)間段內(nèi)響應(yīng)Web請(qǐng)求時(shí)能執(zhí)行其他任務(wù)。換句話說,應(yīng)用可以在處理Web請(qǐng)求的同時(shí)創(chuàng)建并運(yùn)行后臺(tái)任務(wù)。
(6)Google賬戶:為了鑒定用戶,GAE把應(yīng)用和Google賬戶集成在一起,它減少了開發(fā)者實(shí)現(xiàn)個(gè)人用戶賬戶系統(tǒng)的工作量。如果用戶已經(jīng)擁有一個(gè)Google賬戶,它使用戶能更快地使用應(yīng)用。14.4.2數(shù)據(jù)存儲(chǔ)
GAE使用數(shù)據(jù)存儲(chǔ)服務(wù)Datastore存儲(chǔ)和查詢數(shù)據(jù)。Datastore是一個(gè)無模式的具有查詢引擎和支持原子事務(wù)的對(duì)象數(shù)據(jù)庫。該服務(wù)可以通過開源的DataNucleusAccess平臺(tái)實(shí)現(xiàn)JDO(JavaDataObjects)和JPA(JavaPersistenceAPI)訪問。
Datastore建立在BigTable之上,BigTable建立在GFS(Google文件系統(tǒng))之上,因此當(dāng)數(shù)據(jù)增加的時(shí)候,它可以很好地伸縮,并具有高可用性和高可靠性。GFS將在下一節(jié)進(jìn)行討論。雖然GAE的Datastore與傳統(tǒng)的關(guān)系數(shù)據(jù)庫具有類似之處,但實(shí)際上它們有很大區(qū)別。首先,Datastore是無模式的,數(shù)據(jù)實(shí)體的結(jié)構(gòu)由應(yīng)用代碼決定;其次,它支持連接查詢,但不支持多對(duì)多關(guān)系、分組和其他的聚合查詢。
GAE的Datastore實(shí)際上是一個(gè)層次數(shù)據(jù)庫,不同區(qū)域的實(shí)體在Datastore里有嚴(yán)格的分層(Barrett)。一個(gè)節(jié)點(diǎn)有一個(gè)父節(jié)點(diǎn),也可以沒有。如果沒有父節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)稱為根節(jié)點(diǎn)。根節(jié)點(diǎn)和其所有的子節(jié)點(diǎn)構(gòu)成了一個(gè)稱作實(shí)體組的實(shí)體集群。Datastore里的每個(gè)實(shí)體都有一個(gè)關(guān)鍵碼,用來唯一標(biāo)識(shí)應(yīng)用里的一個(gè)實(shí)體。實(shí)體的本地碼由實(shí)體類別和ID組成,ID可以是應(yīng)用指定的名字或者Datastore指定的數(shù)值型ID。對(duì)于根實(shí)體,它的關(guān)鍵碼就是它的本地碼。子實(shí)體的關(guān)鍵碼是一條路徑,由根到子實(shí)體路徑上的祖先的本地碼組成。
GAE的Datastore使用了BigTable,它支持以下操作:讀、寫、刪除、單行事務(wù)、前綴瀏覽和范圍瀏覽。為了使用BigTable,Datastore按照不同BigTable服務(wù)的關(guān)鍵碼分配存儲(chǔ)實(shí)體的范圍,以分布式的方式存儲(chǔ)實(shí)體。因此,Datastore也可看做碎片分類數(shù)組(Barrett)。實(shí)體組成員在任何時(shí)間都處于同一BigTable服務(wù)中。用一個(gè)服務(wù)管理包含同一實(shí)體組的實(shí)體的事務(wù),實(shí)現(xiàn)起來簡(jiǎn)單高效。目前,GAE僅支持一個(gè)實(shí)體組上的事務(wù)。
Datastore支持很強(qiáng)的數(shù)據(jù)一致性并使用優(yōu)化的并發(fā)控制維護(hù)數(shù)據(jù)的一致性。事務(wù)中會(huì)發(fā)生實(shí)體的更新,這意味著它或者成功或者失敗。事務(wù)操作在實(shí)體組的根級(jí)別上。一旦相同實(shí)體組內(nèi)有更新實(shí)體的多個(gè)請(qǐng)求,就會(huì)發(fā)生競(jìng)爭(zhēng),獲勝者可以執(zhí)行更新,而其他的請(qǐng)求在固定的次數(shù)內(nèi)繼續(xù)競(jìng)爭(zhēng)直到請(qǐng)求超時(shí)。與鎖并發(fā)控制算法相比,這種方式具有更好的吞吐量(Barrett)。
Datastore默認(rèn)在類別和所有的屬性上創(chuàng)建索引,通過用戶指定的配置文件創(chuàng)建多個(gè)屬性的復(fù)合索引,所有索引通過BigTable實(shí)現(xiàn)(Barrett)。14.4.3開發(fā)可伸縮應(yīng)用的提示
GAE用戶或許使用以下技術(shù)開發(fā)可伸縮的應(yīng)用(JasonCooperj):
(1)通過關(guān)鍵碼、碼的名稱或ID檢索對(duì)象/實(shí)體。與傳統(tǒng)的關(guān)系數(shù)據(jù)庫相比,GAE的Datastore更像是一個(gè)分布式的分類數(shù)組/哈希表,并且讀操作高度優(yōu)化。
(2)不使用偏移量分頁,檢索立即使用的數(shù)據(jù)。因?yàn)镈atastore的查詢最多可以返回1000個(gè)結(jié)果,如果超過了1000個(gè),執(zhí)行效率會(huì)降低。另一個(gè)原因是許多資源實(shí)際上被浪費(fèi)了,因?yàn)榇蠖鄶?shù)返回結(jié)果在使用前被丟棄了。
(3)保持實(shí)體組較小。由于事務(wù)的發(fā)生僅局限于實(shí)體組內(nèi),GAE對(duì)事務(wù)的支持是有限的。這意味著,大的實(shí)體組競(jìng)爭(zhēng)概率大,并行度低,這限制了應(yīng)用的吞吐率。
(4)碎片常寫實(shí)體。對(duì)于數(shù)據(jù),通過碎片技術(shù),可以使寫操作分布式和并行化。事實(shí)上,碎片化有效地把單個(gè)實(shí)體分割成許多片。當(dāng)查詢一個(gè)結(jié)果時(shí),可通過查詢所有碎片并組合查詢結(jié)果快速得到計(jì)算結(jié)果。14.4.4開發(fā)工具
用于Java的GAESDK(軟件開發(fā)工具包)包括:
(1)支持本地GAE應(yīng)用開發(fā)和調(diào)試的本地仿真器,它有一個(gè)本地Web服務(wù)器和數(shù)據(jù)庫服務(wù)。真實(shí)的GAE運(yùn)行時(shí)的安全策略也應(yīng)用到仿真器上。
(2)SDK包含了GAE中所有可用的API和庫。
(3)EclipseIDE插件簡(jiǎn)化了GAE應(yīng)用的開發(fā)和部署。14.4.5其他約束
考慮到安全因素,GAE應(yīng)用運(yùn)行在一個(gè)受限制的“沙箱”環(huán)境中,因此,有以下約束:
(1)GAE應(yīng)用不能寫文件系統(tǒng),但允許從文件系統(tǒng)讀。應(yīng)用必須用Datastore服務(wù)寫數(shù)據(jù)。
(2)不支持Socket通信或直接訪問另一個(gè)主機(jī)。HTTP/HTTPS請(qǐng)求需要通過GAE的URL獲取服務(wù)生成。
(3)不支持子進(jìn)程或線程。Web請(qǐng)求必須在一個(gè)單一的進(jìn)程中處理。
(4)有響應(yīng)時(shí)間的限制。Web請(qǐng)求處理必須在30秒內(nèi)完成,否則它將被終止。
(5)不支持系統(tǒng)調(diào)用。
GFS(GoogleFileSystem,Google文件系統(tǒng))是一種支持查詢和信息搜集的文件系統(tǒng)。它很可能是最大的文件系統(tǒng)。在查詢和搜集時(shí),由于Google依賴有效的文件訪問,所以文件系統(tǒng)必須是高效的并且可伸縮。據(jù)Google報(bào)告,使用Google的用戶數(shù)量在不斷上升,有時(shí)高速上升。GFS技術(shù)成為Google向用戶提供即時(shí)服務(wù)的關(guān)鍵技術(shù),因而大量的工作量花費(fèi)在GFS工程和再工程上。據(jù)Quilan報(bào)告(Quinlan,2010),GFS經(jīng)過了重要的設(shè)計(jì)變更以滿足不斷變化的環(huán)境。14.5Google文件系統(tǒng)
S.Ghemawat,2003年提到了早期的GFS設(shè)計(jì),后來做了許多改變,所有的文件被劃分成64MB大小的塊。大多數(shù)情況下,用戶會(huì)在文件末尾追加信息或者讀文件,因此GFS的設(shè)計(jì)支持那些操作。GFS運(yùn)行在數(shù)以千計(jì)的廉價(jià)的處理器的Google基礎(chǔ)設(shè)施之上。
GFS早期有幾個(gè)關(guān)鍵的考慮和決策:
(1)系統(tǒng)結(jié)構(gòu)應(yīng)該開發(fā)起來簡(jiǎn)單,節(jié)省實(shí)現(xiàn)的工作量。
(2)系統(tǒng)使用數(shù)以千計(jì)甚至百萬個(gè)處理器支持可伸縮的操作。
(3)由于數(shù)據(jù)龐大并且許多數(shù)據(jù)是流動(dòng)的,所以不需要緩存。流動(dòng)的數(shù)據(jù)是不需要緩存的。
(4)使用的廉價(jià)處理器可能會(huì)失效,系統(tǒng)至少應(yīng)該提供三個(gè)副本避免這種失效。更多的副本可以增加系統(tǒng)的可用性。
(5)應(yīng)當(dāng)提供常見的接口和API,同時(shí)這些API應(yīng)該支持常用的Google操作,如快照和記錄追加。
(6)初步設(shè)計(jì)要具有高的吞吐量而不是短的延遲。注意,吞吐量和延遲本質(zhì)上是沖突的。根據(jù)排隊(duì)論(Lavenberg,1983),具有高吞吐量的系統(tǒng)一般上都有大的延遲,而具有低延遲的系統(tǒng),它的吞吐量也比較低。第一個(gè)考慮導(dǎo)致了簡(jiǎn)單的設(shè)計(jì),它允許Google把軟件部署到市場(chǎng)上獲取市場(chǎng)占有率。然而,由于更多的用戶使用Google查詢和獲取頁面,用戶體驗(yàn)成為一個(gè)關(guān)鍵的問題。用戶體驗(yàn)的一個(gè)關(guān)鍵是低延遲,因此,后來GFS做了相應(yīng)的變更來解決這個(gè)問題。14.5.1GFS系統(tǒng)結(jié)構(gòu)和操作
GFS系統(tǒng)有兩類節(jié)點(diǎn):用來管理元數(shù)據(jù)的主節(jié)點(diǎn)和用來提供數(shù)據(jù)存儲(chǔ)的塊服務(wù)器,如圖14.18所示。為了節(jié)省時(shí)間,數(shù)據(jù)直接在客戶/塊服務(wù)器間傳輸而不經(jīng)過主節(jié)點(diǎn)。為了高效處理,主節(jié)點(diǎn)總是駐留在內(nèi)存中。
圖14.18GFS體系結(jié)構(gòu)主服務(wù)器存儲(chǔ)和管理以下與塊關(guān)聯(lián)的元數(shù)據(jù):
(1)把文件映射到塊位置(64位)地址的表。
(2)把文件映射到它的副本的表。
(3)讀寫一個(gè)具體塊的處理表。
(4)支持文件持久性的操作日志,日志中還包括塊服務(wù)器失效后,使用文件復(fù)制時(shí)的信息以及可以恢復(fù)的檢查點(diǎn)。
為了更新表實(shí)體,主服務(wù)器定期接收來自塊服務(wù)器的更新。它也負(fù)責(zé)創(chuàng)建、復(fù)制和重新均衡塊。塊的重新均衡可以提高空間利用率和訪問速度。同時(shí),主服務(wù)器也負(fù)責(zé)回收垃圾。塊服務(wù)器存儲(chǔ)數(shù)據(jù)文件,每個(gè)獨(dú)立的文件被劃分成固定大小為64MB的塊。每個(gè)塊有唯一的64位的標(biāo)識(shí),同時(shí)維護(hù)文件到組成塊的邏輯映射。每個(gè)塊也有一個(gè)檢測(cè)系統(tǒng)故障的64位的校驗(yàn)碼。在系統(tǒng)中每個(gè)塊至少有三個(gè)副本,而需求量大的文件有更多的副本。塊服務(wù)器運(yùn)行在Linux上并維護(hù)數(shù)據(jù)的一致性。
如果一個(gè)進(jìn)程需要訪問某一塊,它首先必須獲得主服務(wù)器的許可。在檢查一個(gè)具體的塊可用(也就是沒有其他進(jìn)程正在使用它)之后,主服務(wù)器提供塊服務(wù)器地址,允許此進(jìn)程在一段時(shí)間訪問這個(gè)塊。在這期間,此進(jìn)程可以訪問這個(gè)塊服務(wù)器,而為了維護(hù)系統(tǒng)的一致性,其他的進(jìn)程不能訪問這個(gè)塊服務(wù)器。進(jìn)程和塊服務(wù)器直接交互,不受主服務(wù)器的干涉。如果進(jìn)程更改了這個(gè)塊,這個(gè)更改被傳送到這個(gè)塊的副本所在的塊服務(wù)器上,在收到所有副本所在塊服務(wù)器的確認(rèn)之前,系統(tǒng)不會(huì)提交。這通過主塊服務(wù)器管理。
早期,Google使用的GFS有200多個(gè)集群、5000多臺(tái)機(jī)器、5+PB大小的文件系統(tǒng)、在硬件頻繁失效情況下單個(gè)集群上每秒40GB的讀寫負(fù)載。由于越來越多的人使用Google,GFS有了顯著的改進(jìn)。
注意,GFS不是作為OS內(nèi)核的一部分實(shí)現(xiàn)的,它的許多操作用戶可以直接使用。由于任何文件系統(tǒng)訪問不需要經(jīng)過OS功能調(diào)用層,這提高了系統(tǒng)性能。傳統(tǒng)的系統(tǒng)調(diào)用,如OS中進(jìn)程的創(chuàng)建,開銷是比較大的。14.5.2GFS開發(fā)中的經(jīng)驗(yàn)
本小節(jié)重點(diǎn)討論主節(jié)點(diǎn)。從一開始,Google就知道單一的主節(jié)點(diǎn)存在問題。然而,Google仍然決定采用這種方式,并且這也是最早作的決定。這個(gè)決定使GFS能夠快速實(shí)現(xiàn)并部署到市場(chǎng)中??紤]到這一方面,Google做出了正確的決策。
然而,當(dāng)越來越多的人使用Google時(shí),許多問題變得突出,特別是文件大小的增加,從幾百萬兆到幾千萬兆,然后到數(shù)億兆。主節(jié)點(diǎn)上元數(shù)據(jù)數(shù)量急劇增加,因此主節(jié)點(diǎn)上的負(fù)荷也急劇增加。并行MapReduce的使用對(duì)此問題沒有幫助,由于上百萬的MapReduce操作需要同時(shí)訪問文件,主節(jié)點(diǎn)的負(fù)載會(huì)急劇增加。注意,主節(jié)點(diǎn)一直駐留在內(nèi)存中,元數(shù)據(jù)信息量會(huì)隨著時(shí)間顯著的增加。
失效的單個(gè)節(jié)點(diǎn)也會(huì)對(duì)某些應(yīng)用,如視頻服務(wù),帶來不好的結(jié)果。而且,剛開始,GFS對(duì)主節(jié)點(diǎn)沒有自動(dòng)恢復(fù)計(jì)劃。因此,當(dāng)主節(jié)點(diǎn)失效時(shí),將需要很長一段時(shí)間恢復(fù)。Google的解決方案是生成影子主節(jié)點(diǎn),它存儲(chǔ)主節(jié)點(diǎn)狀態(tài)的快照以快速恢復(fù)。此外,初步設(shè)計(jì)的目標(biāo)是高吞吐量,而延遲是其次考慮的問題,后來才強(qiáng)調(diào)了低延遲。根據(jù)排隊(duì)論,吞吐量和延遲是沖突的。服務(wù)器偏愛高吞吐量的系統(tǒng),而用戶卻被長時(shí)間延遲。低延遲系統(tǒng)得到用戶的喜愛,但系統(tǒng)因此要向用戶提供支持快速服務(wù)的能力。Google的解決方法是通過冗余操作確保任何失效可以容易地隱藏,因?yàn)槭?dǎo)致了大多數(shù)延遲。例如,如果一個(gè)寫操作失敗,而沒有可用的冗余操作,這個(gè)失敗的操作會(huì)導(dǎo)致系統(tǒng)明顯延遲。GFS有兩個(gè)寫日志,如果一個(gè)失敗,另一個(gè)會(huì)立即接管。由于相同的原因,主節(jié)點(diǎn)需要多個(gè)影子副本。此外,GFS通過容錯(cuò)機(jī)制支持并發(fā)讀寫,因此,和典型的文件系統(tǒng)相比,它的一致性模型更復(fù)雜。根據(jù)(Quinlan,2010),這是問題的根源,尤其是允許多個(gè)寫操作同時(shí)執(zhí)行時(shí)。
Google也嘗試采用多單元方法,它在數(shù)據(jù)中心上創(chuàng)建多個(gè)單元,用這種方法,多個(gè)GFS主節(jié)點(diǎn)將運(yùn)行在一個(gè)塊服務(wù)器池上。這也需要應(yīng)用把數(shù)據(jù)劃分到不同的單元上。14.5.3其他類似項(xiàng)目
其他分布式文件系統(tǒng)也是可用的。如HadoopHDFS(Hadoop)、CloudStore(CloudStore)。HDFS和Cloudstore幾乎是同時(shí)開發(fā)的。HDFS使用Java語言,而為了提高效率,CloudStore后臺(tái)采用C++語言。
HDFS也把文件劃分成64MB的塊,存儲(chǔ)在一組機(jī)器上。與GFS相似,它通過在多個(gè)主機(jī)上復(fù)制數(shù)據(jù)實(shí)現(xiàn)可靠性。每個(gè)主機(jī)都可以和其他主機(jī)進(jìn)行通信完成數(shù)據(jù)復(fù)制。類似于GFS,HDFS也有一個(gè)唯一的服務(wù)器,稱為節(jié)點(diǎn),如果它不工作了,文件系統(tǒng)就不可用。恢復(fù)后,需要執(zhí)行以前所有的命令確保文件系統(tǒng)的一致性,整個(gè)過程需要較長的時(shí)間。
CloudStore具有與GFS類似的體系結(jié)構(gòu),它有三個(gè)主要組件:
(1)元數(shù)據(jù)服務(wù)器,它提供全局的名字空間;
(2)阻塞服務(wù)器,文件像GFS一樣存儲(chǔ)在塊中;
(3)客戶庫,它提供文件系統(tǒng)的API,實(shí)現(xiàn)應(yīng)用和CloudStore的連接。
CloudStore是一個(gè)開源程序,它復(fù)制了Hadoop項(xiàng)目的許多特征,包括數(shù)據(jù)完整性、C++語言訪問、Java和Python語言訪問、復(fù)制和可伸縮性。
HDFS的一個(gè)特征是寫操作要求從文件的開始寫起,直到到文件的結(jié)尾,實(shí)際上,任何寫操作都是整個(gè)文件的完全重寫。然而,KFS允許在任何位置寫,也可以追加一些內(nèi)容到當(dāng)前的文件。KFS也支持簡(jiǎn)單的自動(dòng)負(fù)載均衡機(jī)制,因此系統(tǒng)可以把數(shù)據(jù)從擁塞的節(jié)點(diǎn)移到不擁塞的節(jié)點(diǎn),但是HDFS沒有這樣的機(jī)制。
BigTable用于處理Web應(yīng)用的大量的半結(jié)構(gòu)化數(shù)據(jù)。例如,URLs(包括內(nèi)容、搜集的元數(shù)據(jù)、鏈接、導(dǎo)航和網(wǎng)頁級(jí)別)、用戶喜好數(shù)據(jù)(包括個(gè)性化設(shè)置、最近的查詢/檢索結(jié)果)、地理位置(包括諸如商店和餐廳類的物理實(shí)體、道路、衛(wèi)星圖像數(shù)據(jù)和用戶標(biāo)注)。因?yàn)閾碛?012數(shù)量級(jí)的URLs,每個(gè)URLs有多個(gè)版本/頁面,每頁有約20KB的數(shù)據(jù)、上億的用戶,每秒有上千的訪問請(qǐng)求,并且有超過100TB的衛(wèi)星圖像數(shù)據(jù),因此,這個(gè)數(shù)據(jù)量是非常龐大的。14.6BigTable有人可能使用商用數(shù)據(jù)庫開發(fā)Web應(yīng)用,如Oracle、DB2和SQLserver等,但是這些數(shù)據(jù)庫系統(tǒng)多用于商業(yè)計(jì)算,而不是用于Web應(yīng)用,很多底層優(yōu)化無法做到。因此,Google決定開發(fā)在存儲(chǔ)和數(shù)據(jù)傳送操作方面有很多底層優(yōu)化機(jī)制的BigTable。
BigTable欲達(dá)到如下目標(biāo):
(1)它能異步和無間斷處理請(qǐng)求。
(2)它能支持高達(dá)每秒百萬次速率的讀/寫操作。
(3)它能從搜索到的網(wǎng)頁中掃描所有的或感興趣的數(shù)據(jù)來識(shí)別需要的信息,并在巨大的一對(duì)一或一對(duì)多數(shù)據(jù)集上執(zhí)行join操作,這是涉及許多數(shù)據(jù)集的復(fù)雜計(jì)算。
(4)它能隨時(shí)檢查并跟蹤數(shù)據(jù)變化,這對(duì)搜集信息很有用。如果一個(gè)Web頁沒有改變,沒必要再次搜集相同的網(wǎng)頁。
(5)它能存儲(chǔ)各網(wǎng)頁的歷史數(shù)據(jù),為數(shù)據(jù)挖掘和分析提供統(tǒng)計(jì)信息。
(6)當(dāng)請(qǐng)求數(shù)量和數(shù)據(jù)規(guī)模隨時(shí)間增加時(shí),它能在性能上進(jìn)行伸縮。將來數(shù)據(jù)的規(guī)??隙〞?huì)增加。
(7)它能以內(nèi)建的容錯(cuò)機(jī)制提供可靠和高可用的計(jì)算與數(shù)據(jù)服務(wù)?;旧?BigTable是一個(gè)分布式存儲(chǔ)系統(tǒng),而不是一般意義上的、建立在數(shù)千臺(tái)廉價(jià)服務(wù)器上、管理PB(1015數(shù)量級(jí))級(jí)字節(jié)的大型結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng)。目前,BigTable每天能高效、可伸縮、高可用地處理PB級(jí)字節(jié)的數(shù)據(jù)。BigTable的最初設(shè)計(jì)開始于2004年,它目前廣泛用于Google服務(wù)中,包括Google分析、Google金融、Orkut社會(huì)性網(wǎng)絡(luò)服務(wù)、個(gè)性化搜索、Writely字處理軟件和Google地球。14.6.1主要構(gòu)件
BigTable有如下主要構(gòu)件:
(1)GFS:提供可伸縮的Web文件系統(tǒng)支持;
(2)Scheduler:提供大量機(jī)器之間作業(yè)調(diào)度,并監(jiān)控任何機(jī)器的錯(cuò)誤,在必要時(shí)重新調(diào)度;
(3)Lockservice:是一個(gè)分布式鎖管理器,提供對(duì)小文件的可靠管理;
(4)MapReduce:用于讀寫B(tài)igTable數(shù)據(jù)。
BigTable集群管理一個(gè)分布的運(yùn)行不同類型應(yīng)用的機(jī)器共享池,這個(gè)集群管理系統(tǒng)把作業(yè)分配到不同的機(jī)器,管理共享機(jī)器上的資源,監(jiān)控機(jī)器狀態(tài),處理運(yùn)行時(shí)錯(cuò)誤。系統(tǒng)的體系結(jié)構(gòu)如圖14.19所示。
圖14.19BigTable集群的系統(tǒng)結(jié)構(gòu)圖14.6.2BigTable概述
1.?dāng)?shù)據(jù)模型
BigTable實(shí)質(zhì)上是一個(gè)稀疏的分布式多維存儲(chǔ)圖。圖的索引是一個(gè)由三個(gè)部分組成的字符串:行關(guān)鍵字、列關(guān)鍵字和時(shí)間戳,定義如下:
(row:string,column:string,time:int64)>string
圖14.20是一個(gè)存儲(chǔ)在“”的Web頁中的表的切片。
圖14.20BigTable的數(shù)據(jù)模型
(1)行:行關(guān)鍵字是任意的字符串(最多64KB,大多數(shù)用戶使用10~100Byte),對(duì)行的數(shù)據(jù)訪問是原子性的,由事務(wù)處理支持。行的建立隱含在存儲(chǔ)數(shù)據(jù)之上。BigTable按字母順序?qū)π嘘P(guān)鍵字排序,并根據(jù)一個(gè)或少量處理器動(dòng)態(tài)劃分行的范圍。每一行范圍被看成一個(gè)數(shù)據(jù)片,它是分布和負(fù)載均衡的基本單元。這樣便于閱讀,并利用本地化原則的優(yōu)勢(shì)使訪問更加有效。這些工作的完成是通過遍歷URLs的主機(jī)名稱部分獲取相同域中的信息,然后把相關(guān)信息組織在一起形成一些連續(xù)的行。例如,一個(gè)人可以在/index.html中存儲(chǔ)/index.html的數(shù)據(jù)。在相同域中存儲(chǔ)同一領(lǐng)域相互緊密關(guān)聯(lián)的Web頁具有空間和時(shí)間上局部化的優(yōu)勢(shì)。一個(gè)用戶訪問一個(gè)頁很可能在最近的將來(時(shí)間局部性)訪問相關(guān)的頁(空間局部性)。
(2)列:Web頁被劃分為若干個(gè)集合,稱為列簇(Columnfamilies),是訪問控制的基本單位。列簇通常存儲(chǔ)相同類型的數(shù)據(jù)。列簇僅在列關(guān)鍵字產(chǎn)生以后創(chuàng)建,并在那個(gè)創(chuàng)建關(guān)鍵字的表中使用,因而不同列簇的數(shù)量很小,且在操作過程幾乎不變。列關(guān)鍵字的詞法是:family:[optional]qualifier,其中列簇名字應(yīng)當(dāng)是可打印的,限定符是任意字符串。例如:一個(gè)可能的簇名字是“l(fā)anguage”,它存儲(chǔ)每一個(gè)Web頁的語言標(biāo)識(shí)(ID)。訪問控制和磁盤/存儲(chǔ)費(fèi)用在列簇級(jí)上執(zhí)行。
(3)時(shí)間戳:BigTable可存儲(chǔ)通過時(shí)間戳索引的相同數(shù)據(jù)的多個(gè)版本。時(shí)間戳是一個(gè)64位整數(shù),它要么被BigTable賦值成以毫秒表示的“實(shí)時(shí)”時(shí)間,要么被客戶應(yīng)用明確賦值。為避免沖突,應(yīng)用需要產(chǎn)生獨(dú)一無二的時(shí)間戳。最近時(shí)間戳的版本存儲(chǔ)在第一位,不同的版本按降序存儲(chǔ)。為了自動(dòng)進(jìn)行垃圾回收,客戶要么指定一個(gè)單元的最近n個(gè)版本,要么保存足夠多的最新版本。
2.實(shí)現(xiàn)結(jié)構(gòu)
數(shù)據(jù)片(Tablets):為了讓數(shù)據(jù)分發(fā)至不同的機(jī)器,BigTable按行把大表分割成若干數(shù)據(jù)片。一個(gè)數(shù)據(jù)片存儲(chǔ)若干鄰接行,在任何給定時(shí)間內(nèi),數(shù)據(jù)片都是單個(gè)機(jī)器管理的基本單位。每個(gè)數(shù)據(jù)片有起始和結(jié)束行的關(guān)鍵字,大約存儲(chǔ)100~200MB大小的數(shù)據(jù)。
給定一個(gè)服務(wù)器,它可能負(fù)責(zé)約100個(gè)數(shù)據(jù)片,因?yàn)榘催@個(gè)比率,它能很快執(zhí)行恢復(fù)和負(fù)載均衡。例如,如果一個(gè)機(jī)器失效,100個(gè)其他機(jī)器通過每臺(tái)從失效機(jī)器上抓取一個(gè)數(shù)據(jù)片的辦法進(jìn)行恢復(fù)。主機(jī)也可在某機(jī)過載時(shí),把這個(gè)機(jī)器的一些數(shù)據(jù)片移到另一臺(tái)機(jī)器上。數(shù)據(jù)片的例子如圖14.21所示。
圖14.21示例數(shù)據(jù)片
當(dāng)數(shù)據(jù)片過大時(shí),例如,大于期望的兆級(jí)字節(jié)時(shí),數(shù)據(jù)片被一分為二,如圖14.22所示。
圖14.22劃分?jǐn)?shù)據(jù)片使用數(shù)據(jù)片時(shí),有幾個(gè)問題需要說明:
(1)定位數(shù)據(jù)片。
因?yàn)閿?shù)據(jù)片會(huì)從一個(gè)服務(wù)器向另一個(gè)服務(wù)器移動(dòng),“給定一行,客戶如何找到正確的機(jī)器?”。每個(gè)數(shù)據(jù)片有一個(gè)起始和結(jié)束行,因此可以通過查看每個(gè)機(jī)器的數(shù)據(jù)片范圍識(shí)別出數(shù)據(jù)片。一種方法是使用BigTable主機(jī)存儲(chǔ)每個(gè)機(jī)器的行范圍,但當(dāng)數(shù)據(jù)片數(shù)量巨大時(shí),中央服務(wù)器將變成系統(tǒng)的瓶頸。
另一種方式是,存儲(chǔ)一個(gè)包含BigTable中定位數(shù)據(jù)片信息的表。數(shù)據(jù)片的“3級(jí)層次查找模式”如圖14.23所示。位置用相關(guān)服務(wù)器的IP:端口表示。在第1級(jí),它從一個(gè)鎖服務(wù)器開始,指向根數(shù)據(jù)片的擁有者。在第2級(jí),使用根數(shù)據(jù)找到合適的元數(shù)據(jù)數(shù)據(jù)片的擁有者。在第3級(jí),元數(shù)據(jù)表保存所有用戶表的數(shù)據(jù)片位置。圖14.233級(jí)層次查找模式特別說明,為避免根數(shù)據(jù)片成為瓶頸,BigTable使用主動(dòng)預(yù)取和緩存方法。
(2)數(shù)據(jù)片服務(wù)。
為存儲(chǔ)數(shù)據(jù),BigTable使用Google的SSTable文件格式。SSTabler提供一種長久有序且不改變的從主鍵到值的映射,鍵和值都定義成任意的字節(jié)型字符串。數(shù)據(jù)片的持續(xù)狀態(tài)存儲(chǔ)在GFS中,如圖14.24所示。更新時(shí),當(dāng)前提交的數(shù)據(jù)存儲(chǔ)在緩沖區(qū)的內(nèi)存中,舊的更新存儲(chǔ)在SSTables集合中,提交日志記錄所有的還沒有提交的變化。當(dāng)一個(gè)寫操作到達(dá)數(shù)據(jù)片服務(wù)器時(shí),服務(wù)器首先檢查它格式是否正確、發(fā)送者是否有改變數(shù)據(jù)的權(quán)限。如果是,寫操作被處理。寫操作提交后,相應(yīng)內(nèi)容被插入到內(nèi)存。當(dāng)一個(gè)讀請(qǐng)求出現(xiàn)時(shí),服務(wù)器在執(zhí)行讀操作前執(zhí)行相同的檢查。讀操作的執(zhí)行基于SSTables集合和內(nèi)存的合并視圖,如圖14.24所示。
圖14.24表的表示(3)數(shù)據(jù)片壓縮。
每個(gè)數(shù)據(jù)片的狀態(tài)表示成內(nèi)存中一個(gè)不變的SSTable壓縮文件,并以一個(gè)日志緩沖作為結(jié)束。BigTable提供兩類壓縮:輔壓縮和主壓縮。輔壓縮在內(nèi)存滿時(shí)發(fā)生,系統(tǒng)可選擇帶有多數(shù)數(shù)據(jù)的數(shù)據(jù)片并把內(nèi)容寫入GFS的SSTable。另一方面,系統(tǒng)周期性地執(zhí)行主壓縮,把所有SSTables打包成GFS中新的基礎(chǔ)SSTable。
(4)數(shù)據(jù)片服務(wù)器。
BigTable能夠處理數(shù)千數(shù)據(jù)片服務(wù)器。假定每個(gè)服務(wù)器擁有100個(gè)數(shù)據(jù)片,將會(huì)有1M數(shù)據(jù)片。每個(gè)機(jī)器上的所有數(shù)據(jù)片共享一個(gè)日志。否則,一個(gè)集群上的一百萬數(shù)據(jù)片將導(dǎo)致寫太多的文件,而且,同時(shí)寫1M個(gè)日志會(huì)使得性能急速下降。
通過使用共享日志,每一個(gè)表服務(wù)器有一個(gè)用于存儲(chǔ)它上面的所有數(shù)據(jù)片的寫日志,并在同一個(gè)日志文件中更新多個(gè)數(shù)據(jù)片。因?yàn)槊恳粋€(gè)數(shù)據(jù)塊為64MB,因此當(dāng)不斷更新時(shí),新的日志塊將會(huì)頻繁創(chuàng)建。共享日志存在的一個(gè)問題是,在恢復(fù)期,服務(wù)器需要讀日志數(shù)據(jù)進(jìn)行數(shù)據(jù)片的變更,如果大量數(shù)據(jù)片需要恢復(fù),并且很多機(jī)器從同一日志塊中讀取,則可能導(dǎo)致I/O的極大浪費(fèi)。共享日志的恢復(fù)機(jī)制如下:當(dāng)一個(gè)機(jī)器不工作時(shí),主機(jī)重新分布它的日志塊到其他機(jī)器去處理,這些機(jī)器在本地存儲(chǔ)處理的結(jié)果。想獲得數(shù)據(jù)片的機(jī)器從主機(jī)中查詢處理結(jié)果的位置,以更新它們最近獲取的數(shù)據(jù)片,然后直接訪問這些機(jī)器獲取數(shù)據(jù)。
3.APIs
BigTable的API支持通過函數(shù)調(diào)用創(chuàng)建和刪除表、列簇,改變集群、表和列簇的元數(shù)據(jù)以及訪問控制優(yōu)先級(jí)。而且BigTable支持從單個(gè)行查詢,或在表中的數(shù)據(jù)子集上不斷迭代查詢。
例:下面的C++代碼使用RowMutation抽象執(zhí)行一系列的更新。
//Openthetable
Table*T=OpenOrDie("/bigtable/web/webtable");
//Writeanewanchoranddeleteanoldanchor
RowMutationr1(T,"edu.asu.www");
r1.Set("anchor:","ASU");
r1.Delete("anchor:");
Operationop;
Apply(&op,&r1);
調(diào)用對(duì)Webtable執(zhí)行了一個(gè)原子變化:它給添加了一個(gè)導(dǎo)航并刪除了另一個(gè)導(dǎo)航。
4.其他數(shù)據(jù)庫方法
注意,GFS和BigTable被設(shè)計(jì)為專用于基于Web的云計(jì)算,因而它們的設(shè)計(jì)不受傳統(tǒng)數(shù)據(jù)庫管理設(shè)計(jì)或文件系統(tǒng)的約束。因?yàn)镚oogle確實(shí)不存在數(shù)據(jù)庫管理或文件系統(tǒng),所以可以從頭開始一個(gè)新的設(shè)計(jì)。Cattel調(diào)查了很多其他的具有相似目標(biāo)的類似數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì),他認(rèn)為這些系統(tǒng)的特征是數(shù)據(jù)存儲(chǔ)而不是數(shù)據(jù)庫,因?yàn)檫@些系統(tǒng)不提供傳統(tǒng)數(shù)據(jù)庫系統(tǒng)管理的全部特征。這些現(xiàn)代數(shù)據(jù)存儲(chǔ)具有如下共同特征:
(1)支持調(diào)用級(jí)交互(而不是綁定到SQL語句),因而應(yīng)用可能直接控制數(shù)據(jù)庫的存儲(chǔ)。
(2)有效的索引以利于大數(shù)據(jù)量的有效處理。
(3)通過把不同行分配到不同服務(wù)器,支持可伸縮性。因此當(dāng)行數(shù)增加時(shí),用戶不會(huì)感到過度延遲。
(4)支持動(dòng)態(tài)數(shù)據(jù)模式,因而不同租戶雖然有不同的數(shù)據(jù)模式需求,但他們?nèi)匀还蚕硐嗤臄?shù)據(jù)存儲(chǔ)和模式表。
(5)索引在內(nèi)存中緩存以得到有效的訪問,這可能會(huì)在不同的節(jié)點(diǎn)中分發(fā)或復(fù)制索引。這些數(shù)據(jù)存儲(chǔ)據(jù)根以下原則存儲(chǔ)數(shù)據(jù):
(1)關(guān)鍵值存儲(chǔ):系統(tǒng)根據(jù)一個(gè)設(shè)計(jì)者定義的關(guān)鍵字存儲(chǔ)數(shù)據(jù)。
(2)文檔存儲(chǔ):系統(tǒng)存儲(chǔ)索引文檔而不是文檔中的特殊項(xiàng)被索引。
(3)可擴(kuò)展的記錄存儲(chǔ):系統(tǒng)存儲(chǔ)可擴(kuò)展的記錄,并且按不同節(jié)點(diǎn)劃分它們,這有時(shí)被稱為面向列的數(shù)據(jù)庫。
這些現(xiàn)代數(shù)據(jù)存儲(chǔ)的例子包括SimpleDB和Cassandra。
另一個(gè)方法是擴(kuò)展現(xiàn)有的數(shù)據(jù)庫管理系統(tǒng)用于Web應(yīng)用。例如RAC(OracleRealApplicationClusters)。它是一個(gè)集群數(shù)據(jù)庫,并在訪問單個(gè)數(shù)據(jù)庫時(shí)允許多個(gè)處理器運(yùn)行數(shù)據(jù)庫軟件。集群數(shù)據(jù)庫本質(zhì)上是運(yùn)行在處理器集群上的數(shù)據(jù)庫,它利用了這些便宜處理器的伸縮性和可用性。
集群數(shù)據(jù)庫可被分為兩大類:
(1)無共享:每一個(gè)參與節(jié)點(diǎn)擁有一個(gè)數(shù)據(jù)子集,每個(gè)節(jié)點(diǎn)只運(yùn)行它自己的數(shù)據(jù),但是節(jié)點(diǎn)間可相互通信交換數(shù)據(jù)。
(2)全共享:每個(gè)處理器可以訪問數(shù)據(jù)庫中的任何數(shù)據(jù)。
任何一種情況,節(jié)點(diǎn)都通過諸如infiniBand或Myrinet的高速網(wǎng)絡(luò)互聯(lián)。有高速網(wǎng)絡(luò)把集群和存儲(chǔ)器連接起來是致關(guān)重要的。最初,集群數(shù)據(jù)庫使用諸如磁盤的存儲(chǔ)設(shè)備來傳送數(shù)據(jù),當(dāng)存儲(chǔ)設(shè)備速度很慢時(shí),操作速度也會(huì)慢。在采用諸如光纖信道技術(shù)的專用通信系統(tǒng)用于系統(tǒng)和存儲(chǔ)器通信后,這個(gè)問題得到了解決。光纖信道是用于存儲(chǔ)器網(wǎng)絡(luò)的網(wǎng)絡(luò)技術(shù),它的傳送速度達(dá)Gigabit,它是SAN(存儲(chǔ)器局域網(wǎng))的通用技術(shù)。在2008年,這種技術(shù)能以5100MB/s的吞吐量傳送21.04GBaud的數(shù)據(jù)。
無共享和全共享兩種集群數(shù)據(jù)庫都需仔細(xì)地對(duì)應(yīng)用劃分以達(dá)到優(yōu)化性能的目的。無共享體系結(jié)構(gòu)的可伸縮性依賴于數(shù)據(jù)劃分。這種方法的一個(gè)問題是如果一個(gè)節(jié)點(diǎn)崩潰,數(shù)據(jù)的一部分將無法得到,因而通常數(shù)據(jù)的劃分應(yīng)保證數(shù)據(jù)實(shí)際存儲(chǔ)在后臺(tái)的多個(gè)磁盤上,如果其中一個(gè)失效,其他的磁盤可以自動(dòng)再存儲(chǔ)相應(yīng)的數(shù)據(jù)。這種無共享的集群數(shù)據(jù)庫方法被很多數(shù)據(jù)庫系統(tǒng)使用,例如IBM的DB2、Microsoft的SQLServer、MySQL的Cluster和Bizgres的MPP。
在全共享體系結(jié)構(gòu)中,物理設(shè)計(jì)通常涉及網(wǎng)絡(luò)附加存儲(chǔ)器,通過諸如光纖信道的高速互聯(lián)網(wǎng)絡(luò),所有節(jié)點(diǎn)都和諸如RAID的獨(dú)立共享磁盤通信。在這種體系結(jié)構(gòu)中,當(dāng)多個(gè)處理器同時(shí)訪問同一數(shù)據(jù)庫時(shí),它們之間會(huì)有競(jìng)爭(zhēng)。RAC是一個(gè)全共享數(shù)據(jù)庫,每個(gè)處理器有自己的緩存,有必要通過高速網(wǎng)絡(luò)協(xié)調(diào)各種并發(fā)讀寫以維護(hù)系統(tǒng)緩存的一致性。RAC有一種叫做緩存融合的機(jī)制。一般來說,數(shù)據(jù)庫系統(tǒng)將面臨如下情況:
(1)并發(fā)讀;
(2)不同節(jié)點(diǎn)的并發(fā)讀寫;
(3)不同節(jié)點(diǎn)的并發(fā)寫。
第一種情況不是問題,因?yàn)槎鄠€(gè)讀用戶能沒有任何沖突地并發(fā)讀數(shù)據(jù)。但是,處理第二和第三種情況時(shí),緩存融合維護(hù)全局控制器,全局控制器維護(hù)每個(gè)節(jié)點(diǎn)上每個(gè)緩存塊的狀態(tài)。如果存在沖突,全局控制器要求擁有數(shù)據(jù)的節(jié)點(diǎn)通過高速網(wǎng)絡(luò)傳送大量最新數(shù)據(jù)到接收節(jié)點(diǎn),而不需要通過磁盤系統(tǒng),從而維護(hù)了系統(tǒng)的一致性。當(dāng)緩存數(shù)據(jù)被替換或在檢查點(diǎn)時(shí),實(shí)際數(shù)據(jù)寫入磁盤的操作將會(huì)發(fā)生。基本上,傳統(tǒng)數(shù)據(jù)庫管理系統(tǒng)中的并發(fā)控制現(xiàn)在是在緩存級(jí)完成的,并由支持處理器到處理器和處理器到存儲(chǔ)器兩種通信的高速網(wǎng)絡(luò)支持。全局控制器通過涉及緩存管理、數(shù)據(jù)通信、并發(fā)讀寫的復(fù)雜協(xié)議維護(hù)數(shù)據(jù)的一致性。每個(gè)寫用戶仍然需要聲明一些排它性,其他寫用戶必須服從且等待它的寫操作完成,除非修改的數(shù)據(jù)是可用的,并且當(dāng)它們?cè)诓煌墓?jié)點(diǎn)上時(shí),將通過高速網(wǎng)絡(luò)從一個(gè)緩存?zhèn)魉偷搅硪粋€(gè)緩存。因?yàn)槿謹(jǐn)?shù)據(jù)控制器完成的大多數(shù)操作要么是在計(jì)算節(jié)點(diǎn)、要么是通過高速通信系統(tǒng)完成的,因而操作比傳統(tǒng)的通過磁盤參與的方法更有效率。因?yàn)椴l(fā)寫比并發(fā)讀消耗更多的時(shí)間,這種全共享方法更適合大多數(shù)是讀操作的應(yīng)用。
如果多租戶應(yīng)用有很多寫操作,數(shù)據(jù)劃分變成一個(gè)關(guān)鍵問題,因?yàn)橥蕉鄠€(gè)寫操作比同步讀操作消耗更多時(shí)間。
使用全共享方法的有:IBM的用于z/OS的DB2、IBMDB2pureScale、SybaseAdaptiveServerEnterprise、ClusterEdition。
MapReduce是一個(gè)分布式編程模型,可用于處理用廉價(jià)處理器集群搭建的云計(jì)算環(huán)境中的海量數(shù)據(jù)集(Ghemawat,2004)。這種計(jì)算模型起源于函數(shù)式程序設(shè)計(jì)語言Lisp中的map和reduce函數(shù)。但是,MapReduce的含義和操作不同于map和reduce函數(shù)的含義和操作。用戶可指定一個(gè)map函數(shù)處理一個(gè)關(guān)鍵字/值對(duì),以產(chǎn)生一個(gè)中間值,一個(gè)reduece函數(shù)合并全部的中間值以得到最終結(jié)果。這兩個(gè)函數(shù)能運(yùn)行在不同的計(jì)算機(jī)上,主機(jī)為工作節(jié)點(diǎn)分配處理任務(wù)。14.7MapReduce14.7.1MapReduce編程模型
圖14.25展示了一個(gè)MapReduce體系結(jié)構(gòu),它有一個(gè)主節(jié)點(diǎn)和多個(gè)工作節(jié)點(diǎn)。
圖14.25MapReduce體系結(jié)構(gòu)
計(jì)算分兩步完成:
(1)Map:主節(jié)點(diǎn)接收輸入(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傭金模式代理招商合同范本
- 兄弟合伙開商鋪合同范例
- 書印刷裝訂合同范例
- 公路隧道爆破施工方案
- 修建水庫合同范例
- 低端車型租賃合同范例
- 上海室內(nèi)拆除合同范例
- 蘭炭銷售合同范例
- 保理貸款合同范例
- 保健中心合同范例
- 產(chǎn)時(shí)會(huì)陰消毒課件
- 第一單元 我們的守護(hù)者 (同步練習(xí))部編版道德與法治六年級(jí)上冊(cè)
- 2025年高考時(shí)事政治考點(diǎn)總結(jié)
- 2025年山西省運(yùn)城市平陸縣部分學(xué)校中考一模道德與法治試題(原卷版+解析版)
- 縣國有企業(yè)改革轉(zhuǎn)型方案
- 小學(xué)生數(shù)據(jù)分析課件
- 高中家長會(huì) 高考考前家長會(huì)家長心理調(diào)整課件
- 2025年皖北衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫附答案
- 住宅老舊電梯更新改造方案
- 2025年山東國電投萊陽核能有限公司校園招聘筆試參考題庫附帶答案詳解
- 江蘇省中小學(xué)生金鑰匙科技競(jìng)賽(初中組)考試題及答案
評(píng)論
0/150
提交評(píng)論