《面向服務(wù)的計算和web數(shù)據(jù)管理》課件第14章_第1頁
《面向服務(wù)的計算和web數(shù)據(jù)管理》課件第14章_第2頁
《面向服務(wù)的計算和web數(shù)據(jù)管理》課件第14章_第3頁
《面向服務(wù)的計算和web數(shù)據(jù)管理》課件第14章_第4頁
《面向服務(wù)的計算和web數(shù)據(jù)管理》課件第14章_第5頁
已閱讀5頁,還剩315頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第14章云計算和軟件即服務(wù)14.1引言

14.2SaaS的成熟度模型

14.3多租戶SaaS的數(shù)據(jù)庫設(shè)計

14.4GoogleApp引擎

14.5Google文件系統(tǒng)

14.6BigTable14.7MapReduce14.8Hadoop48014.9微軟的Azure14.10S14.11優(yōu)先級和調(diào)度

14.12云計算算法

14.13數(shù)據(jù)區(qū)分器的應(yīng)用

14.14討論

近來,云計算受到了極大的關(guān)注,因為它提供了一種新的計算基礎(chǔ)設(shè)施,能夠以動態(tài)的、可伸縮的、虛擬化的方式快速地把計算資源作為一種實用工具交付。與傳統(tǒng)的基于桌面的計算相比,云計算的優(yōu)勢包括靈活性、低成本、設(shè)備獨立、位置獨立以及可伸縮性(Aulbach,2009)。最近,IT巨頭如Google,Amazon,Microsoft和IBM都開始了他們的云計算項目。云計算和軟件即服務(wù)云計算為客戶提供了一種大規(guī)模的服務(wù)交付,并且允許客戶以“即用即付”的方式靈活支付而不需要擁有IT基礎(chǔ)設(shè)施或應(yīng)用軟件。這里,客戶可以是應(yīng)用軟件或應(yīng)用軟件的終端用戶,因此SaaS中的服務(wù)指的是軟件模塊以及終端用戶可用的應(yīng)用。

云計算通常有幾個關(guān)鍵組成部分,包括:

(1)頂層:該層托管用戶在應(yīng)用中使用的軟件即服務(wù)(SaaS)。

(2)第2層:該層提供了平臺即服務(wù)(PaaS)。

(3)第3層:該層提供了基本的支撐,即基礎(chǔ)設(shè)施即服務(wù)(IaaS)。

(4)第4層:這是最底層,提供了數(shù)據(jù)中心。14.1引言目前大多數(shù)云計算建立在現(xiàn)代數(shù)據(jù)中心上面,它把IaaS、PaaS和SaaS集成在一起,并以公用工具的方式提供這些服務(wù),這樣可按客戶的使用情況進行計費。圖14.1顯示了云計算的層次化視圖。

1.數(shù)據(jù)中心

該層提供了云運行的硬件環(huán)境。數(shù)據(jù)中心通常建立在能量利用較低、自然災(zāi)害可能性小、人口稀疏的區(qū)域。現(xiàn)代數(shù)據(jù)中心通常由數(shù)千臺具有大容量磁盤存儲和高速緩存的服務(wù)器組成,這些服務(wù)器通過高速網(wǎng)絡(luò)連接。

2.基礎(chǔ)設(shè)施即服務(wù)

IaaS建立在數(shù)據(jù)中心層之上,IaaS層虛擬化了計算能力、存儲和數(shù)據(jù)中心的網(wǎng)絡(luò)連接,并作為規(guī)定服務(wù)提供給客戶。用戶可以按需增加或減少他們的計算資源。IaaS比較典型的應(yīng)用是,多租戶共享相同的基礎(chǔ)設(shè)施資源。IaaS層的例子如Amazon的EC2,Microsoft的Azure平臺。

圖14.1云計算的層次化視圖3.平臺即服務(wù)

平臺即服務(wù)(PaaS)通常被稱為cloudware。PaaS提供了一個集成了許多服務(wù)的開發(fā)平臺來輔助應(yīng)用的設(shè)計、開發(fā)、測試、部署、監(jiān)控和云托管,并支持地理上分散的團隊在項目中協(xié)同工作。它通常不需要下載或安裝軟件。Google的AppEngine,Microsoft的Azure,Amazon的MapReduce/SimpleStorageService都是PaaS層的例子。

4.軟件即服務(wù)

SaaS按需把應(yīng)用軟件作為服務(wù)提供給終端用戶,通常以瀏覽器的方式提供。它免去了用戶部署和維護軟件的麻煩。來自于云的軟件是自動更新的,并且不需要購買額外的許可證。產(chǎn)品特征按需請求,并且頻繁使用。SaaS應(yīng)用通常是面向服務(wù)的程序,它可以很容易地和其他mashup應(yīng)用集成。GoogleMap是SaaS的一個例子,它可以參與Web上的多種mashup應(yīng)用。S和Zoho的生產(chǎn)及協(xié)作套件也是SaaS的例子。

這四層并沒有明顯的分界線。一層的組件和特征也可以認為是另一層的。例如,數(shù)據(jù)存儲服務(wù)可以是IaaS層或PaaS層的。

在云環(huán)境中,每樣?xùn)|西都可以看做并被實現(xiàn)為服務(wù)。SaaS運行在云環(huán)境的頂層,它把基于Web的服務(wù)交付給客戶,并把IT應(yīng)用的功能、部署、維護的職責(zé)轉(zhuǎn)移給服務(wù)提供商??蛻綦m然沒有擁有軟件但是要支付軟件在Web上提供的服務(wù)。通常用戶通過API訪問Web上的服務(wù)。

PaaS運行在云環(huán)境的中間層,它通過使用IaaS提供的計算、通信和存儲資源為SaaS的執(zhí)行提供計算環(huán)境。這些功能傳統(tǒng)上是由操作系統(tǒng)提供的,但是,和傳統(tǒng)的計算系統(tǒng)相比較,PaaS有更多的資源,并需要實時處理數(shù)以百萬計的用戶。PaaS使用的一個通用技術(shù)就是虛擬化,并且它為終端用戶或SaaS提供了許多虛擬系統(tǒng)。在一個典型的云環(huán)境中,IaaS可能有數(shù)千個甚至上萬個擁有巨大存儲容量的處理器。

注意,SaaS應(yīng)用也可以看做是傳統(tǒng)的服務(wù),因為二者都是基于面向服務(wù)的計算并使用相同的面向服務(wù)技術(shù),例如發(fā)布、檢索、發(fā)現(xiàn)、本體、組合以及執(zhí)行策略。然而,在以下幾個方面,SaaS應(yīng)用確實不同于服務(wù)應(yīng)用:

(1)服務(wù)應(yīng)用可以放置在本地計算機(如筆記本或臺式機),或成為服務(wù)器支持的Web服務(wù);相反地,SaaS應(yīng)用必須是Web應(yīng)用,并且必須運行在有巨大計算能力和存儲資源的服務(wù)器之上。

(2)用戶可以共享服務(wù)應(yīng)用,但是每個用戶看到的是具有相同功能的相同服務(wù);相反地,用戶共享SaaS應(yīng)用時,每個用戶可能看到具有不同用戶界面和功能的相同SaaS應(yīng)用。例如,用戶可以定制用戶界面并要求特定的項作為優(yōu)先項顯示。Gmail是一個典型的SaaS應(yīng)用,用戶可以指定用戶界面并要求特殊的特征。在服務(wù)應(yīng)用中一般不具有這一特性。這是SaaS的可配置性。

(3)SaaS應(yīng)用通常使用多租戶體系結(jié)構(gòu),相同的軟件可以服務(wù)于具有不同特征的多個用戶。然而,一個典型的服務(wù)應(yīng)用沒有多租戶體系結(jié)構(gòu)。14.2節(jié)將介紹多租戶體系結(jié)構(gòu)。

本章將涉及SaaS的基本特征和它們的實現(xiàn)策略。

SOA和云計算是相聯(lián)系的,具體地說,SOA是一個體系結(jié)構(gòu)模式,是用來指導(dǎo)創(chuàng)建、組織及重用計算組件的業(yè)務(wù)解決方案;而云計算是一組技術(shù),為企業(yè)提供更大的、更靈活的平臺來構(gòu)建他們的SOA解決方案。換句話說,SOA和云計算是共存的、互補的和相互支持的。注意,SaaS應(yīng)用的參與者至少包括下面的人員:

(1)終端用戶:他們使用提供的服務(wù)并支付相應(yīng)的費用。他們可以組成COI(興趣社團)來分享他們的服務(wù)和經(jīng)驗。

(2)業(yè)務(wù)提供者:業(yè)務(wù)提供者影響、部署并支持服務(wù)的客戶使用。

(3)服務(wù)提供者:服務(wù)提供者為用戶創(chuàng)建、遷移和組合服務(wù)。注意,服務(wù)提供者不必提供服務(wù)運行的平臺;他們可以使用公有云、私有云或混合云環(huán)境運行他們的軟件。

(4)平臺運營商:他們?yōu)榉?wù)從創(chuàng)建、部署、運營到退出的整個生命周期的管理提供了一個平臺。公有云指的是每個人都可以訪問。私有云指的是僅允許指定機構(gòu)中的人員訪問?;旌显浦傅氖遣糠仲Y源可以公開使用,但是其他資源只允許指定人員使用。

一般來說,云計算有以下特征:

(1)面向服務(wù)計算:大多數(shù)云環(huán)境支持面向服務(wù)計算和SaaS。因此,云環(huán)境通常支持發(fā)布、發(fā)現(xiàn)及服務(wù)組合,這些服務(wù)包括應(yīng)用服務(wù)和支持服務(wù),例如信息服務(wù)、存儲服務(wù)和通信服務(wù)。

(2)基于Web的運營:人們使用Web上提供的軟件,當(dāng)SaaS運行在PaaS和IaaS上時,這些軟件通常是可用的。這一特征提供了設(shè)備和位置的獨立性。

(3)動態(tài)供應(yīng)的可伸縮性計算:典型的云環(huán)境將自動提供充足的資源完成一個任務(wù)請求。這可能涉及工作負載的自動監(jiān)控、資源的自動分配、負載均衡、智能調(diào)度以及群集處理器上的并行處理。

(4)自動配置和定制的多租戶體系結(jié)構(gòu):多個客戶可以共享相同的軟件,而不是每個客戶使用一個單獨的軟件。這樣,可以削減開發(fā)軟件的成本,因為只需要開發(fā)一個軟件版本。但是,每個客戶仍然認為軟件是定制的。

(5)可靠性和可用性:云環(huán)境通常有冗余資源,因此,如果系統(tǒng)的某些部分失效,系統(tǒng)其余部分可以自動從故障中恢復(fù)。此外,這一工作的完成不需要用戶的知識,因為恢復(fù)工作由系統(tǒng)自動完成。

(6)隔離和策略實施的安全性:因為云環(huán)境通常提供了分散資源的集中管理,所以數(shù)據(jù)安全很重要。此外,在多租戶體系結(jié)構(gòu)中,彼此不認識的不同用戶共享軟件和數(shù)據(jù)庫,用戶要求較高的安全保證。為了確保系統(tǒng)的安全性,在運行期間強制實施多種安全策略。

(7)自動的系統(tǒng)維護和升級:云環(huán)境經(jīng)常自動地維護它的資源,包括軟件和計算機的升級??梢酝ㄟ^服務(wù)更新、軟件配置和數(shù)據(jù)庫設(shè)計進行軟件升級;系統(tǒng)升級包括系統(tǒng)管理和硬件更換。此外,這些升級可能與用戶使用各種云服務(wù)同時執(zhí)行。

微軟已經(jīng)提出了如下的SaaS成熟度等級(Carraro,2006),其中每個等級在前一等級的基礎(chǔ)上添加了新的特征。

1.等級1——隨機的/定制的

這是最簡單的等級,它類似于傳統(tǒng)的應(yīng)用服務(wù)提供者(ASP)模型。14.2SaaS的成熟度模型在這一級,每個客戶有他自己定制的應(yīng)用版本并在服務(wù)器上運行自己的應(yīng)用實例。租戶之間不存在共享并且軟件的每個實例需要單獨開發(fā)。通過把軟件移到集中的服務(wù)器上為客戶提供服務(wù),現(xiàn)有的許多軟件程序都將滿足這一等級。圖14.2說明了這一點。

圖14.2隨機的/定制體系結(jié)構(gòu)2.等級2——可配置

該等級為軟件增加了靈活性。每個客戶有自己定制的軟件版本;但是,在這一級上,客戶通過選擇同一軟件提供的各種配置選項指定配置選擇。在前一等級,每個軟件版本是為客戶獨立開發(fā)的,但是在這一級,只需開發(fā)一個有許多配置選項的軟件程序,讓客戶自己選擇。與前一級相比,這一級的軟件更成熟、更復(fù)雜,但是只需開發(fā)一個版本。由于開發(fā)者不需要為滿足每個用戶的需要而開發(fā)成百上千個版本,因此,這一級軟件的管理和維護較容易。一般而言,定制化服務(wù)可是輕量級或重量級的:

(1)輕量級的變體:這些服務(wù)有不同的選項或特征,并且相同的服務(wù)使用不同的策略和/或SLA(服務(wù)等級協(xié)議)提供給不同的客戶。例如,具有高級功能,如大容量存儲、較好的用戶界面、允許24小時訪問的優(yōu)質(zhì)服務(wù);具有標(biāo)準(zhǔn)特征,如有限的存儲、普通的用戶界面、只在特定時間內(nèi)訪問的常規(guī)服務(wù)。可配置的體系結(jié)構(gòu)如圖14.3所示。

圖14.3可配置體系結(jié)構(gòu)(2)重量級的變體:這些服務(wù)提供了不同的業(yè)務(wù)過程,包括行業(yè)相關(guān)需求、不同的基礎(chǔ)設(shè)施以及通信需求。這些服務(wù)可能有相似的名字,但是如果你測試這些服務(wù),它們是明顯不同的。

3.等級3——可配置、高性能的多租戶

這一級在前一級基礎(chǔ)上添加了多租戶體系結(jié)構(gòu),如圖14.4所示。在這一級,所有客戶將運行相同的軟件版本;然而每個客戶可以看到同一軟件的不同配置。注意在前一級,每個客戶看到的是一個定制的版本并單獨地運行此版本,但是,在這一級,盡管每個客戶看到的是一個定制的版本,但實際上每個客戶與成千上萬個其他客戶共享同一個軟件。很容易看到,這一級的SaaS軟件比前一級的SaaS軟件更加復(fù)雜。在前一級,盡管軟件由客戶定制,因為每個客戶只能使用一個副本,因此它不需要處理運行時管理。但是這一級的SaaS軟件需要解決這些新問題。SaaS軟件需要追蹤每個客戶的單獨配置、維護他們的數(shù)據(jù)庫、在運行期間提供定制的服務(wù)。事實上,你可以認為這一級的SaaS軟件后面有一個微型操作系統(tǒng),它可以運行數(shù)據(jù)庫,并在運行期間為成百上千個客戶劃分工作區(qū)。

圖14.4可配置、高性能的多租戶體系結(jié)構(gòu)4.等級4——可伸縮、可配置、高性能的多租戶

SaaS的這一級在前一級的基礎(chǔ)上添加了可伸縮性,如圖14.5所示。前一級SaaS軟件的問題是不能伸縮。因為每個SaaS軟件需要追蹤成千上萬個客戶并提供實時服務(wù),軟件負載過于沉重。解決這個問題的一個方法是讓等級3的同一SaaS軟件有多個副本,并且在運行時每個都可以被調(diào)用以提供服務(wù)??蛻舨慌cSaaS直接交互,但是首先和一個負載均衡器交互,負載均衡器將每個請求分配到一個合適的軟件副本上執(zhí)行。負載均衡器不斷地監(jiān)控每個軟件副本的工作量,并把客戶的新請求分配到合適的軟件副本上執(zhí)行。如果工作量增大,運行在后臺的副本數(shù)量增加;如果工作量減小,副本數(shù)量減少。這樣,在服務(wù)器上維持合適的副本數(shù)量以提供最佳的性能。這一級的云環(huán)境比前一級的云環(huán)境更加復(fù)雜,因為在運行時負載均衡器要和多個SaaS副本交互。但這一級的云環(huán)境比前一級的云環(huán)境提供了更好的服務(wù),因為它可以根據(jù)環(huán)境的變化調(diào)整資源。

圖14.5可伸縮、可配置、有效的多租戶體系結(jié)構(gòu)不管是否有多租戶體系結(jié)構(gòu),SaaS軟件都可運行在VM(虛擬機)上。VM是實際機器或系統(tǒng)的隔離副本,多個VM可以運行在同一物理系統(tǒng)上。一個VM可以和一個OS一樣大,例如,一個物理機可以運行多個OS平臺為不同的客戶服務(wù)。VM的概念并不新穎,因為它已經(jīng)出現(xiàn)了至少40年。在那時,計算機非常昂貴,為了節(jié)省費用,多個OS平臺運行在一個物理機上。

盡管40年以后計算機便宜了,但是VM的概念仍然被大量地應(yīng)用,尤其在云計算中。因為在云計算中,應(yīng)用和數(shù)據(jù)比物理機更貴重,但是許多應(yīng)用只運行在某一平臺上,所以為了運行這些應(yīng)用就需要很多VM。注意,在云計算中,多租戶體系結(jié)構(gòu)和VM是互補的。虛擬化允許提供不同的平臺而不需要大量額外的編程,但是,多租戶為軟件設(shè)計和編程提供了可伸縮性,因為只需要開發(fā)一個軟件版本而不是獨立開發(fā)多個軟件版本。完全可以把VM和多租戶體系結(jié)構(gòu)結(jié)合起來實現(xiàn)可伸縮性和靈活性:VM為建立程序的執(zhí)行平臺提供了一種方便的方式,多租戶體系結(jié)構(gòu)用于軟件的共享。

每個SaaS應(yīng)用都有一個前臺和后臺。前臺為SaaS用戶定制需求提供條件,而后臺使用一種低成本、一致的和可伸縮的方法支持客戶。為了達到這個目標(biāo),多租戶成為SaaS的一個重要特征。在多租戶體系結(jié)構(gòu)中,SaaS軟件的一個單一實例支持多個客戶。以這種方式,服務(wù)提供者可以同時支持多個租戶,而從客戶的角度看,租戶是隔離的并按照他們的需求定制。14.3多租戶SaaS的數(shù)據(jù)庫設(shè)計多租戶體系結(jié)構(gòu)不同于多實例體系結(jié)構(gòu)。在多租戶體系結(jié)構(gòu)中,運行在服務(wù)器上的一個軟件實例為多個客戶或租戶服務(wù);在多實例體系結(jié)構(gòu)中,有多個(不同的)軟件副本為它們的客戶服務(wù)。多租戶體系結(jié)構(gòu)需要在內(nèi)部對數(shù)據(jù)進行分區(qū),并且需要追蹤不同客戶的不同配置。

據(jù)報道,目前的多實例體系結(jié)構(gòu)可以支持幾十個租戶,而多租戶體系結(jié)構(gòu)可以支持更大數(shù)量的租戶。但是,這要付出代價的,因為伸縮性增加,隔離級別降低。換句話說,潛在地,多租戶體系結(jié)構(gòu)需要阻止一個租戶的QoS受到其他租戶的影響,因為他們共享軟件以及數(shù)據(jù)庫。注意:等級1和等級2的SaaS主要使用多實例體系結(jié)構(gòu),本節(jié)主要關(guān)注等級3和等級4的SaaS應(yīng)用。

多租戶體系結(jié)構(gòu)需要解決以下問題。

1.資源隔離

因為所有租戶共享同一個基礎(chǔ)設(shè)施和軟件,所以SaaS應(yīng)用以一種公平的方式為租戶隔離資源就很重要。每個租戶當(dāng)然希望能夠訪問所有需要的資源以獲得最好的服務(wù)性能,但是,在資源有限的情況下,這對于租戶來說是不現(xiàn)實的。因此,系統(tǒng)需要指定租戶的優(yōu)先權(quán),并為不同的客戶提供有差別的服務(wù)。一個簡單的方法是分配資源,例如,如果用戶請求是規(guī)律的或經(jīng)常的,就為SaaS應(yīng)用靜態(tài)分配CPU和存儲器。但是,在一個云環(huán)境中,這是不可能的,因此需要一種動態(tài)分配模式。一個租戶可以指定他的資源需求,如將來的使用模式,以便SaaS應(yīng)用相應(yīng)地調(diào)度資源。

2.定制

SaaS應(yīng)用通常允許租戶定制他們的服務(wù),包括QoS需求。例如,GoogleDoc允許不同的用戶指定不同的特征,包括軟件的外觀,可能在以后,也可以允許每個用戶指定SLA(服務(wù)等級協(xié)議)需求。注意:在多租戶體系結(jié)構(gòu)中,每個用戶使用軟件的同一實例,因此任何定制信息需要存儲在數(shù)據(jù)庫中。為了提供定制服務(wù),需要在運行時檢索這些信息并使用。這增加了SaaS的靈活性,但是處理速度下降,因為在運行時需要額外的計算,還增加了數(shù)據(jù)庫的復(fù)雜性,這是因為除了要存儲各種數(shù)據(jù),還要存儲個人定制信息。

3.安全性

在多租戶設(shè)計中,租戶共享軟件代碼和數(shù)據(jù),這導(dǎo)致了嚴重的安全風(fēng)險問題:一個租戶意外地或故意地訪問另一個租戶的數(shù)據(jù)。事實上,安全問題是云計算和SaaS的重要的問題之一。

4.可伸縮性

從成熟度1級到3級,伸縮性的考慮是軟件設(shè)計和編碼的問題。3級SaaS允許所有租戶使用同一軟件,因此明顯地節(jié)省了軟件設(shè)計和實現(xiàn)的工作量。但是,如果基礎(chǔ)設(shè)施沒有同一軟件的多個副本,而這個軟件是為提供服務(wù)而動態(tài)創(chuàng)建的,3級SaaS應(yīng)用的可伸縮性就是有限的。

圖14.6是一個簡單的體系結(jié)構(gòu)框架,用來幫助解決上面提到的多租戶體系結(jié)構(gòu)的挑戰(zhàn),顯然它在創(chuàng)建和運行時都可以支持多租戶。租戶使用相同的應(yīng)用實例而不會導(dǎo)致性能、系統(tǒng)安全性、隔離和可配置性的顯著降低。

圖14.6多租戶實現(xiàn)框架在框架中有兩種類型的開發(fā)者/用戶:

(1)面向應(yīng)用的開發(fā)者(在頂層):他們負責(zé)開發(fā)或定制UI(用戶界面)的內(nèi)容、業(yè)務(wù)流程和服務(wù),不需要了解多租戶體系結(jié)構(gòu)。

(2)面向基礎(chǔ)設(shè)施的開發(fā)者(在底層):他們負責(zé)以最低成本確保應(yīng)用的有效性和可靠性。

多租戶層是框架的核心,它隔離了應(yīng)用和支持系統(tǒng)資源。租戶可以獲得多租戶的益處而不用擔(dān)心實現(xiàn)多租戶體系結(jié)構(gòu)的復(fù)雜性。14.3.1資源隔離模式

在多租戶體系結(jié)構(gòu)中,資源隔離是很重要的,其解決方案可以從完全隔離的設(shè)計到完全共享的設(shè)計。

1.獨立數(shù)據(jù)庫(SD)

這一模式中,每個租戶有自己的數(shù)據(jù)庫,與其他數(shù)據(jù)庫相分離,這是一種完全隔離的解決方案,如圖14.7所示。注意,盡管數(shù)據(jù)是隔離的,但是計算資源如CPU、存儲設(shè)備、應(yīng)用代碼仍由租戶共享。因為每個數(shù)據(jù)庫與其他數(shù)據(jù)庫相分離,所以每個客戶的數(shù)據(jù)模型就相對容易擴展,這和傳統(tǒng)的系統(tǒng)一樣,并使用傳統(tǒng)技術(shù)從故障中恢復(fù)。這個解決方案簡單但是昂貴,因為獨立數(shù)據(jù)庫需要維護備份。如果一個SaaS應(yīng)用有許多租戶,每個租戶需要一個獨立的數(shù)據(jù)庫,數(shù)據(jù)庫的數(shù)量將會很龐大,并且這大大地增加了云基礎(chǔ)設(shè)施的費用和開銷。因此,這種方法的可伸縮性是有限的。

圖14.7隔離的數(shù)據(jù)庫2.共享數(shù)據(jù)庫但隔離的模式(SDSS)

這一模式中,多個租戶在同一數(shù)據(jù)庫中存儲各自的數(shù)據(jù)表,如圖14.8所示,但是每個租戶有他自己的數(shù)據(jù)庫模式和數(shù)據(jù)表。當(dāng)新租戶出現(xiàn)時,系統(tǒng)使用傳統(tǒng)的SQL語句為他創(chuàng)建一組離散的表和模式。這一模式容易實現(xiàn),容易擴展。如果一個租戶想要改變他的數(shù)據(jù)模型,其他的租戶將不會受到影響,因為他們有獨立的表和模式。

圖14.8共享數(shù)據(jù)庫和隔離模式3.共享數(shù)據(jù)庫和共享模式(SDSHS)

這一模式中,多個客戶共享同一數(shù)據(jù)庫并在同一表集合中共享數(shù)據(jù),如圖14.9所示。這是一種靈活的方法,因為只有唯一的一組模式為所有的租戶服務(wù),并且系統(tǒng)只維護一個數(shù)據(jù)庫。雖然這種方法對數(shù)據(jù)庫的設(shè)計和維護很方便,但是一個系統(tǒng)缺陷可能損壞整個數(shù)據(jù)庫,或把數(shù)據(jù)呈現(xiàn)給不同的租戶。考慮一個由多租戶共享的抵押貸款的數(shù)據(jù)庫,租戶ID是代表每個租戶的主鍵并把它作為關(guān)聯(lián)其他表的外鍵。因為它允許同一個數(shù)據(jù)庫服務(wù)為大量的租戶服務(wù),所以在這種模式下,硬件和備份費用較低。然而,考慮到安全性問題,這種方法將是最復(fù)雜的。這種模式也很難從故障中恢復(fù),因為整個數(shù)據(jù)庫要恢復(fù)到以前的狀態(tài),而不僅僅是故障部分,但是系統(tǒng)不能精確地知道數(shù)據(jù)表的哪一部分出現(xiàn)故障。

圖14.9共享數(shù)據(jù)庫和共享模式從數(shù)據(jù)庫角度看,多租戶數(shù)據(jù)庫系統(tǒng)提供的模式需要具有下面的靈活性:

(1)可以通過擴展基本模式來支持應(yīng)用的多個專用版本;

(2)基本模式可以動態(tài)地變更和演化,并且擴展在數(shù)據(jù)庫在線時完成。換句話說,完成擴展不影響服務(wù)提供者維護數(shù)據(jù)庫。

把應(yīng)用中的多個單一租戶的邏輯模式映射到數(shù)據(jù)庫中的一個多租戶的物理模式不是很容易,因為企業(yè)應(yīng)用通常允許每個租戶擴展他的基本模式。如IBM文檔討論的,為SaaS應(yīng)用設(shè)計靈活的模式有7種可用技術(shù),可進一步把它們分為兩類:

(1)數(shù)據(jù)庫“擁有”模式(用DDL或數(shù)據(jù)定義語言明確定義);

(2)應(yīng)用“擁有”模式(映射到數(shù)據(jù)庫中的通用結(jié)構(gòu))。

本節(jié)用一個例子來說明這些技術(shù)。一個SaaS應(yīng)用有3個租戶,每個租戶都有一個包含AccountID(Aid)和Name字段的賬戶表。租戶1屬于賓館行業(yè),用Hotel和Rooms兩個字段擴展賬戶表。租戶3屬于抵押行業(yè),用Borkers字段擴展賬戶表。租戶使用租戶ID列(租戶)共享表。分類1:數(shù)據(jù)庫擁有模式。

用戶視圖:數(shù)據(jù)庫視圖用于共享數(shù)據(jù)庫表,它只包含特定租戶的數(shù)據(jù)。當(dāng)出現(xiàn)一個新租戶時,可以為其創(chuàng)建一個新的視圖。

私有表:每個租戶有自己的基本表的私有實例,可以根據(jù)需要擴展,如圖14.10所示。而在所有其他的映像中,租戶共享表。

圖14.10私有表擴展表:擴展表是指將表垂直分割成單獨的表,它們根據(jù)一個ID列連接到基礎(chǔ)表,如圖14.11所示。圖14.11擴展表稀疏列:每個租戶的每個擴展字段作為稀疏列添加到與它關(guān)聯(lián)的基本表。如圖14.12所示。圖14.12稀疏列

一般而言,數(shù)據(jù)庫“擁有”模式技術(shù)表現(xiàn)良好,但是對現(xiàn)有的數(shù)據(jù)模式的演化提供的支持有限,而且在某一級別上不能伸縮。

分類2:應(yīng)用擁有模式。

XML:每個基本表通過列擴展,列中存儲了XML文檔中租戶的所有擴展字段。這些文檔會因租戶而變化,因此它們是無類型的,如圖14.13所示。

圖14.13XML圖14.14數(shù)據(jù)透視表“應(yīng)用”擁有模式中,應(yīng)用可以完全控制模式演化,但是在性能方面,可能受到很大影響。具體來講,對于基于XML的解決方案,必須解析XML文檔,然后重新組織行以處理那些擴展字段。性能的下降與擴展字段的數(shù)量成正比。對于基于透視表的解決方案,由于處理大型表的復(fù)雜性,使性能下降不止一個數(shù)量級。14.3.2安全性

安全機制是指防止一個租戶獲取訪問其他租戶數(shù)據(jù)的權(quán)限,目標(biāo)是使多租戶應(yīng)用有一個與傳統(tǒng)應(yīng)用軟件類似的安全保證。一般來說,實現(xiàn)數(shù)據(jù)安全有兩種方法。

1.應(yīng)用級別的過濾方法

對于SD或SDSS方法,可以使用數(shù)據(jù)庫名或模式名控制相應(yīng)租戶的訪問。對于SDSHS方法,過濾是通過每個表中的tenantID列訪問與之關(guān)聯(lián)的相應(yīng)租戶的記錄來實現(xiàn)的。它容易實現(xiàn),但為惡意訪問留下了機會。例如,一個黑客可以使用‘tenantID=XXXor1==1’訪問所有租戶的數(shù)據(jù)。SQL語句如下面所示:SELECT*

FROMTENANTS_TABLE

WHEREtenantID=2or1==1

2.DBMS級別的許可方法

這種方法為每個租戶分配一個專用的DB訪問賬號并且每個租戶只有訪問自己數(shù)據(jù)的權(quán)限,例如SD和SDSS方法。對于SDSHS,需要平衡DBMS提供的行級訪問機制,也就是LBAC(基于標(biāo)號的訪問控制)。例如,假設(shè)一個租戶在一個應(yīng)用表中對自己的數(shù)據(jù)有SELECT權(quán)限,當(dāng)這個租戶執(zhí)行一個SELECT語句時,LabelSecurity評估選定的每一行并根據(jù)安全管理員分配給租戶的權(quán)限和訪問標(biāo)號來決定是否能夠訪問它。類似的,LabelSecurity可以對UPDATE、DELETE和INSERT語句進行安全檢查。通過這種方法,可以防止?jié)撛诘腟QL注入攻擊。圖14.15顯示了LBAC的實體關(guān)系(ER)圖。三種類型的安全標(biāo)號授權(quán)給三種類型的數(shù)據(jù)庫對象,分別包括行、列和用戶。此外,一個安全標(biāo)號可以由幾個安全標(biāo)號組成。DB2V9是一個例子,它提供了這種支持,并使用DB2S

ecurityLabel保存安全標(biāo)號和為表提供安全策略。

圖14.15LBAC的實體關(guān)系圖可以使用一個預(yù)定義的LBAC規(guī)則集和安全標(biāo)號進行比較。當(dāng)比較兩個安全表的值時,規(guī)則集中的一個或多個規(guī)則用于判定一個是否阻塞另一個。例如,在DB2V9中,有一個叫做DB2LBACRULES的單一規(guī)則集,它有16個預(yù)創(chuàng)建的安全標(biāo)號組件。圖14.16中,為了共享CUSTOMER_ORDER表,產(chǎn)生了一個稱為“SecurityPolicy_Customer”的安全策略,它含有一組安全標(biāo)號。在CUSTOMER_ORDER表中,使用DB2S

ecurityLabel列把每個租戶和他的數(shù)據(jù)關(guān)聯(lián)起來。每個安全標(biāo)號包括一個從16個標(biāo)號組件中選出的元素。

圖14.16CUSTOMER_ORDER表的安全標(biāo)號的實例當(dāng)出現(xiàn)一個新租戶時,操作員可以簡單地選擇一個未使用的標(biāo)號,并使用如下所示的SQL語句把它授權(quán)給該租戶:

GRANTSECUTIRYLABELSecurityPolicy_Customer.0001toUSERTenantXforallaccess

LBAC的優(yōu)勢是它可以控制DBMS級別的跨租戶數(shù)據(jù)的訪問,而不是應(yīng)用級別的。但是,它也有局限性,例如在DB2中,至多支持16個安全標(biāo)號和64個元素,因此租戶的最大數(shù)量是1024(16×64)。對于云計算,這個數(shù)量可能太小了。14.3.3可伸縮性

可伸縮性是多租戶的一個重要特征。隨著工作量的增大,為了保持系統(tǒng)的性能,需要的資源與工作量成比例增大??缮炜s性有兩種:

(1)向上伸縮或垂直伸縮:通過添加額外資源完成,例如在一個集群系統(tǒng)中,給一個節(jié)點添加CPU、內(nèi)存以及磁盤。這樣,由于擁有更多的資源,節(jié)點功能就更強大;

(2)向外伸縮或水平伸縮:通過給一個已有的集群系統(tǒng)添加額外的節(jié)點(處理器)完成。例如,一個集群系統(tǒng)原有30個節(jié)點,現(xiàn)在可以擁有50個節(jié)點。垂直伸縮容易使用,但是由于資源管理的開銷,不能提供線性遞增伸縮。水平伸縮提供了一個性價比更好的方法,它可以通過為廉價的硬件設(shè)施添加更多的資源來遞增地擴展系統(tǒng)。此外,由于冗余,它可以提高系統(tǒng)的可靠性和可用性。

1.數(shù)據(jù)庫分區(qū)

在垂直伸縮中,可以在同一物理機上創(chuàng)建多個數(shù)據(jù)庫分區(qū);而在水平伸縮中,可以在多個物理機上創(chuàng)建分區(qū),并且每個分區(qū)有自己的內(nèi)存、CPU和存儲設(shè)備。數(shù)據(jù)庫中的數(shù)據(jù)可以分布到幾個分區(qū)中。分布碼是一列用來判定數(shù)據(jù)存儲在哪一行的分區(qū)。

數(shù)據(jù)庫分區(qū)有兩種方法:基于應(yīng)用的分布碼和基于租戶的分布碼。

(1)基于應(yīng)用的分布碼。這是數(shù)據(jù)庫分區(qū)的傳統(tǒng)方法,它根據(jù)領(lǐng)域知識,通過選擇一個或多個屬性作為分布碼來進行分區(qū)。例如,“REGION”可以用做一個分布碼。但是,這種方法需要一個合適的分布碼來平衡多個分區(qū)的負載,并且需要數(shù)據(jù)剖面信息??紤]到多租戶體系結(jié)構(gòu),這種解決方案需要更新,并解決相關(guān)的隔離問題。

(2)基于租戶的分布碼。這種方法把每個租戶的數(shù)據(jù)存儲在一個單一的分區(qū)中。它可以使用TenantID作為分布碼。使用這種方法,通過設(shè)定或變更TenantID,可把租戶自由地映射到任一指定分區(qū)。作為一種租戶感知方法,它提供了比前一種方法更好的隔離性和可用性。此外,它可以通過開發(fā)負載均衡算法確保大多數(shù)分區(qū)有相同的負載。

2.表分區(qū)

表分區(qū)提供了一種創(chuàng)建表的方法,表中數(shù)據(jù)的范圍分別存儲。這種分區(qū)的優(yōu)勢是提高了查詢性能并使表的改變更方便。例如,可以使用ALTERTABLE語句修改一個表。這要求用戶對表的存儲信息有清晰的了解,因此,它只適用于高級用戶。

GAE(GoogleApp引擎)是一種在Google管理數(shù)據(jù)中心開發(fā)和托管Web應(yīng)用的平臺。它提供了似乎無限計算資源,并虛擬化跨多個服務(wù)器和數(shù)據(jù)中心的應(yīng)用。GAE的基礎(chǔ)設(shè)施使托管的Web應(yīng)用容易伸縮,并使開發(fā)者從硬件配置和許多其他繁瑣的系統(tǒng)管理任務(wù)中解脫出來。GAE處理程序把代碼部署到一個集群上,并在必要時執(zhí)行監(jiān)控、故障恢復(fù)、創(chuàng)建應(yīng)用實例。GAE被設(shè)計為語言無關(guān)的,然而,當(dāng)前它僅支持Python、Java以及JVM兼容的語言。14.4GoogleApp引擎圖14.17GAE應(yīng)用體系結(jié)構(gòu)的一個簡化的Java版本常支持JDK1.5和JDK1.6。Google提供了一個eclipse插件用來幫助開發(fā)者創(chuàng)建、開發(fā)和部署GAE應(yīng)用。編譯后的應(yīng)用被部署到Google云上的只讀文件系統(tǒng)。GAE提供了一個管理控制面板,它允許應(yīng)用管理員創(chuàng)建GAE應(yīng)用,監(jiān)控它們的運行狀況,檢查使用/限額信息。

任何持久性數(shù)據(jù)通過JDO/JPA接口寫到數(shù)據(jù)存儲中,數(shù)據(jù)存儲類似于數(shù)據(jù)庫服務(wù)。通過SDC(安全數(shù)據(jù)連接),GAE允許它的應(yīng)用在公司數(shù)據(jù)庫中檢索數(shù)據(jù)并寫數(shù)據(jù),這使得企業(yè)系統(tǒng)和GAE的集成更容易。

GAE應(yīng)用使用資源的數(shù)量最多到一定的限額。通用的資源包括請求數(shù)、輸入帶寬、輸出帶寬、CPU時間、數(shù)據(jù)庫API調(diào)用、數(shù)據(jù)庫查詢。14.4.1服務(wù)

GAE通過JavaAPI暴露的服務(wù)如下:

(1)URL獲取服務(wù):它允許應(yīng)用訪問資源,并通過HTTP與HTTPS與Internet上的其他主機通信。

(2)郵件服務(wù):通過GAE的郵件服務(wù),應(yīng)用可以使用Google的基礎(chǔ)設(shè)施發(fā)送郵件消息。

(3)內(nèi)存緩沖服務(wù):內(nèi)存緩沖服務(wù)是一個分布式的內(nèi)存數(shù)據(jù)高速緩存,應(yīng)用的多個實例可以訪問它。

(4)圖像處理服務(wù):它提供了允許用戶處理圖像的API,如調(diào)整大小、旋轉(zhuǎn)、壓縮和翻轉(zhuǎn)。

(5)任務(wù)調(diào)度服務(wù):任務(wù)調(diào)度服務(wù)也可稱為cron服務(wù),它使應(yīng)用在指定的次數(shù)或時間段內(nèi)響應(yīng)Web請求時能執(zhí)行其他任務(wù)。換句話說,應(yīng)用可以在處理Web請求的同時創(chuàng)建并運行后臺任務(wù)。

(6)Google賬戶:為了鑒定用戶,GAE把應(yīng)用和Google賬戶集成在一起,它減少了開發(fā)者實現(xiàn)個人用戶賬戶系統(tǒng)的工作量。如果用戶已經(jīng)擁有一個Google賬戶,它使用戶能更快地使用應(yīng)用。14.4.2數(shù)據(jù)存儲

GAE使用數(shù)據(jù)存儲服務(wù)Datastore存儲和查詢數(shù)據(jù)。Datastore是一個無模式的具有查詢引擎和支持原子事務(wù)的對象數(shù)據(jù)庫。該服務(wù)可以通過開源的DataNucleusAccess平臺實現(xiàn)JDO(JavaDataObjects)和JPA(JavaPersistenceAPI)訪問。

Datastore建立在BigTable之上,BigTable建立在GFS(Google文件系統(tǒng))之上,因此當(dāng)數(shù)據(jù)增加的時候,它可以很好地伸縮,并具有高可用性和高可靠性。GFS將在下一節(jié)進行討論。雖然GAE的Datastore與傳統(tǒng)的關(guān)系數(shù)據(jù)庫具有類似之處,但實際上它們有很大區(qū)別。首先,Datastore是無模式的,數(shù)據(jù)實體的結(jié)構(gòu)由應(yīng)用代碼決定;其次,它支持連接查詢,但不支持多對多關(guān)系、分組和其他的聚合查詢。

GAE的Datastore實際上是一個層次數(shù)據(jù)庫,不同區(qū)域的實體在Datastore里有嚴格的分層(Barrett)。一個節(jié)點有一個父節(jié)點,也可以沒有。如果沒有父節(jié)點,這個節(jié)點稱為根節(jié)點。根節(jié)點和其所有的子節(jié)點構(gòu)成了一個稱作實體組的實體集群。Datastore里的每個實體都有一個關(guān)鍵碼,用來唯一標(biāo)識應(yīng)用里的一個實體。實體的本地碼由實體類別和ID組成,ID可以是應(yīng)用指定的名字或者Datastore指定的數(shù)值型ID。對于根實體,它的關(guān)鍵碼就是它的本地碼。子實體的關(guān)鍵碼是一條路徑,由根到子實體路徑上的祖先的本地碼組成。

GAE的Datastore使用了BigTable,它支持以下操作:讀、寫、刪除、單行事務(wù)、前綴瀏覽和范圍瀏覽。為了使用BigTable,Datastore按照不同BigTable服務(wù)的關(guān)鍵碼分配存儲實體的范圍,以分布式的方式存儲實體。因此,Datastore也可看做碎片分類數(shù)組(Barrett)。實體組成員在任何時間都處于同一BigTable服務(wù)中。用一個服務(wù)管理包含同一實體組的實體的事務(wù),實現(xiàn)起來簡單高效。目前,GAE僅支持一個實體組上的事務(wù)。

Datastore支持很強的數(shù)據(jù)一致性并使用優(yōu)化的并發(fā)控制維護數(shù)據(jù)的一致性。事務(wù)中會發(fā)生實體的更新,這意味著它或者成功或者失敗。事務(wù)操作在實體組的根級別上。一旦相同實體組內(nèi)有更新實體的多個請求,就會發(fā)生競爭,獲勝者可以執(zhí)行更新,而其他的請求在固定的次數(shù)內(nèi)繼續(xù)競爭直到請求超時。與鎖并發(fā)控制算法相比,這種方式具有更好的吞吐量(Barrett)。

Datastore默認在類別和所有的屬性上創(chuàng)建索引,通過用戶指定的配置文件創(chuàng)建多個屬性的復(fù)合索引,所有索引通過BigTable實現(xiàn)(Barrett)。14.4.3開發(fā)可伸縮應(yīng)用的提示

GAE用戶或許使用以下技術(shù)開發(fā)可伸縮的應(yīng)用(JasonCooperj):

(1)通過關(guān)鍵碼、碼的名稱或ID檢索對象/實體。與傳統(tǒng)的關(guān)系數(shù)據(jù)庫相比,GAE的Datastore更像是一個分布式的分類數(shù)組/哈希表,并且讀操作高度優(yōu)化。

(2)不使用偏移量分頁,檢索立即使用的數(shù)據(jù)。因為Datastore的查詢最多可以返回1000個結(jié)果,如果超過了1000個,執(zhí)行效率會降低。另一個原因是許多資源實際上被浪費了,因為大多數(shù)返回結(jié)果在使用前被丟棄了。

(3)保持實體組較小。由于事務(wù)的發(fā)生僅局限于實體組內(nèi),GAE對事務(wù)的支持是有限的。這意味著,大的實體組競爭概率大,并行度低,這限制了應(yīng)用的吞吐率。

(4)碎片常寫實體。對于數(shù)據(jù),通過碎片技術(shù),可以使寫操作分布式和并行化。事實上,碎片化有效地把單個實體分割成許多片。當(dāng)查詢一個結(jié)果時,可通過查詢所有碎片并組合查詢結(jié)果快速得到計算結(jié)果。14.4.4開發(fā)工具

用于Java的GAESDK(軟件開發(fā)工具包)包括:

(1)支持本地GAE應(yīng)用開發(fā)和調(diào)試的本地仿真器,它有一個本地Web服務(wù)器和數(shù)據(jù)庫服務(wù)。真實的GAE運行時的安全策略也應(yīng)用到仿真器上。

(2)SDK包含了GAE中所有可用的API和庫。

(3)EclipseIDE插件簡化了GAE應(yīng)用的開發(fā)和部署。14.4.5其他約束

考慮到安全因素,GAE應(yīng)用運行在一個受限制的“沙箱”環(huán)境中,因此,有以下約束:

(1)GAE應(yīng)用不能寫文件系統(tǒng),但允許從文件系統(tǒng)讀。應(yīng)用必須用Datastore服務(wù)寫數(shù)據(jù)。

(2)不支持Socket通信或直接訪問另一個主機。HTTP/HTTPS請求需要通過GAE的URL獲取服務(wù)生成。

(3)不支持子進程或線程。Web請求必須在一個單一的進程中處理。

(4)有響應(yīng)時間的限制。Web請求處理必須在30秒內(nèi)完成,否則它將被終止。

(5)不支持系統(tǒng)調(diào)用。

GFS(GoogleFileSystem,Google文件系統(tǒng))是一種支持查詢和信息搜集的文件系統(tǒng)。它很可能是最大的文件系統(tǒng)。在查詢和搜集時,由于Google依賴有效的文件訪問,所以文件系統(tǒng)必須是高效的并且可伸縮。據(jù)Google報告,使用Google的用戶數(shù)量在不斷上升,有時高速上升。GFS技術(shù)成為Google向用戶提供即時服務(wù)的關(guān)鍵技術(shù),因而大量的工作量花費在GFS工程和再工程上。據(jù)Quilan報告(Quinlan,2010),GFS經(jīng)過了重要的設(shè)計變更以滿足不斷變化的環(huán)境。14.5Google文件系統(tǒng)

S.Ghemawat,2003年提到了早期的GFS設(shè)計,后來做了許多改變,所有的文件被劃分成64MB大小的塊。大多數(shù)情況下,用戶會在文件末尾追加信息或者讀文件,因此GFS的設(shè)計支持那些操作。GFS運行在數(shù)以千計的廉價的處理器的Google基礎(chǔ)設(shè)施之上。

GFS早期有幾個關(guān)鍵的考慮和決策:

(1)系統(tǒng)結(jié)構(gòu)應(yīng)該開發(fā)起來簡單,節(jié)省實現(xiàn)的工作量。

(2)系統(tǒng)使用數(shù)以千計甚至百萬個處理器支持可伸縮的操作。

(3)由于數(shù)據(jù)龐大并且許多數(shù)據(jù)是流動的,所以不需要緩存。流動的數(shù)據(jù)是不需要緩存的。

(4)使用的廉價處理器可能會失效,系統(tǒng)至少應(yīng)該提供三個副本避免這種失效。更多的副本可以增加系統(tǒng)的可用性。

(5)應(yīng)當(dāng)提供常見的接口和API,同時這些API應(yīng)該支持常用的Google操作,如快照和記錄追加。

(6)初步設(shè)計要具有高的吞吐量而不是短的延遲。注意,吞吐量和延遲本質(zhì)上是沖突的。根據(jù)排隊論(Lavenberg,1983),具有高吞吐量的系統(tǒng)一般上都有大的延遲,而具有低延遲的系統(tǒng),它的吞吐量也比較低。第一個考慮導(dǎo)致了簡單的設(shè)計,它允許Google把軟件部署到市場上獲取市場占有率。然而,由于更多的用戶使用Google查詢和獲取頁面,用戶體驗成為一個關(guān)鍵的問題。用戶體驗的一個關(guān)鍵是低延遲,因此,后來GFS做了相應(yīng)的變更來解決這個問題。14.5.1GFS系統(tǒng)結(jié)構(gòu)和操作

GFS系統(tǒng)有兩類節(jié)點:用來管理元數(shù)據(jù)的主節(jié)點和用來提供數(shù)據(jù)存儲的塊服務(wù)器,如圖14.18所示。為了節(jié)省時間,數(shù)據(jù)直接在客戶/塊服務(wù)器間傳輸而不經(jīng)過主節(jié)點。為了高效處理,主節(jié)點總是駐留在內(nèi)存中。

圖14.18GFS體系結(jié)構(gòu)主服務(wù)器存儲和管理以下與塊關(guān)聯(lián)的元數(shù)據(jù):

(1)把文件映射到塊位置(64位)地址的表。

(2)把文件映射到它的副本的表。

(3)讀寫一個具體塊的處理表。

(4)支持文件持久性的操作日志,日志中還包括塊服務(wù)器失效后,使用文件復(fù)制時的信息以及可以恢復(fù)的檢查點。

為了更新表實體,主服務(wù)器定期接收來自塊服務(wù)器的更新。它也負責(zé)創(chuàng)建、復(fù)制和重新均衡塊。塊的重新均衡可以提高空間利用率和訪問速度。同時,主服務(wù)器也負責(zé)回收垃圾。塊服務(wù)器存儲數(shù)據(jù)文件,每個獨立的文件被劃分成固定大小為64MB的塊。每個塊有唯一的64位的標(biāo)識,同時維護文件到組成塊的邏輯映射。每個塊也有一個檢測系統(tǒng)故障的64位的校驗碼。在系統(tǒng)中每個塊至少有三個副本,而需求量大的文件有更多的副本。塊服務(wù)器運行在Linux上并維護數(shù)據(jù)的一致性。

如果一個進程需要訪問某一塊,它首先必須獲得主服務(wù)器的許可。在檢查一個具體的塊可用(也就是沒有其他進程正在使用它)之后,主服務(wù)器提供塊服務(wù)器地址,允許此進程在一段時間訪問這個塊。在這期間,此進程可以訪問這個塊服務(wù)器,而為了維護系統(tǒng)的一致性,其他的進程不能訪問這個塊服務(wù)器。進程和塊服務(wù)器直接交互,不受主服務(wù)器的干涉。如果進程更改了這個塊,這個更改被傳送到這個塊的副本所在的塊服務(wù)器上,在收到所有副本所在塊服務(wù)器的確認之前,系統(tǒng)不會提交。這通過主塊服務(wù)器管理。

早期,Google使用的GFS有200多個集群、5000多臺機器、5+PB大小的文件系統(tǒng)、在硬件頻繁失效情況下單個集群上每秒40GB的讀寫負載。由于越來越多的人使用Google,GFS有了顯著的改進。

注意,GFS不是作為OS內(nèi)核的一部分實現(xiàn)的,它的許多操作用戶可以直接使用。由于任何文件系統(tǒng)訪問不需要經(jīng)過OS功能調(diào)用層,這提高了系統(tǒng)性能。傳統(tǒng)的系統(tǒng)調(diào)用,如OS中進程的創(chuàng)建,開銷是比較大的。14.5.2GFS開發(fā)中的經(jīng)驗

本小節(jié)重點討論主節(jié)點。從一開始,Google就知道單一的主節(jié)點存在問題。然而,Google仍然決定采用這種方式,并且這也是最早作的決定。這個決定使GFS能夠快速實現(xiàn)并部署到市場中。考慮到這一方面,Google做出了正確的決策。

然而,當(dāng)越來越多的人使用Google時,許多問題變得突出,特別是文件大小的增加,從幾百萬兆到幾千萬兆,然后到數(shù)億兆。主節(jié)點上元數(shù)據(jù)數(shù)量急劇增加,因此主節(jié)點上的負荷也急劇增加。并行MapReduce的使用對此問題沒有幫助,由于上百萬的MapReduce操作需要同時訪問文件,主節(jié)點的負載會急劇增加。注意,主節(jié)點一直駐留在內(nèi)存中,元數(shù)據(jù)信息量會隨著時間顯著的增加。

失效的單個節(jié)點也會對某些應(yīng)用,如視頻服務(wù),帶來不好的結(jié)果。而且,剛開始,GFS對主節(jié)點沒有自動恢復(fù)計劃。因此,當(dāng)主節(jié)點失效時,將需要很長一段時間恢復(fù)。Google的解決方案是生成影子主節(jié)點,它存儲主節(jié)點狀態(tài)的快照以快速恢復(fù)。此外,初步設(shè)計的目標(biāo)是高吞吐量,而延遲是其次考慮的問題,后來才強調(diào)了低延遲。根據(jù)排隊論,吞吐量和延遲是沖突的。服務(wù)器偏愛高吞吐量的系統(tǒng),而用戶卻被長時間延遲。低延遲系統(tǒng)得到用戶的喜愛,但系統(tǒng)因此要向用戶提供支持快速服務(wù)的能力。Google的解決方法是通過冗余操作確保任何失效可以容易地隱藏,因為失效導(dǎo)致了大多數(shù)延遲。例如,如果一個寫操作失敗,而沒有可用的冗余操作,這個失敗的操作會導(dǎo)致系統(tǒng)明顯延遲。GFS有兩個寫日志,如果一個失敗,另一個會立即接管。由于相同的原因,主節(jié)點需要多個影子副本。此外,GFS通過容錯機制支持并發(fā)讀寫,因此,和典型的文件系統(tǒng)相比,它的一致性模型更復(fù)雜。根據(jù)(Quinlan,2010),這是問題的根源,尤其是允許多個寫操作同時執(zhí)行時。

Google也嘗試采用多單元方法,它在數(shù)據(jù)中心上創(chuàng)建多個單元,用這種方法,多個GFS主節(jié)點將運行在一個塊服務(wù)器池上。這也需要應(yīng)用把數(shù)據(jù)劃分到不同的單元上。14.5.3其他類似項目

其他分布式文件系統(tǒng)也是可用的。如HadoopHDFS(Hadoop)、CloudStore(CloudStore)。HDFS和Cloudstore幾乎是同時開發(fā)的。HDFS使用Java語言,而為了提高效率,CloudStore后臺采用C++語言。

HDFS也把文件劃分成64MB的塊,存儲在一組機器上。與GFS相似,它通過在多個主機上復(fù)制數(shù)據(jù)實現(xiàn)可靠性。每個主機都可以和其他主機進行通信完成數(shù)據(jù)復(fù)制。類似于GFS,HDFS也有一個唯一的服務(wù)器,稱為節(jié)點,如果它不工作了,文件系統(tǒng)就不可用?;謴?fù)后,需要執(zhí)行以前所有的命令確保文件系統(tǒng)的一致性,整個過程需要較長的時間。

CloudStore具有與GFS類似的體系結(jié)構(gòu),它有三個主要組件:

(1)元數(shù)據(jù)服務(wù)器,它提供全局的名字空間;

(2)阻塞服務(wù)器,文件像GFS一樣存儲在塊中;

(3)客戶庫,它提供文件系統(tǒng)的API,實現(xiàn)應(yīng)用和CloudStore的連接。

CloudStore是一個開源程序,它復(fù)制了Hadoop項目的許多特征,包括數(shù)據(jù)完整性、C++語言訪問、Java和Python語言訪問、復(fù)制和可伸縮性。

HDFS的一個特征是寫操作要求從文件的開始寫起,直到到文件的結(jié)尾,實際上,任何寫操作都是整個文件的完全重寫。然而,KFS允許在任何位置寫,也可以追加一些內(nèi)容到當(dāng)前的文件。KFS也支持簡單的自動負載均衡機制,因此系統(tǒng)可以把數(shù)據(jù)從擁塞的節(jié)點移到不擁塞的節(jié)點,但是HDFS沒有這樣的機制。

BigTable用于處理Web應(yīng)用的大量的半結(jié)構(gòu)化數(shù)據(jù)。例如,URLs(包括內(nèi)容、搜集的元數(shù)據(jù)、鏈接、導(dǎo)航和網(wǎng)頁級別)、用戶喜好數(shù)據(jù)(包括個性化設(shè)置、最近的查詢/檢索結(jié)果)、地理位置(包括諸如商店和餐廳類的物理實體、道路、衛(wèi)星圖像數(shù)據(jù)和用戶標(biāo)注)。因為擁有1012數(shù)量級的URLs,每個URLs有多個版本/頁面,每頁有約20KB的數(shù)據(jù)、上億的用戶,每秒有上千的訪問請求,并且有超過100TB的衛(wèi)星圖像數(shù)據(jù),因此,這個數(shù)據(jù)量是非常龐大的。14.6BigTable有人可能使用商用數(shù)據(jù)庫開發(fā)Web應(yīng)用,如Oracle、DB2和SQLserver等,但是這些數(shù)據(jù)庫系統(tǒng)多用于商業(yè)計算,而不是用于Web應(yīng)用,很多底層優(yōu)化無法做到。因此,Google決定開發(fā)在存儲和數(shù)據(jù)傳送操作方面有很多底層優(yōu)化機制的BigTable。

BigTable欲達到如下目標(biāo):

(1)它能異步和無間斷處理請求。

(2)它能支持高達每秒百萬次速率的讀/寫操作。

(3)它能從搜索到的網(wǎng)頁中掃描所有的或感興趣的數(shù)據(jù)來識別需要的信息,并在巨大的一對一或一對多數(shù)據(jù)集上執(zhí)行join操作,這是涉及許多數(shù)據(jù)集的復(fù)雜計算。

(4)它能隨時檢查并跟蹤數(shù)據(jù)變化,這對搜集信息很有用。如果一個Web頁沒有改變,沒必要再次搜集相同的網(wǎng)頁。

(5)它能存儲各網(wǎng)頁的歷史數(shù)據(jù),為數(shù)據(jù)挖掘和分析提供統(tǒng)計信息。

(6)當(dāng)請求數(shù)量和數(shù)據(jù)規(guī)模隨時間增加時,它能在性能上進行伸縮。將來數(shù)據(jù)的規(guī)??隙〞黾?。

(7)它能以內(nèi)建的容錯機制提供可靠和高可用的計算與數(shù)據(jù)服務(wù)?;旧?BigTable是一個分布式存儲系統(tǒng),而不是一般意義上的、建立在數(shù)千臺廉價服務(wù)器上、管理PB(1015數(shù)量級)級字節(jié)的大型結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng)。目前,BigTable每天能高效、可伸縮、高可用地處理PB級字節(jié)的數(shù)據(jù)。BigTable的最初設(shè)計開始于2004年,它目前廣泛用于Google服務(wù)中,包括Google分析、Google金融、Orkut社會性網(wǎng)絡(luò)服務(wù)、個性化搜索、Writely字處理軟件和Google地球。14.6.1主要構(gòu)件

BigTable有如下主要構(gòu)件:

(1)GFS:提供可伸縮的Web文件系統(tǒng)支持;

(2)Scheduler:提供大量機器之間作業(yè)調(diào)度,并監(jiān)控任何機器的錯誤,在必要時重新調(diào)度;

(3)Lockservice:是一個分布式鎖管理器,提供對小文件的可靠管理;

(4)MapReduce:用于讀寫B(tài)igTable數(shù)據(jù)。

BigTable集群管理一個分布的運行不同類型應(yīng)用的機器共享池,這個集群管理系統(tǒng)把作業(yè)分配到不同的機器,管理共享機器上的資源,監(jiān)控機器狀態(tài),處理運行時錯誤。系統(tǒng)的體系結(jié)構(gòu)如圖14.19所示。

圖14.19BigTable集群的系統(tǒng)結(jié)構(gòu)圖14.6.2BigTable概述

1.?dāng)?shù)據(jù)模型

BigTable實質(zhì)上是一個稀疏的分布式多維存儲圖。圖的索引是一個由三個部分組成的字符串:行關(guān)鍵字、列關(guān)鍵字和時間戳,定義如下:

(row:string,column:string,time:int64)>string

圖14.20是一個存儲在“”的Web頁中的表的切片。

圖14.20BigTable的數(shù)據(jù)模型

(1)行:行關(guān)鍵字是任意的字符串(最多64KB,大多數(shù)用戶使用10~100Byte),對行的數(shù)據(jù)訪問是原子性的,由事務(wù)處理支持。行的建立隱含在存儲數(shù)據(jù)之上。BigTable按字母順序?qū)π嘘P(guān)鍵字排序,并根據(jù)一個或少量處理器動態(tài)劃分行的范圍。每一行范圍被看成一個數(shù)據(jù)片,它是分布和負載均衡的基本單元。這樣便于閱讀,并利用本地化原則的優(yōu)勢使訪問更加有效。這些工作的完成是通過遍歷URLs的主機名稱部分獲取相同域中的信息,然后把相關(guān)信息組織在一起形成一些連續(xù)的行。例如,一個人可以在/index.html中存儲/index.html的數(shù)據(jù)。在相同域中存儲同一領(lǐng)域相互緊密關(guān)聯(lián)的Web頁具有空間和時間上局部化的優(yōu)勢。一個用戶訪問一個頁很可能在最近的將來(時間局部性)訪問相關(guān)的頁(空間局部性)。

(2)列:Web頁被劃分為若干個集合,稱為列簇(Columnfamilies),是訪問控制的基本單位。列簇通常存儲相同類型的數(shù)據(jù)。列簇僅在列關(guān)鍵字產(chǎn)生以后創(chuàng)建,并在那個創(chuàng)建關(guān)鍵字的表中使用,因而不同列簇的數(shù)量很小,且在操作過程幾乎不變。列關(guān)鍵字的詞法是:family:[optional]qualifier,其中列簇名字應(yīng)當(dāng)是可打印的,限定符是任意字符串。例如:一個可能的簇名字是“l(fā)anguage”,它存儲每一個Web頁的語言標(biāo)識(ID)。訪問控制和磁盤/存儲費用在列簇級上執(zhí)行。

(3)時間戳:BigTable可存儲通過時間戳索引的相同數(shù)據(jù)的多個版本。時間戳是一個64位整數(shù),它要么被BigTable賦值成以毫秒表示的“實時”時間,要么被客戶應(yīng)用明確賦值。為避免沖突,應(yīng)用需要產(chǎn)生獨一無二的時間戳。最近時間戳的版本存儲在第一位,不同的版本按降序存儲。為了自動進行垃圾回收,客戶要么指定一個單元的最近n個版本,要么保存足夠多的最新版本。

2.實現(xiàn)結(jié)構(gòu)

數(shù)據(jù)片(Tablets):為了讓數(shù)據(jù)分發(fā)至不同的機器,BigTable按行把大表分割成若干數(shù)據(jù)片。一個數(shù)據(jù)片存儲若干鄰接行,在任何給定時間內(nèi),數(shù)據(jù)片都是單個機器管理的基本單位。每個數(shù)據(jù)片有起始和結(jié)束行的關(guān)鍵字,大約存儲100~200MB大小的數(shù)據(jù)。

給定一個服務(wù)器,它可能負責(zé)約100個數(shù)據(jù)片,因為按這個比率,它能很快執(zhí)行恢復(fù)和負載均衡。例如,如果一個機器失效,100個其他機器通過每臺從失效機器上抓取一個數(shù)據(jù)片的辦法進行恢復(fù)。主機也可在某機過載時,把這個機器的一些數(shù)據(jù)片移到另一臺機器上。數(shù)據(jù)片的例子如圖14.21所示。

圖14.21示例數(shù)據(jù)片

當(dāng)數(shù)據(jù)片過大時,例如,大于期望的兆級字節(jié)時,數(shù)據(jù)片被一分為二,如圖14.22所示。

圖14.22劃分數(shù)據(jù)片使用數(shù)據(jù)片時,有幾個問題需要說明:

(1)定位數(shù)據(jù)片。

因為數(shù)據(jù)片會從一個服務(wù)器向另一個服務(wù)器移動,“給定一行,客戶如何找到正確的機器?”。每個數(shù)據(jù)片有一個起始和結(jié)束行,因此可以通過查看每個機器的數(shù)據(jù)片范圍識別出數(shù)據(jù)片。一種方法是使用BigTable主機存儲每個機器的行范圍,但當(dāng)數(shù)據(jù)片數(shù)量巨大時,中央服務(wù)器將變成系統(tǒng)的瓶頸。

另一種方式是,存儲一個包含BigTable中定位數(shù)據(jù)片信息的表。數(shù)據(jù)片的“3級層次查找模式”如圖14.23所示。位置用相關(guān)服務(wù)器的IP:端口表示。在第1級,它從一個鎖服務(wù)器開始,指向根數(shù)據(jù)片的擁有者。在第2級,使用根數(shù)據(jù)找到合適的元數(shù)據(jù)數(shù)據(jù)片的擁有者。在第3級,元數(shù)據(jù)表保存所有用戶表的數(shù)據(jù)片位置。圖14.233級層次查找模式特別說明,為避免根數(shù)據(jù)片成為瓶頸,BigTable使用主動預(yù)取和緩存方法。

(2)數(shù)據(jù)片服務(wù)。

為存儲數(shù)據(jù),BigTable使用Google的SSTable文件格式。SSTabler提供一種長久有序且不改變的從主鍵到值的映射,鍵和值都定義成任意的字節(jié)型字符串。數(shù)據(jù)片的持續(xù)狀態(tài)存儲在GFS中,如圖14.24所示。更新時,當(dāng)前提交的數(shù)據(jù)存儲在緩沖區(qū)的內(nèi)存中,舊的更新存儲在SSTables集合中,提交日志記錄所有的還沒有提交的變化。當(dāng)一個寫操作到達數(shù)據(jù)片服務(wù)器時,服務(wù)器首先檢查它格式是否正確、發(fā)送者是否有改變數(shù)據(jù)的權(quán)限。如果是,寫操作被處理。寫操作提交后,相應(yīng)內(nèi)容被插入到內(nèi)存。當(dāng)一個讀請求出現(xiàn)時,服務(wù)器在執(zhí)行讀操作前執(zhí)行相同的檢查。讀操作的執(zhí)行基于SSTables集合和內(nèi)存的合并視圖,如圖14.24所示。

圖14.24表的表示(3)數(shù)據(jù)片壓縮。

每個數(shù)據(jù)片的狀態(tài)表示成內(nèi)存中一個不變的SSTable壓縮文件,并以一個日志緩沖作為結(jié)束。BigTable提供兩類壓縮:輔壓縮和主壓縮。輔壓縮在內(nèi)存滿時發(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ù)器。假定每個服務(wù)器擁有100個數(shù)據(jù)片,將會有1M數(shù)據(jù)片。每個機器上的所有數(shù)據(jù)片共享一個日志。否則,一個集群上的一百萬數(shù)據(jù)片將導(dǎo)致寫太多的文件,而且,同時寫1M個日志會使得性能急速下降。

通過使用共享日志,每一個表服務(wù)器有一個用于存儲它上面的所有數(shù)據(jù)片的寫日志,并在同一個日志文件中更新多個數(shù)據(jù)片。因為每一個數(shù)據(jù)塊為64MB,因此當(dāng)不斷更新時,新的日志塊將會頻繁創(chuàng)建。共享日志存在的一個問題是,在恢復(fù)期,服務(wù)器需要讀日志數(shù)據(jù)進行數(shù)據(jù)片的變更,如果大量數(shù)據(jù)片需要恢復(fù),并且很多機器從同一日志塊中讀取,則可能導(dǎo)致I/O的極大浪費。共享日志的恢復(fù)機制如下:當(dāng)一個機器不工作時,主機重新分布它的日志塊到其他機器去處理,這些機器在本地存儲處理的結(jié)果。想獲得數(shù)據(jù)片的機器從主機中查詢處理結(jié)果的位置,以更新它們最近獲取的數(shù)據(jù)片,然后直接訪問這些機器獲取數(shù)據(jù)。

3.APIs

BigTable的API支持通過函數(shù)調(diào)用創(chuàng)建和刪除表、列簇,改變集群、表和列簇的元數(shù)據(jù)以及訪問控制優(yōu)先級。而且BigTable支持從單個行查詢,或在表中的數(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)用對Webtable執(zhí)行了一個原子變化:它給添加了一個導(dǎo)航并刪除了另一個導(dǎo)航。

4.其他數(shù)據(jù)庫方法

注意,GFS和BigTable被設(shè)計為專用于基于Web的云計算,因而它們的設(shè)計不受傳統(tǒng)數(shù)據(jù)庫管理設(shè)計或文件系統(tǒng)的約束。因為Google確實不存在數(shù)據(jù)庫管理或文件系統(tǒng),所以可以從頭開始一個新的設(shè)計。Cattel調(diào)查了很多其他的具有相似目標(biāo)的類似數(shù)據(jù)庫系統(tǒng)的設(shè)計,他認為這些系統(tǒng)的特征是數(shù)據(jù)存儲而不是數(shù)據(jù)庫,因為這些系統(tǒng)不提供傳統(tǒng)數(shù)據(jù)庫系統(tǒng)管理的全部特征。這些現(xiàn)代數(shù)據(jù)存儲具有如下共同特征:

(1)支持調(diào)用級交互(而不是綁定到SQL語句),因而應(yīng)用可能直接控制數(shù)據(jù)庫的存儲。

(2)有效的索引以利于大數(shù)據(jù)量的有效處理。

(3)通過把不同行分配到不同服務(wù)器,支持可伸縮性。因此當(dāng)行數(shù)增加時,用戶不會感到過度延遲。

(4)支持動態(tài)數(shù)據(jù)模式,因而不同租戶雖然有不同的數(shù)據(jù)模式需求,但他們?nèi)匀还蚕硐嗤臄?shù)據(jù)存儲和模式表。

(5)索引在內(nèi)存中緩存以得到有效的訪問,這可能會在不同的節(jié)點中分發(fā)或復(fù)制索引。這些數(shù)據(jù)存儲據(jù)根以下原則存儲數(shù)據(jù):

(1)關(guān)鍵值存儲:系統(tǒng)根據(jù)一個設(shè)計者定義的關(guān)鍵字存儲數(shù)據(jù)。

(2)文檔存儲:系統(tǒng)存儲索引文檔而不是文檔中的特殊項被索引。

(3)可擴展的記錄存儲:系統(tǒng)存儲可擴展的記錄,并且按不同節(jié)點劃分它們,這有時被稱為面向列的數(shù)據(jù)庫。

這些現(xiàn)代數(shù)據(jù)存儲的例子包括SimpleDB和Cassandra。

另一個方法是擴展現(xiàn)有的數(shù)據(jù)庫管理系統(tǒng)用于Web應(yīng)用。例如RAC(OracleRealApplicationClusters)。它是一個集群數(shù)據(jù)庫,并在訪問單個數(shù)據(jù)庫時允許多個處理器運行數(shù)據(jù)庫軟件。集群數(shù)據(jù)庫本質(zhì)上是運行在處理器集群上的數(shù)據(jù)庫,它利用了這些便宜處理器的伸縮性和可用性。

集群數(shù)據(jù)庫可被分為兩大類:

(1)無共享:每一個參與節(jié)點擁有一個數(shù)據(jù)子集,每個節(jié)點只運行它自己的數(shù)據(jù),但是節(jié)點間可相互通信交換數(shù)據(jù)。

(2)全共享:每個處理器可以訪問數(shù)據(jù)庫中的任何數(shù)據(jù)。

任何一種情況,節(jié)點都通過諸如infiniBand或Myrinet的高速網(wǎng)絡(luò)互聯(lián)。有高速網(wǎng)絡(luò)把集群和存儲器連接起來是致關(guān)重要的。最初,集群數(shù)據(jù)庫使用諸如磁盤的存儲設(shè)備來傳送數(shù)據(jù),當(dāng)存儲設(shè)備速度很慢時,操作速度也會慢。在采用諸如光纖信道技術(shù)的專用通信系統(tǒng)用于系統(tǒng)和存儲器通信后,這個問題得到了解決。光纖信道是用于存儲器網(wǎng)絡(luò)的網(wǎng)絡(luò)技術(shù),它的傳送速度達Gigabit,它是SAN(存儲器局域網(wǎng))的通用技術(shù)。在2008年,這種技術(shù)能以5100MB/s的吞吐量傳送21.04GBaud的數(shù)據(jù)。

無共享和全共享兩種集群數(shù)據(jù)庫都需仔細地對應(yīng)用劃分以達到優(yōu)化性能的目的。無共享體系結(jié)構(gòu)的可伸縮性依賴于數(shù)據(jù)劃分。這種方法的一個問題是如果一個節(jié)點崩潰,數(shù)據(jù)的一部分將無法得到,因而通常數(shù)據(jù)的劃分應(yīng)保證數(shù)據(jù)實際存儲在后臺的多個磁盤上,如果其中一個失效,其他的磁盤可以自動再存儲相應(yīng)的數(shù)據(jù)。這種無共享的集群數(shù)據(jù)庫方法被很多數(shù)據(jù)庫系統(tǒng)使用,例如IBM的DB2、Microsoft的SQLServer、MySQL的Cluster和Bizgres的MPP。

在全共享體系結(jié)構(gòu)中,物理設(shè)計通常涉及網(wǎng)絡(luò)附加存儲器,通過諸如光纖信道的高速互聯(lián)網(wǎng)絡(luò),所有節(jié)點都和諸如RAID的獨立共享磁盤通信。在這種體系結(jié)構(gòu)中,當(dāng)多個處理器同時訪問同一數(shù)據(jù)庫時,它們之間會有競爭。RAC是一個全共享數(shù)據(jù)庫,每個處理器有自己的緩存,有必要通過高速網(wǎng)絡(luò)協(xié)調(diào)各種并發(fā)讀寫以維護系統(tǒng)緩存的一致性。RAC有一種叫做緩存融合的機制。一般來說,數(shù)據(jù)庫系統(tǒng)將面臨如下情況:

(1)并發(fā)讀;

(2)不同節(jié)點的并發(fā)讀寫;

(3)不同節(jié)點的并發(fā)寫。

第一種情況不是問題,因為多個讀用戶能沒有任何沖突地并發(fā)讀數(shù)據(jù)。但是,處理第二和第三種情況時,緩存融合維護全局控制器,全局控制器維護每個節(jié)點上每個緩存塊的狀態(tài)。如果存在沖突,全局控制器要求擁有數(shù)據(jù)的節(jié)點通過高速網(wǎng)絡(luò)傳送大量最新數(shù)據(jù)到接收節(jié)點,而不需要通過磁盤系統(tǒng),從而維護了系統(tǒng)的一致性。當(dāng)緩存數(shù)據(jù)被替換或在檢查點時,實際數(shù)據(jù)寫入磁盤的操作將會發(fā)生?;旧?傳統(tǒng)數(shù)據(jù)庫管理系統(tǒng)中的并發(fā)控制現(xiàn)在是在緩存級完成的,并由支持處理器到處理器和處理器到存儲器兩種通信的高速網(wǎng)絡(luò)支持。全局控制器通過涉及緩存管理、數(shù)據(jù)通信、并發(fā)讀寫的復(fù)雜協(xié)議維護數(shù)據(jù)的一致性。每個寫用戶仍然需要聲明一些排它性,其他寫用戶必須服從且等待它的寫操作完成,除非修改的數(shù)據(jù)是可用的,并且當(dāng)它們在不同的節(jié)點上時,將通過高速網(wǎng)絡(luò)從一個緩存?zhèn)魉偷搅硪粋€緩存。因為全局數(shù)據(jù)控制器完成的大多數(shù)操作要么是在計算節(jié)點、要么是通過高速通信系統(tǒng)完成的,因而操作比傳統(tǒng)的通過磁盤參與的方法更有效率。因為并發(fā)寫比并發(fā)讀消耗更多的時間,這種全共享方法更適合大多數(shù)是讀操作的應(yīng)用。

如果多租戶應(yīng)用有很多寫操作,數(shù)據(jù)劃分變成一個關(guān)鍵問題,因為同步多個寫操作比同步讀操作消耗更多時間。

使用全共享方法的有:IBM的用于z/OS的DB2、IBMDB2pureScale、SybaseAdaptiveServerEnterprise、ClusterEdition。

MapReduce是一個分布式編程模型,可用于處理用廉價處理器集群搭建的云計算環(huán)境中的海量數(shù)據(jù)集(Ghemawat,2004)。這種計算模型起源于函數(shù)式程序設(shè)計語言Lisp中的map和reduce函數(shù)。但是,MapReduce的含義和操作不同于map和reduce函數(shù)的含義和操作。用戶可指定一個map函數(shù)處理一個關(guān)鍵字/值對,以產(chǎn)生一個中間值,一個reduece函數(shù)合并全部的中間值以得到最終結(jié)果。這兩個函數(shù)能運行在不同的計算機上,主機為工作節(jié)點分配處理任務(wù)。14.7MapReduce14.7.1MapReduce編程模型

圖14.25展示了一個MapReduce體系結(jié)構(gòu),它有一個主節(jié)點和多個工作節(jié)點。

圖14.25MapReduce體系結(jié)構(gòu)

計算分兩步完成:

(1)Map:主節(jié)點接收輸入(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論