




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
華北電力大學(xué)本科畢業(yè)設(shè)計(jì)(論文)緒論1.1課題背景與意義1.1.1課題背景云計(jì)算無(wú)疑是IT技術(shù)界當(dāng)前最熱點(diǎn)的關(guān)鍵詞之一。在云計(jì)算提出后的短短幾年間,Google、Amazon、Yahoo等互聯(lián)網(wǎng)服務(wù)商,IBM、Microsoft等IT廠商都紛紛提出了自己的云計(jì)算戰(zhàn)略,各電信運(yùn)行商也對(duì)云計(jì)算投入了極大的關(guān)注,這對(duì)云計(jì)算的商業(yè)價(jià)值給予了充分的肯定。同時(shí)學(xué)術(shù)界也對(duì)云計(jì)算進(jìn)行深層次的研究,例如Google和IBM聯(lián)合宣布推廣“云計(jì)算”的學(xué)術(shù)合作計(jì)劃,包括卡內(nèi)基梅隆大學(xué)、斯坦福、伯克利、華盛頓大學(xué)、MIT、清華大學(xué)在內(nèi)的許多高校都參加了這項(xiàng)計(jì)劃[1,2],推動(dòng)云計(jì)算的普及,加緊對(duì)云計(jì)算的研究。云計(jì)算并不是一門(mén)新技術(shù),而是融合了分布式計(jì)算,網(wǎng)格計(jì)算和并行計(jì)算,創(chuàng)造性的提出動(dòng)態(tài)管理資源并按需分配的一種新商業(yè)模式。云計(jì)算利用規(guī)模化管理和按需分配的優(yōu)勢(shì),大大提高了資源的利用率,降低了計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)等資源的使用成本。Google宣稱(chēng),由于使用了云計(jì)算技術(shù),其計(jì)算成本是競(jìng)爭(zhēng)對(duì)手的1/100,而存儲(chǔ)成本是競(jìng)爭(zhēng)對(duì)手的1/30[3]。正是由于云計(jì)算能夠顯著降低企業(yè)信息化成本,其蘊(yùn)藏著巨大的潛力。Google、Amazon、Microsoft、IBM等IT廠商都推出了自己的云計(jì)算平臺(tái),提供了IAAS、PAAS、SAAS各個(gè)類(lèi)別的不同服務(wù)。云計(jì)算很有可能改變當(dāng)今IT界的格局,使得分散化應(yīng)用向集中化演變,以桌面為核心使用各項(xiàng)應(yīng)用轉(zhuǎn)移到以Web為核心進(jìn)行各種活動(dòng)。Google可以說(shuō)是云計(jì)算鼻祖,Google的發(fā)展就是依據(jù)云計(jì)算模式進(jìn)行的。Google的各項(xiàng)應(yīng)用如GoogleSearch、GoogleGmail、GoogleMaps、GoogleEarth等都是建立在Google的上百萬(wàn)臺(tái)廉價(jià)的X86服務(wù)器上的[4],而能夠利用這些廉價(jià)服務(wù)器資源的正是Google的云計(jì)算平臺(tái)。Google以論文的形式展示了其云計(jì)算平臺(tái)的核心技術(shù)原理,為云計(jì)算的研究提供了理論依據(jù)。GoogleAppEngine這一平臺(tái)的發(fā)布使用戶(hù)通過(guò)編程的方式使用同GoogleSearch、GoogleMap一樣的基礎(chǔ)設(shè)施,讓用戶(hù)能夠結(jié)合理論,切實(shí)的參加到云計(jì)算的實(shí)踐之中。1.1.2課題意義云計(jì)算已經(jīng)成為一種趨勢(shì),不論是對(duì)企業(yè)還是個(gè)人,各種應(yīng)用系統(tǒng)將運(yùn)行于云計(jì)算平臺(tái)之上。與傳統(tǒng)的虛擬空間只能提供固定的計(jì)算能力、存儲(chǔ)空間和網(wǎng)絡(luò)帶寬相比,Google云計(jì)算平臺(tái)作為公有云能夠?yàn)閼?yīng)用提供強(qiáng)大的按需的運(yùn)算和存儲(chǔ)能力,能夠提高資源利用率并降低成本。本課題通過(guò)研究與分析Google云計(jì)算平臺(tái)的原理、性能以及GoogleAppEngine提供的編程接口,能夠有利于應(yīng)用系統(tǒng)在google云計(jì)算平臺(tái)上的部署和管理。并且能夠幫助企業(yè)借鑒google云計(jì)算平臺(tái)先進(jìn)的思想和原理搭建私有云。1.2研究現(xiàn)狀與建立在高性能UNIX服務(wù)器集群的基礎(chǔ)上的大型IT系統(tǒng)相比,Google的云計(jì)算平臺(tái)建立在大量的X86廉價(jià)服務(wù)器集群之上,那么兩者在技術(shù)架構(gòu)上也存在著明顯的差異。Google采用了許多獨(dú)特的技術(shù),如數(shù)據(jù)中心節(jié)能技術(shù)、節(jié)點(diǎn)互聯(lián)技術(shù)、可用性技術(shù)、容錯(cuò)性技術(shù)、數(shù)據(jù)存儲(chǔ)技術(shù)、數(shù)據(jù)管理技術(shù)、數(shù)據(jù)切分技術(shù)、任務(wù)調(diào)度技術(shù)、編程模型、負(fù)載均衡技術(shù)、并行計(jì)算技術(shù)和系統(tǒng)監(jiān)控技術(shù)等[3]。正是這些技術(shù)的互相協(xié)作,使得Google的云計(jì)算平臺(tái)成為一個(gè)能夠自動(dòng)管理資源、自動(dòng)容錯(cuò)的一個(gè)有機(jī)整體,成為承載Google應(yīng)用的強(qiáng)有力支撐。Google云計(jì)算平臺(tái)中,Node是最基本的處理單元。在Google云計(jì)算平臺(tái)的技術(shù)架構(gòu)中,除了少量負(fù)責(zé)特定管理功能的節(jié)點(diǎn)如(GFSMaster、Chubby和Scheduler等),所有的節(jié)點(diǎn)都是同構(gòu)的,即同時(shí)運(yùn)行BigTableServer、GFSChunkServer和MapReduceJob等核心功能模塊,與之相對(duì)應(yīng)的則是數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)管理和編程模型等3項(xiàng)關(guān)鍵技術(shù)。Google相繼發(fā)表了三大核心技術(shù)GFS[5]、MapReduce[6]、BigTable[7]的論文,詳細(xì)的介紹了其實(shí)現(xiàn)原理。文獻(xiàn)[5]是GFS的論文,介紹了GFS這一分布式文件系統(tǒng)的設(shè)計(jì)思想,體系結(jié)構(gòu)以及在數(shù)據(jù)完整性、一致性的問(wèn)題上所采用的策略。文獻(xiàn)[6]是MapReduce的論文,介紹了MapReduce這一并行計(jì)算的編程模型以及實(shí)現(xiàn)。文獻(xiàn)[7]是BigTable的論文,介紹了BigTable這一分布式數(shù)據(jù)庫(kù)的存儲(chǔ)原理。此外,Google也發(fā)表了許多輔助技術(shù)的論文,例如Chubby[8]鎖服務(wù)的論文。做為使用Google云計(jì)算平臺(tái)接口的GoogleAppEngine服務(wù)目前已經(jīng)可以支持Python、Java和Go三種語(yǔ)言,提供了存儲(chǔ)、郵件、圖像處理、Google賬戶(hù)、內(nèi)存緩存等多項(xiàng)服務(wù)。但是還是存在著很多限制,例如不能使用Google的文件系統(tǒng)。隨著平臺(tái)的不斷發(fā)展,更多得服務(wù)將會(huì)提供,而編程限制也會(huì)逐漸減少。1.3本文主要工作Google云計(jì)算平臺(tái)是一個(gè)由應(yīng)用服務(wù)器群、Bigtable數(shù)據(jù)庫(kù)及GFS數(shù)據(jù)存儲(chǔ)服務(wù)組成的平臺(tái),GoogleAppEngine可以讓開(kāi)發(fā)者在Google的基礎(chǔ)架構(gòu)之上運(yùn)行網(wǎng)絡(luò)應(yīng)用程序,能為開(kāi)發(fā)者提供一體化的、可自動(dòng)升級(jí)的在線應(yīng)用服務(wù)。本文首先對(duì)Google云計(jì)算的GFS、MapReduce、Chubby以及Bigtable等核心技術(shù)進(jìn)行深入的分析,然后分析GoogleAppEngine的應(yīng)用程序環(huán)境、沙盒、數(shù)據(jù)庫(kù)、AppEngine服務(wù)、開(kāi)發(fā)流程、配額和限制等。最后以所分析的理論知識(shí)為基礎(chǔ),設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)單的信息系統(tǒng)來(lái)測(cè)試GoogleAppEngine的各項(xiàng)服務(wù)。2Google云計(jì)算平臺(tái)概述2.1Google云計(jì)算平臺(tái)的體系結(jié)構(gòu)2.1.1云計(jì)算體系結(jié)構(gòu)云計(jì)算充分利用網(wǎng)絡(luò)和計(jì)算機(jī)技術(shù)實(shí)現(xiàn)資源的共享和服務(wù),解決云進(jìn)化、云控制、云推理和軟計(jì)算等復(fù)雜問(wèn)題,其基礎(chǔ)架構(gòu)可以用云計(jì)算體系結(jié)構(gòu)來(lái)描述,而云計(jì)算的服務(wù)層次則從提供服務(wù)類(lèi)型角度描述云計(jì)算對(duì)應(yīng)提供的功能或服務(wù),云計(jì)算技術(shù)層次從云計(jì)算軟硬件結(jié)合角度說(shuō)明云計(jì)算平臺(tái)的構(gòu)成。在云計(jì)算中,根據(jù)其服務(wù)集合所提供的服務(wù)類(lèi)型,整個(gè)云計(jì)算服務(wù)集合被劃分成4個(gè)層次:應(yīng)用層、平臺(tái)層、基礎(chǔ)設(shè)施層和虛擬化層[9-10]。這4個(gè)層次每一層都對(duì)應(yīng)著一個(gè)子服務(wù)集合。云計(jì)算的服務(wù)層次是根據(jù)服務(wù)類(lèi)型即服務(wù)集合來(lái)劃分,層次是可以分割的,即某一層次可以單獨(dú)完成一項(xiàng)用戶(hù)的請(qǐng)求而不需要其他層次為其提供必要的服務(wù)和支持。應(yīng)用層對(duì)應(yīng)SaaS軟件即服務(wù)如:GoogleAPPS;平臺(tái)層對(duì)應(yīng)PaaS平臺(tái)即服務(wù)如:IBMITFactory、GoogleAPPEngine;基礎(chǔ)設(shè)施層對(duì)應(yīng)IaaS基礎(chǔ)設(shè)施即服務(wù)如:AmazonEC2、IBMBlueCloud、SunGrid;虛擬化層對(duì)應(yīng)硬件即服務(wù)結(jié)合Paas提供硬件服務(wù),包括服務(wù)器集群及硬件檢測(cè)等服務(wù)。云計(jì)算技術(shù)層次和云計(jì)算服務(wù)層次不是一個(gè)概念,后者從服務(wù)的角度來(lái)劃分云的層次,主要突出了云服務(wù)能給我?guī)?lái)什么。而云計(jì)算的技術(shù)層次主要從系統(tǒng)屬性和設(shè)計(jì)思想角度來(lái)說(shuō)明云,是對(duì)軟硬件資源在云計(jì)算技術(shù)中所充當(dāng)角色的說(shuō)明。從云計(jì)算技術(shù)角度來(lái)分,云計(jì)算大約有4部分構(gòu)成:物理資源層、資源池層、管理中間件層和SOA構(gòu)建層,如圖2-1所示[11-12]。其中資源池層和管理中間件層是云計(jì)算技術(shù)的最關(guān)鍵部分。SOA構(gòu)建層:將云計(jì)算能力封裝成標(biāo)準(zhǔn)的webservices服務(wù),并納入到SOA體系進(jìn)行管理和使用,時(shí)用戶(hù)端與云端交互操作的入口,可以完成用戶(hù)或服務(wù)注冊(cè),對(duì)服務(wù)的定制和使用。管理中間件層:在云計(jì)算技術(shù)中,中間件位于服務(wù)和服務(wù)器集群之間,提供管理和服務(wù)即云計(jì)算體系結(jié)構(gòu)中的管理系統(tǒng)。對(duì)標(biāo)識(shí)、認(rèn)證、授權(quán)、目錄、安全性等服務(wù)進(jìn)行標(biāo)準(zhǔn)化和操作,為應(yīng)用提供統(tǒng)一的標(biāo)準(zhǔn)化程序接口和協(xié)議,隱藏底層硬件、操作系統(tǒng)和網(wǎng)絡(luò)的異構(gòu)性,統(tǒng)一管理網(wǎng)絡(luò)資源。其用戶(hù)管理包括用戶(hù)身份驗(yàn)證、用戶(hù)許可、用戶(hù)定制管理;資源管理包括負(fù)載均衡、資源監(jiān)控、故障檢測(cè)等;安全管理包括身份驗(yàn)證、訪問(wèn)授權(quán)、安全審計(jì)、綜合防護(hù)等;映像管理包括映像創(chuàng)建、部署、管理等。圖2-1云計(jì)算技術(shù)層次模型資源池層:將大量相同類(lèi)型的資源構(gòu)成同構(gòu)或接近同構(gòu)的資源池,如計(jì)算池,存儲(chǔ)池和網(wǎng)絡(luò)池、數(shù)據(jù)庫(kù)資源等,構(gòu)建資源池更多的是物理資源的集成和管理工作,通過(guò)軟件技術(shù)來(lái)實(shí)現(xiàn)相關(guān)的虛擬化功能包括虛擬環(huán)境、虛擬系統(tǒng)、虛擬平臺(tái)。物理資源層:主要指能支持計(jì)算機(jī)正常運(yùn)行的一些硬件設(shè)備及技術(shù),可以是價(jià)格低廉的PC,也可以是價(jià)格昂貴的服務(wù)器及磁盤(pán)陣列等設(shè)備,可以通過(guò)現(xiàn)有網(wǎng)絡(luò)技術(shù)和并行技術(shù)、分布式技術(shù)將分散的計(jì)算機(jī)組成一個(gè)能提供超強(qiáng)功能的集群用于計(jì)算和存儲(chǔ)等云計(jì)算操作。在云計(jì)算時(shí)代,本地計(jì)算機(jī)可能不再像傳統(tǒng)計(jì)算機(jī)那樣需要空間足夠的硬盤(pán)、大功率的處理器和大容量的內(nèi)存,只需要一些必要的硬件設(shè)備如網(wǎng)絡(luò)設(shè)備和基本的輸入輸出設(shè)備等。2.1.2Google云計(jì)算體系結(jié)構(gòu)上一節(jié)從服務(wù)和技術(shù)的層次分別提出了云計(jì)算的通用體系結(jié)構(gòu),各大IT廠商的解決方案只實(shí)現(xiàn)了其中的部分功能,接下來(lái)介紹一下Google云計(jì)算平臺(tái)的體系結(jié)構(gòu)。Google最大的IT優(yōu)勢(shì)在于它能夠建造出一套既富于性?xún)r(jià)比而又能承載極高負(fù)載的高性能系統(tǒng)。因此Google認(rèn)為與競(jìng)爭(zhēng)對(duì)手相比,具有更大的成本優(yōu)勢(shì),同時(shí)Google程序員的效率比其他web同行么高出50%~100%,原因是Google應(yīng)經(jīng)開(kāi)發(fā)出了一套專(zhuān)用于大規(guī)模并行系統(tǒng)的軟件庫(kù)。從整體看來(lái),Google的云計(jì)算平臺(tái)包含了如下結(jié)構(gòu)層次[13]:網(wǎng)絡(luò)系統(tǒng):包括內(nèi)部網(wǎng)絡(luò)和外部網(wǎng)絡(luò)。內(nèi)部網(wǎng)絡(luò)是用于連接Google自建的各個(gè)數(shù)據(jù)中心的網(wǎng)絡(luò)系統(tǒng),這一高速的網(wǎng)絡(luò)系統(tǒng)使得Google的每一臺(tái)服務(wù)器連接在一起成為一個(gè)負(fù)載平衡的集群。外部網(wǎng)絡(luò)是指在Google數(shù)據(jù)中心之外,有Google自己搭建的用于不同國(guó)家/地區(qū),不同應(yīng)用之間的數(shù)據(jù)交換網(wǎng)絡(luò)。硬件系統(tǒng):從層次上來(lái)看,包括單個(gè)服務(wù)器、整合了多服務(wù)器的機(jī)架以及存放、連接各服務(wù)器機(jī)架的數(shù)據(jù)中心(IDC)。軟件系統(tǒng):包括每個(gè)服務(wù)器上安裝的單機(jī)操作系統(tǒng)和Google云計(jì)算底層軟件系統(tǒng)(文件系統(tǒng)GFS、并行計(jì)算處理算法MapReduce、并行數(shù)據(jù)庫(kù)BigTable、并行所服務(wù)Chubby和云計(jì)算消息隊(duì)列GWQ)。Google內(nèi)部使用的軟件開(kāi)發(fā)工具,包括C++、Java、Python等。Google發(fā)布的可以使用Python、Java等編程語(yǔ)言調(diào)用云計(jì)算底層軟件系統(tǒng)的PAAS平臺(tái)—GoogleAppEngine。Google自己開(kāi)發(fā)的SAAS類(lèi)型的各項(xiàng)服務(wù),例如GoogleSearch、GoogleGmail、GoogleMap、GoogleEarth等。圖2-2Google云計(jì)算平臺(tái)體系結(jié)構(gòu)2.2Google云計(jì)算平臺(tái)的應(yīng)用領(lǐng)域Google提出了應(yīng)用向互聯(lián)網(wǎng)遷移、數(shù)據(jù)向互聯(lián)網(wǎng)遷移、計(jì)算能力向互聯(lián)網(wǎng)遷移、存儲(chǔ)空間向互聯(lián)網(wǎng)遷移這一云計(jì)算構(gòu)想,甚至在未來(lái)瀏覽器可能代替操作系統(tǒng)的作用,直接使用來(lái)自互聯(lián)網(wǎng)的各種軟件。從Google提供的基于瀏覽器使用的各項(xiàng)服務(wù),到推出ChromeOS網(wǎng)絡(luò)操作系統(tǒng),可以看到其在云計(jì)算戰(zhàn)略中堅(jiān)定的步伐。然而,以桌面操作系統(tǒng)為中心向以服務(wù)器為中心的過(guò)渡必然會(huì)增加服務(wù)器端的計(jì)算和存儲(chǔ)壓力,服務(wù)器端必須有處理海量計(jì)算和存儲(chǔ)的能力才能夠支撐。而Google的云計(jì)算平臺(tái)就具有這種能力,它最直接的應(yīng)用領(lǐng)域便作為基礎(chǔ)設(shè)施來(lái)承載Google提供的搜索、郵件、文檔、地圖等各項(xiàng)互聯(lián)網(wǎng)應(yīng)用。隨著GoogleAppEngine的發(fā)布,不論是簡(jiǎn)單的個(gè)人應(yīng)用還是企業(yè)級(jí)應(yīng)用,都可以構(gòu)建在Google的云計(jì)算平臺(tái)之上。這不僅能讓廣大用戶(hù)體驗(yàn)到云計(jì)算帶來(lái)的低成本優(yōu)勢(shì),而且有利于基于互聯(lián)網(wǎng)的應(yīng)用的繁榮。總的來(lái)說(shuō),Google提供了SAAS和PAAS兩種類(lèi)型的服務(wù),不僅可以提供給用戶(hù)與桌面軟件相同體驗(yàn)的互聯(lián)網(wǎng)應(yīng)用,而且提供了一個(gè)用來(lái)創(chuàng)建互聯(lián)網(wǎng)應(yīng)用的平臺(tái)。在Google云計(jì)算平臺(tái)的強(qiáng)有力支持下,Google的服務(wù)具有廣闊的應(yīng)用空間。3Google云計(jì)算平臺(tái)核心技術(shù)Google擁有全球最強(qiáng)大的搜索引擎。除了搜索業(yè)務(wù)以外,Google還有GoogleMaps、GoogleEarth、Gmail、YouTube等各種業(yè)務(wù),包括剛誕生的GoogleWave[14]。這些應(yīng)用的共性在于數(shù)據(jù)量巨大,而且要面向全球用戶(hù)提供實(shí)時(shí)服務(wù),因此Google必須解決海量數(shù)據(jù)存儲(chǔ)和快速處理問(wèn)題。Google的訣竅在于它發(fā)展出簡(jiǎn)單而又高效的技術(shù),讓多達(dá)百萬(wàn)臺(tái)的廉價(jià)計(jì)算機(jī)協(xié)同工作,共同完成這些前所未有的任務(wù),這些技術(shù)是在誕生幾年之后才被命名為Google云計(jì)算技術(shù)。Google云計(jì)算技術(shù)具體包括:Google文件系統(tǒng)GFS、分布式計(jì)算編程模型MapReduce、分布式鎖服務(wù)Chubby和分布式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)系統(tǒng)Bigtable等。其中,GFS提供了海量數(shù)據(jù)的存儲(chǔ)和訪問(wèn)的能力,MapReduce使得海量信息的并行處理變得簡(jiǎn)單易行,Chubby保證了分布式環(huán)境下并發(fā)操作的同步問(wèn)題,Bigtable使得海量數(shù)據(jù)的管理和組織十分方便。本章將對(duì)這四種核心技術(shù)進(jìn)行詳細(xì)介紹。3.1Google文件系統(tǒng)GFSGoogle文件系統(tǒng)是一個(gè)大型的分布式文件系統(tǒng),它為Google云計(jì)算提供海量存儲(chǔ),并且與Chubby、MapReduce以及Bigtable等技術(shù)結(jié)合十分緊密,處于所有核心技術(shù)的底層。下面先介紹一下分布式文件系統(tǒng)的概念以及GFS與其他已有分布式文件系統(tǒng)的區(qū)別。3.1.1分布式文件系統(tǒng)概述文件系統(tǒng)是操作系統(tǒng)的一個(gè)重要組成部分,通過(guò)對(duì)操作系統(tǒng)所管理的存儲(chǔ)空間的抽象,向用戶(hù)提供統(tǒng)一的、對(duì)象化的訪問(wèn)接口,屏蔽對(duì)物理設(shè)備的直接操作和資源管理。根據(jù)計(jì)算環(huán)境和所提供功能的不同,文件系統(tǒng)可劃分為四個(gè)層次,從低到高依次是:?jiǎn)翁幚砥鲉斡脩?hù)的本地文件系統(tǒng),如DOS的文件系統(tǒng);多處理器單用戶(hù)的本地文件系統(tǒng),如OS/2的文件系統(tǒng);多處理器多用戶(hù)的文件系統(tǒng),如Unix的本地文件系統(tǒng);多處理器多用戶(hù)的分布式文件系統(tǒng)。本地文件系統(tǒng)(LocalFileSystem)是指文件系統(tǒng)管理的物理存儲(chǔ)資源直接連接在本地節(jié)點(diǎn)上,處理器通過(guò)系統(tǒng)總線可以直接訪問(wèn)。分布式文件系統(tǒng)(DistributedFileSystem)是指文件系統(tǒng)管理的物理存儲(chǔ)資源不一定直接連接在本地節(jié)點(diǎn)上,而是通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)與節(jié)點(diǎn)相連。分布式文件系統(tǒng)是目前最高級(jí)的文件系統(tǒng),它將由網(wǎng)絡(luò)連接的各個(gè)存儲(chǔ)節(jié)點(diǎn)抽象成為一個(gè)統(tǒng)一的存儲(chǔ)系統(tǒng),內(nèi)部各個(gè)存儲(chǔ)節(jié)點(diǎn)的管理和協(xié)作等復(fù)雜問(wèn)題均由系統(tǒng)實(shí)現(xiàn),提供了與最基本的本地文件系統(tǒng)幾乎相同的訪問(wèn)接口和對(duì)象模型,大大簡(jiǎn)化了分布式文件系統(tǒng)的使用。正是由于對(duì)用戶(hù)透明地改變了結(jié)構(gòu),滿足用戶(hù)的需求,以掩蓋分布式文件操作的復(fù)雜性,才大大增加了分布式文件系統(tǒng)的實(shí)現(xiàn)難度。3.1.2GFS的設(shè)計(jì)思想和目標(biāo)GFS與過(guò)去的分布式文件系統(tǒng)有很多相同的目標(biāo),但GFS的設(shè)計(jì)受到了當(dāng)前及預(yù)期的應(yīng)用方面的工作量及技術(shù)環(huán)境的驅(qū)動(dòng),這反映了它與早期的文件系統(tǒng)明顯不同的設(shè)想[5]:
1)硬件出錯(cuò)是正常而非異常。因?yàn)槲募到y(tǒng)由成百上千個(gè)用于存儲(chǔ)的機(jī)器構(gòu)成,而這些機(jī)器是由廉價(jià)的普通部件組成并被大量的客戶(hù)機(jī)訪問(wèn)。部件的數(shù)量和質(zhì)量使得一些機(jī)器隨時(shí)都有可能無(wú)法工作并且有一部分還可能無(wú)法恢復(fù)。所以實(shí)時(shí)地監(jiān)控、錯(cuò)誤檢測(cè)、容錯(cuò)、自動(dòng)恢復(fù)對(duì)系統(tǒng)來(lái)說(shuō)必不可少。
2)需要存儲(chǔ)大尺寸的文件。長(zhǎng)度達(dá)幾個(gè)GB的文件是很平常的。每個(gè)文件通常包含很多應(yīng)用對(duì)象。當(dāng)經(jīng)常要處理快速增長(zhǎng)的、包含數(shù)以萬(wàn)計(jì)的對(duì)象、長(zhǎng)度達(dá)TB的數(shù)據(jù)集時(shí),我們很難管理成千上萬(wàn)的KB規(guī)模的文件塊,即使底層文件系統(tǒng)提供支持。因此,設(shè)計(jì)中操作的參數(shù)、塊的大小必須要重新考慮。對(duì)大型的文件的管理一定要能做到高效,對(duì)小型的文件也必須支持,但不必優(yōu)化。
3)大部分文件的更新是通過(guò)添加新數(shù)據(jù)完成的,而不是改變已存在的數(shù)據(jù)。在一個(gè)文件中隨機(jī)的操作在實(shí)踐中幾乎不存在。一旦寫(xiě)完,文件就只可讀,很多數(shù)據(jù)都有這些特性。一些數(shù)據(jù)可能組成一個(gè)大倉(cāng)庫(kù)以供數(shù)據(jù)分析程序掃描。有些是運(yùn)行中的程序連續(xù)產(chǎn)生的數(shù)據(jù)流。有些是檔案性質(zhì)的數(shù)據(jù),有些是在某個(gè)機(jī)器上產(chǎn)生、在另外一個(gè)機(jī)器上處理的中間數(shù)據(jù)。由于這些對(duì)大型文件的訪問(wèn)方式,添加操作成為性能優(yōu)化和原子性保證的焦點(diǎn)。而在客戶(hù)機(jī)中緩存數(shù)據(jù)塊則失去了吸引力。
4)工作量主要由兩種讀操作構(gòu)成:對(duì)大量數(shù)據(jù)的流方式的讀操作和對(duì)少量數(shù)據(jù)的隨機(jī)方式的讀操作。在前一種讀操作中,可能要讀幾百KB,通常達(dá)1MB和更多。來(lái)自同一個(gè)客戶(hù)的連續(xù)操作通常會(huì)讀文件的一個(gè)連續(xù)的區(qū)域。隨機(jī)的讀操作通常在一個(gè)隨機(jī)的偏移處讀幾個(gè)KB。5)工作量還包含許多對(duì)大量數(shù)據(jù)進(jìn)行的、連續(xù)的、向文件添加數(shù)據(jù)的寫(xiě)操作。所寫(xiě)的數(shù)據(jù)的規(guī)模和讀相似。一旦寫(xiě)完,文件很少改動(dòng)。在隨機(jī)位置對(duì)少量數(shù)據(jù)的寫(xiě)操作也支持,但不必非常高效。
6)系統(tǒng)必須高效地實(shí)現(xiàn)定義完好的大量客戶(hù)同時(shí)向同一個(gè)文件的添加操作的語(yǔ)義。3.1.3GFS的特點(diǎn)1)單Master模式[5]:只有一個(gè)Master極大的簡(jiǎn)化了設(shè)計(jì)并使得master可以根據(jù)全局情況作出先進(jìn)的塊放置和復(fù)制決定。但是我們必須要將master對(duì)讀和寫(xiě)的參與減至最少,這樣它才不會(huì)成為系統(tǒng)的瓶頸。Client只從Master讀取文件塊的元數(shù)據(jù)信息,然后知道了要和哪個(gè)ChunkServer聯(lián)系,Client在一段限定的時(shí)間內(nèi)將這些信息緩存,在后續(xù)的操作中Client直接和ChunkServer交互。這樣的設(shè)計(jì)降低了Master的壓力,平衡了負(fù)載。2)塊規(guī)模為64MB[5]:塊規(guī)模是設(shè)計(jì)中的一個(gè)關(guān)鍵參數(shù)。64MB的存儲(chǔ)塊比一般的文件系統(tǒng)的塊規(guī)模要大的多。每個(gè)塊的副本作為一個(gè)普通的Linux文件存儲(chǔ),在需要的時(shí)候可以擴(kuò)展。較大的塊規(guī)模能夠減少Client和Master之間的交互,使Client在一個(gè)給定的塊上很可能執(zhí)行多個(gè)操作,同時(shí)能夠減少M(fèi)aster上保存的元數(shù)據(jù)(metadata)的規(guī)模。3)不緩存文件數(shù)據(jù),緩存元數(shù)據(jù)[5]:對(duì)于存儲(chǔ)在ChunkServer上的文件數(shù)據(jù),由于其本地文件系統(tǒng)能夠提供緩存機(jī)制,而在GFS中實(shí)現(xiàn)緩存受制于ChunkServer不穩(wěn)定所帶來(lái)的復(fù)雜的數(shù)據(jù)一致性問(wèn)題,并沒(méi)有實(shí)現(xiàn)緩存機(jī)制。對(duì)于存儲(chǔ)在Master中的元數(shù)據(jù),GFS采取了緩存策略,GFS中Client發(fā)起的所有操作都需要先經(jīng)過(guò)Master。Master需要對(duì)其元數(shù)據(jù)進(jìn)行頻繁操作,為了提高操作的效率,Master的元數(shù)據(jù)都是直接保存在內(nèi)存中進(jìn)行操作;同時(shí)采用相應(yīng)的壓縮機(jī)制降低元數(shù)據(jù)占用空間的大小,提高內(nèi)存的利用率。3.2并行數(shù)據(jù)處理MapReduceMapReduce是一個(gè)編程模型,是用來(lái)處理和產(chǎn)生大數(shù)據(jù)集的相關(guān)實(shí)現(xiàn)。用戶(hù)指定一個(gè)map函數(shù)處理一個(gè)key/value對(duì),從而產(chǎn)生中間的key/value對(duì)集.然后再指定一個(gè)reduce函數(shù)合并所有的具有相同中間key的中間value集合[6]。MapReduce也是Google開(kāi)發(fā)的一個(gè)并行計(jì)算框架,把分布式的業(yè)務(wù)邏輯從復(fù)雜的細(xì)節(jié)中抽象出來(lái),提供了自動(dòng)的并行化與分布式、容錯(cuò)、I/O調(diào)度以及狀態(tài)監(jiān)控等功能,為并行開(kāi)發(fā)經(jīng)驗(yàn)不足的程序員進(jìn)行并行編程提供了簡(jiǎn)單的接口。3.2.1MapReduce的產(chǎn)生背景Google的使命是整合全球信息,使人人皆可訪問(wèn)并從中受益。所以Google比一般網(wǎng)站更早遭遇了只有分布才能存儲(chǔ)的數(shù)據(jù),這導(dǎo)致了GoogleFileSystem的誕生。緊接著他們遇到的問(wèn)題是怎么才能讓公司所有的程序員都學(xué)會(huì)些分布計(jì)算的程序,因?yàn)樗麄冇肎oogleFileSystem存儲(chǔ)的海量數(shù)據(jù)分析起來(lái)需要的運(yùn)算量也是驚人的。這就催生了MapReduce技術(shù),通過(guò)把海量數(shù)據(jù)集的常見(jiàn)操作抽象為Map和Reduce兩種集合操作,大大簡(jiǎn)化了程序員編寫(xiě)分布計(jì)算程序的難度。與傳統(tǒng)的分布式程序設(shè)計(jì)相比,MapReduce封裝了并行處理、容錯(cuò)處理、本地化計(jì)算、負(fù)載均衡等細(xì)節(jié),還提供了一個(gè)簡(jiǎn)單而強(qiáng)大的接口。通過(guò)這個(gè)接口,可以把大尺度的計(jì)算自動(dòng)地并發(fā)和分布執(zhí)行,從而使編程變得非常容易。還可以通過(guò)由普通PC構(gòu)成的巨大集群來(lái)達(dá)到極高的性能。另外,MapReduce也具有較好的通用性,大量不同的問(wèn)題都可以簡(jiǎn)單地通過(guò)MapReduce來(lái)解決。MapReduce把對(duì)數(shù)據(jù)集的大規(guī)模操作,分發(fā)給一個(gè)主節(jié)點(diǎn)管理下的各分節(jié)點(diǎn)共同完成,通過(guò)這種方式實(shí)現(xiàn)任務(wù)的可靠執(zhí)行與容錯(cuò)機(jī)制。在每個(gè)時(shí)間周期,主節(jié)點(diǎn)都會(huì)對(duì)分節(jié)點(diǎn)的工作狀態(tài)進(jìn)行標(biāo)記,一旦分節(jié)點(diǎn)狀態(tài)標(biāo)記為死亡狀態(tài),則這個(gè)節(jié)點(diǎn)的所有任務(wù)都將分配給其他分節(jié)點(diǎn)重新執(zhí)行。通過(guò)使用MapReduce這種編程模式,保持了服務(wù)器之間的均衡,提高了整體效率。3.2.2MapReduce的編程模型MapReduce模型中,輸入和輸出都是一個(gè)鍵值對(duì)key/value集合。用戶(hù)自定義Map函數(shù),接受一個(gè)輸入對(duì),然后產(chǎn)生一個(gè)中間key/value對(duì)集,所有的Map函數(shù)都可以高度的并行運(yùn)行。隨后MapReduce庫(kù)把所有具有相同中間keyI的中間value聚合在一起,然后把它們傳遞給reduce函數(shù)。用戶(hù)自定義的Reduce函數(shù),接受一個(gè)中間keyI和相關(guān)的一個(gè)value集。它合并這些value,形成一個(gè)比較小的value集。每個(gè)Reduce所處理的Map中間結(jié)果是互不交叉的,所有Reduce產(chǎn)生的最終結(jié)果經(jīng)過(guò)簡(jiǎn)單連接就形成了完整的結(jié)果集,因此Reduce也可以在并行環(huán)境下執(zhí)行。以下用是MapReduce的執(zhí)行過(guò)程[6]:Programmerspecifiestwofunctions:1.map(in_key,in_value)->list(out_key,intermediate_value)Processesinputkey/valuepairProducessetofintermediatepairs2.reduce(out_key,list(intermediate_value))->list(out_value)CombinesallintermediatevaluesforaparticularkeyProducesasetofmergedoutputvalues(usuallyjustone)Map的輸入?yún)?shù)是in_key和in_value,它指明了Map需要處理的原始數(shù)據(jù)是哪些。Map的輸出結(jié)果是一組<key,value>對(duì),這是經(jīng)過(guò)Map操作后所產(chǎn)生的中間結(jié)果。在進(jìn)行Reduce操作之前,系統(tǒng)已經(jīng)將所有Map產(chǎn)生的中間結(jié)果進(jìn)行了歸類(lèi)處理,使得相同key對(duì)應(yīng)的一系列value能夠集結(jié)在一起提供給一個(gè)Reduce進(jìn)行歸并處理,也就是說(shuō),Reduce的輸入?yún)?shù)是(key,[value1,…,valuem])。Reduce的工作是需要對(duì)這些對(duì)應(yīng)相同key的value值進(jìn)行歸并處理,最終形成(key,final_value)的結(jié)果。這樣,一個(gè)Reduce處理了一個(gè)key,所有Reduce的結(jié)果并在一起就是最終結(jié)果。例如,假設(shè)我們想用MapReduce來(lái)計(jì)算一個(gè)大型文本文件中各個(gè)單詞出現(xiàn)的次數(shù),Map的輸入?yún)?shù)指明了需要處理哪部分?jǐn)?shù)據(jù),以<在文本中的起始位置,需要處理的數(shù)據(jù)長(zhǎng)度>表示,經(jīng)過(guò)Map處理,形成一批中間結(jié)果<單詞,出現(xiàn)次數(shù)>。而Reduce函數(shù)則是把中間結(jié)果進(jìn)行處理,將相同單詞出現(xiàn)的次數(shù)進(jìn)行累加,得到每個(gè)單詞總的出現(xiàn)次數(shù)。3.3分布式數(shù)據(jù)庫(kù)BigTable3.3.1BigTable概述Bigtable是Google開(kāi)發(fā)的基于GFS、MapReduce和Chubby的分布式存儲(chǔ)數(shù)據(jù)庫(kù)系統(tǒng),它被設(shè)計(jì)用來(lái)處理海量數(shù)據(jù):通常是分布在數(shù)千臺(tái)普通服務(wù)器上的PB級(jí)的數(shù)據(jù),并且能夠部署到上千臺(tái)機(jī)器上。Bigtable和數(shù)據(jù)庫(kù)很類(lèi)似:它使用了很多數(shù)據(jù)庫(kù)的實(shí)現(xiàn)策略,但是它有不是一個(gè)完全的關(guān)系型數(shù)據(jù)庫(kù),它不支持完整的關(guān)系數(shù)據(jù)模型,而是提供了一個(gè)簡(jiǎn)單的數(shù)據(jù)模型接口,使得數(shù)據(jù)的存儲(chǔ)更加靈活。Google的很多數(shù)據(jù),包括Web索引、衛(wèi)星圖像數(shù)據(jù)等在內(nèi)的海量結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),都是存儲(chǔ)在Bigtable中的。Bigtable已經(jīng)實(shí)現(xiàn)了下面的幾個(gè)目標(biāo):適用性廣泛、可擴(kuò)展、高性能和高可用性[7]。Bigtable已經(jīng)在超過(guò)60個(gè)Google的產(chǎn)品和項(xiàng)目上得到了應(yīng)用,包括GoogleAnalytics、GoogleFinance、Orkut、PersonalizedSearch、Writely和GoogleEarth。這些產(chǎn)品對(duì)Bigtable提出了迥異的需求,有的需要高吞吐量的批處理,有的則需要及時(shí)響應(yīng),快速返回?cái)?shù)據(jù)給最終用戶(hù)。它們使用的Bigtable集群的配置也有很大的差異,有的集群只有幾臺(tái)服務(wù)器,而有的則需要上千臺(tái)服務(wù)器、存儲(chǔ)幾百TB的數(shù)據(jù)。3.3.2BigTable體系結(jié)構(gòu)Bigtable是建立在其它的幾個(gè)Google基礎(chǔ)構(gòu)件上的。BigTable集群通常運(yùn)行在一個(gè)共享的機(jī)器池中,池中的機(jī)器還會(huì)運(yùn)行其它的各種各樣的分布式應(yīng)用程序,BigTable的進(jìn)程經(jīng)常要和其它應(yīng)用的進(jìn)程共享機(jī)器。BigTable使用Google的分布式文件系統(tǒng)(GFS)存儲(chǔ)日志文件和數(shù)據(jù)文件。WorkQueue是一個(gè)分布式的任務(wù)調(diào)度器,它主要被用來(lái)處理分布式系統(tǒng)隊(duì)列分組和任務(wù)調(diào)度。Bigtable的實(shí)際執(zhí)行過(guò)程中,Google的MapReduce也被使用來(lái)改善其性能,不過(guò)需要注意的是這不是實(shí)現(xiàn)Bigtable所必需的[7]。另外,BigTable還依賴(lài)一個(gè)高可用的、序列化的分布式鎖服務(wù)組件—Chubby。Chubby主要有以下幾個(gè)作用[8]:1).選取并保證同一時(shí)間內(nèi)只有一個(gè)主服務(wù)器(MasterServer)。2).獲取子表的位置信息。3).保存Bigtable的模式信息及訪問(wèn)控制列表。Bigtable包括了三個(gè)主要的組件:鏈接到客戶(hù)程序中的庫(kù)、一個(gè)主服務(wù)器和多個(gè)子表服務(wù)器。針對(duì)系統(tǒng)工作負(fù)載的變化情況,BigTable可以動(dòng)態(tài)的向集群中添加(或者刪除)子表服務(wù)器,其基本結(jié)構(gòu)如圖3-1所示[7]。圖3-1Bigtable體系結(jié)構(gòu)一個(gè)BigTable集群存儲(chǔ)了很多表,每個(gè)表包含了一個(gè)子表的集合,而每個(gè)子表包含了某個(gè)范圍內(nèi)的行的所有相關(guān)數(shù)據(jù)。Bigtable中存儲(chǔ)數(shù)據(jù)都是以子表的形式保存在子表服務(wù)器上的,客戶(hù)一般也只和Tablet服務(wù)器進(jìn)行通信。主服務(wù)器主要負(fù)責(zé)以下工作:為子表服務(wù)器分配子表、檢測(cè)新加入的或者過(guò)期失效的子表服務(wù)器、對(duì)子表服務(wù)器進(jìn)行負(fù)載均衡、以及對(duì)保存在GFS上的文件進(jìn)行垃圾收集。除此之外,它還處理對(duì)模式的相關(guān)修改操作,例如建立表和列族。Bigtable中主服務(wù)器對(duì)子表服務(wù)器的監(jiān)控是通過(guò)Chubby來(lái)完成的,子表服務(wù)器在初始化時(shí)都會(huì)從Chubby中得到一個(gè)獨(dú)占鎖。通過(guò)這種方式所有的子表服務(wù)器基本信息被保存在Chubby中一個(gè)稱(chēng)為服務(wù)器目錄(ServerDirectory)的特殊目錄之中。主服務(wù)器通過(guò)檢測(cè)這個(gè)目錄就可以隨時(shí)獲取最新的子表服務(wù)器信息,包括目前活躍的子表服務(wù)器,以及每個(gè)子表服務(wù)器上現(xiàn)已分配的子表。每個(gè)子表服務(wù)器都管理一個(gè)子表的集合(通常每個(gè)服務(wù)器有大約數(shù)十個(gè)至上千個(gè)子表)。每個(gè)子表服務(wù)器負(fù)責(zé)處理它所加載的子表的定位、分配和讀寫(xiě)操作,以及在子表過(guò)大時(shí)對(duì)其進(jìn)行分割。子表實(shí)際上存儲(chǔ)的是包含了某個(gè)范圍內(nèi)的行的所有相關(guān)數(shù)據(jù),而子表又是以SStable作為基本的存儲(chǔ)單元,由多個(gè)SStable共同組成的,SSTable是Google為Bigtable設(shè)計(jì)的內(nèi)部數(shù)據(jù)存儲(chǔ)格式。所有的SSTable文件都是存儲(chǔ)在GFS上的,用戶(hù)可以通過(guò)鍵來(lái)查詢(xún)相應(yīng)的值。一個(gè)子表服務(wù)器上所有子表都共享一個(gè)日志文件。由于BigTable中的數(shù)據(jù)都是以子表的形式存儲(chǔ)在各個(gè)子表服務(wù)器上的,所以子表的尋址成為了BigTable系統(tǒng)的關(guān)鍵問(wèn)題。Google使用了一個(gè)三層的、類(lèi)似B+樹(shù)[10]的結(jié)構(gòu)存儲(chǔ)Tablet的位置信息。如圖3-2所示:圖3-2子表地址結(jié)構(gòu)所有的子表地址都被記錄在元數(shù)據(jù)表中,元數(shù)據(jù)表也是由一個(gè)個(gè)的元數(shù)據(jù)子表(Metadatatablet)組成的。第一層是存儲(chǔ)在Chubby中的根子表,它是元數(shù)據(jù)表中的第一個(gè)元數(shù)據(jù)子表,存儲(chǔ)了其他元數(shù)據(jù)子表的地址;第二層是根子表指向的其他元數(shù)據(jù)子表,表中每個(gè)子表的位置信息都存放在一個(gè)行關(guān)鍵字下面,而這個(gè)行關(guān)鍵字是由子表所在的表的標(biāo)識(shí)符和子表的最后一行編碼而成的。第三層便是所有用戶(hù)子表。為了減少訪問(wèn)開(kāi)銷(xiāo),提高客戶(hù)訪問(wèn)效率,Bigtable使用了緩存(Cache)和預(yù)取(Prefetch)技術(shù),這兩種技術(shù)手段在體系結(jié)構(gòu)設(shè)計(jì)中是很常用的。子表的地址信息被緩存在客戶(hù)端,客戶(hù)在尋址時(shí)直接根據(jù)緩存信息進(jìn)行查找。一旦出現(xiàn)緩存為空或緩存信息過(guò)時(shí)的情況,客戶(hù)端就需要按照?qǐng)D3-5所示方式進(jìn)行網(wǎng)絡(luò)的來(lái)回通信(NetworkRound-trips)進(jìn)行尋址,在緩存為空的情況下需要三個(gè)網(wǎng)絡(luò)來(lái)回通信。如果緩存的信息是過(guò)時(shí)的,則需要六個(gè)網(wǎng)絡(luò)來(lái)回通信。其中三個(gè)用來(lái)確定信息是過(guò)時(shí)的,另外三個(gè)獲取新的地址。預(yù)取則是在每次訪問(wèn)元數(shù)據(jù)表時(shí)不僅僅讀取所需的子表元數(shù)據(jù),而是讀取多個(gè)子表的元數(shù)據(jù),這樣下次需要時(shí)就不用再次訪問(wèn)元數(shù)據(jù)表。4GoogleAppEngine測(cè)試程序分析與設(shè)計(jì)4.1測(cè)試程序需求分析為了測(cè)試Google云計(jì)算平臺(tái)提供的各項(xiàng)服務(wù)的使用以及性能,我編寫(xiě)了一個(gè)簡(jiǎn)單的博客系統(tǒng)。如圖4-1的系統(tǒng)功能結(jié)構(gòu)圖所示,本系統(tǒng)主要由三個(gè)模塊構(gòu)成:圖4-1系統(tǒng)功能結(jié)構(gòu)圖博客的發(fā)布和瀏覽模塊。該模塊測(cè)試了Google的數(shù)據(jù)存儲(chǔ)服務(wù),使用了JPA來(lái)完成對(duì)博客的增加和查詢(xún)。用戶(hù)的登錄和資料管理模塊:該模塊測(cè)試Google的賬戶(hù)服務(wù)、用于大文件的BlobStore服務(wù)、圖片處理服務(wù)和GoogleMap服務(wù)。實(shí)現(xiàn)了用戶(hù)資料增加和刪除、頭像的調(diào)整以及用戶(hù)的定位。電子郵件發(fā)送模塊:該模塊測(cè)試了Google的電子郵件服務(wù),實(shí)現(xiàn)了能夠通過(guò)登錄用戶(hù)的電子郵件地址發(fā)送郵件的功能。本系統(tǒng)還實(shí)現(xiàn)了能夠?qū)⒉┛偷牟樵?xún)時(shí)間統(tǒng)計(jì)到日志的功能,能夠簡(jiǎn)單的分析一下GAE存儲(chǔ)服務(wù)的性能。此外,程序運(yùn)行過(guò)程中產(chǎn)生的錯(cuò)誤也會(huì)被記錄到日志中。4.2測(cè)試程序運(yùn)行環(huán)境分析4.2.1GoogleAppEngine概述AppEngine是在Google的基礎(chǔ)架構(gòu)上構(gòu)建和運(yùn)行網(wǎng)絡(luò)應(yīng)用程序的平臺(tái),提供了使用Google基礎(chǔ)服務(wù)的編程結(jié)構(gòu)。AppEngine應(yīng)用程序易于構(gòu)建和維護(hù),開(kāi)始使用AppEngine是免費(fèi)的。所有應(yīng)用程序都可以使用500MB的存儲(chǔ)空間,以及可支持每月約500萬(wàn)頁(yè)面瀏覽量的足夠的CPU和帶寬,并可根據(jù)您的訪問(wèn)量和數(shù)據(jù)存儲(chǔ)需要的增長(zhǎng)輕松擴(kuò)展。為您的應(yīng)用程序啟用付費(fèi)后,您的免費(fèi)配額將提高,您只需為使用的超過(guò)免費(fèi)水平的資源付費(fèi)[15]。AppEngine平臺(tái)實(shí)現(xiàn)了資源的按需分配,AppEngine平臺(tái)會(huì)監(jiān)控資源的使用情況,根據(jù)資源的使用量來(lái)收取費(fèi)用。4.2.2Google軟件基礎(chǔ)設(shè)施分析AppEngine構(gòu)建在Google云計(jì)算平臺(tái)基礎(chǔ)設(shè)施之上,這個(gè)基礎(chǔ)設(shè)施由硬件和軟件組成。硬件就是Google全球的數(shù)據(jù)中心里上百萬(wàn)臺(tái)的X86服務(wù)器和連接它們的網(wǎng)絡(luò)系統(tǒng),軟件是Google云計(jì)算平臺(tái)的核心,用來(lái)管理這龐大的硬件設(shè)施提供的計(jì)算能力和存儲(chǔ)能力,使它們成為一個(gè)整體來(lái)提供強(qiáng)大的計(jì)算和海量的存儲(chǔ)。文件系統(tǒng)分析文件系統(tǒng)是一個(gè)操作系統(tǒng)和平臺(tái)必不可少的組件,是用來(lái)存儲(chǔ)數(shù)據(jù)的工具,Google云計(jì)算平臺(tái)的文件系統(tǒng)是GFS,與一般操作系統(tǒng)的本地文件系統(tǒng)(LocalFileSystem)將物理存儲(chǔ)資源直接連接在本地節(jié)點(diǎn)上的方式不同,GFS管理的物理存儲(chǔ)資源不一定直接連接在本地節(jié)點(diǎn)上,而是通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)與節(jié)點(diǎn)相連。分布式文件系統(tǒng)的是目前最高級(jí)的文件系統(tǒng),它將由網(wǎng)絡(luò)連接的各個(gè)存儲(chǔ)節(jié)點(diǎn)抽象成為一個(gè)統(tǒng)一的存儲(chǔ)系統(tǒng),內(nèi)部各個(gè)存儲(chǔ)節(jié)點(diǎn)的管理和協(xié)作等復(fù)雜問(wèn)題均由系統(tǒng)實(shí)現(xiàn),提供了與最基本的本地文件系統(tǒng)幾乎相同的訪問(wèn)接口和對(duì)象模型,大大簡(jiǎn)化了分布式文件系統(tǒng)的使用。GFS是一個(gè)分布式文件系統(tǒng),但是與已有的其他分布式文件系統(tǒng)采用高性能磁盤(pán)陣列來(lái)實(shí)現(xiàn)節(jié)點(diǎn)容錯(cuò)不同[16],GFS完全采用軟件的方法來(lái)實(shí)現(xiàn)容錯(cuò),這大大節(jié)省了存儲(chǔ)的成本,但是在功能上完全可以滿足需求。下面就來(lái)介紹一下GFS的系統(tǒng)結(jié)構(gòu),了解數(shù)據(jù)在Google云計(jì)算平臺(tái)中的存儲(chǔ)方式。GFS的系統(tǒng)架構(gòu)如圖4-2所示[5]。GFS將整個(gè)系統(tǒng)的節(jié)點(diǎn)分為三類(lèi)角色:Client(客戶(hù)端)、Master(主服務(wù)器)和ChunkServer(數(shù)據(jù)塊服務(wù)器)。Master和chunkserver通常是運(yùn)行用戶(hù)層服務(wù)進(jìn)程的Linux機(jī)器。ChunkServer將塊(塊默認(rèn)大小為64M)當(dāng)作Linux文件存儲(chǔ)在本地磁盤(pán)并可以讀和寫(xiě)由chunk-h(huán)andle和位區(qū)間指定的數(shù)據(jù)。出于可靠性考慮,每一個(gè)塊被復(fù)制到多個(gè)ChunkServer上。默認(rèn)情況下,保存3個(gè)副本,但這可以由用戶(hù)指定。Master維護(hù)文件系統(tǒng)所以的元數(shù)據(jù)(metadata),包括名字空間、訪問(wèn)控制信息、從文件到塊的映射以及塊的當(dāng)前位置。它也控制系統(tǒng)范圍的活動(dòng),如塊租約(lease)管理,孤兒塊的垃圾收集,ChunkServer間的塊遷移。Master定期通過(guò)心跳消息與每一個(gè)ChunkServer通信,給ChunkServer傳遞指令并收集它的狀態(tài)。Client是GFS提供給應(yīng)用程序的訪問(wèn)接口,它是一組專(zhuān)用接口,不遵守POSIX規(guī)范,以庫(kù)文件的形式提供。Client與master和ChunkServer通信以代表應(yīng)用程序讀和寫(xiě)數(shù)據(jù)。客戶(hù)與Master的交換只限于對(duì)元數(shù)據(jù)(metadata)的操作,所有數(shù)據(jù)方面的通信都直接和chunkserver聯(lián)系。圖4-2GFS體系結(jié)構(gòu)客戶(hù)端在訪問(wèn)GFS時(shí),首先訪問(wèn)Master節(jié)點(diǎn),獲取將要與之進(jìn)行交互的ChunkServer信息,然后直接訪問(wèn)這些ChunkServer完成數(shù)據(jù)存取。GFS的這種設(shè)計(jì)方法實(shí)現(xiàn)了控制流和數(shù)據(jù)流的分離。Client與Master之間只有控制流,而無(wú)數(shù)據(jù)流,這樣就極大地降低了Master的負(fù)載,使之不成為系統(tǒng)性能的一個(gè)瓶頸。Client與ChunkServer之間直接傳輸數(shù)據(jù)流,同時(shí)由于文件被分成多個(gè)Chunk進(jìn)行分布式存儲(chǔ),Client可以同時(shí)訪問(wèn)多個(gè)ChunkServer,從而使得整個(gè)系統(tǒng)I/O高度并行,系統(tǒng)整體性能得到提高。計(jì)算模型分析單機(jī)操作系統(tǒng)的計(jì)算是以線程為單位進(jìn)行的,多個(gè)線程輪流的占用cpu時(shí)間來(lái)處理數(shù)據(jù),在同一個(gè)進(jìn)程中的線程可以共享數(shù)據(jù)。而Google云計(jì)算平臺(tái)需要利用的是大量的服務(wù)器,其提出的MapReduce計(jì)算模型可以讓多個(gè)單機(jī)操作系統(tǒng)協(xié)同計(jì)算,將并行化程度從線程提升到了操作系統(tǒng),一個(gè)計(jì)算是通過(guò)多個(gè)操作系統(tǒng)的多個(gè)線程來(lái)完成的,其計(jì)算能力得到了顯著的提升。同時(shí),MapReduce也需要GFS的配合來(lái)存儲(chǔ)輸入數(shù)據(jù)、中間數(shù)據(jù)和輸出數(shù)據(jù)。下面就來(lái)介紹一下MapReduce在Google云計(jì)算平臺(tái)中的運(yùn)行過(guò)程。Google內(nèi)部廣泛使用的運(yùn)算環(huán)境的實(shí)現(xiàn):用以太網(wǎng)交換機(jī)連接、由普通PC機(jī)組成的大型集群。在我們的環(huán)境里包括:1)x86架構(gòu)、運(yùn)行Linux操作系統(tǒng)、雙處理器、2-4GB內(nèi)存的機(jī)器。2)普通的網(wǎng)絡(luò)硬件設(shè)備,每個(gè)機(jī)器的帶寬為百兆或者千兆,但是遠(yuǎn)小于網(wǎng)絡(luò)的平均帶寬的一半。
3)集群中包含成百上千的機(jī)器,因此,機(jī)器故障是常態(tài)。4)存儲(chǔ)為廉價(jià)的內(nèi)置IDE硬盤(pán)。一個(gè)內(nèi)部分布式文件系統(tǒng)用來(lái)管理存儲(chǔ)在這些磁盤(pán)上的數(shù)據(jù)。文件系統(tǒng)通過(guò)數(shù)據(jù)復(fù)制來(lái)在不可靠的硬件上保證數(shù)據(jù)的可靠性和有效性。5)用戶(hù)提交工作(job)給調(diào)度系統(tǒng)。每個(gè)工作(job)都包含一系列的任務(wù)(task),調(diào)度系統(tǒng)將這些任務(wù)調(diào)度到集群中多臺(tái)可用的機(jī)器上。執(zhí)行過(guò)程:通過(guò)將Map調(diào)用的輸入數(shù)據(jù)自動(dòng)分割為M個(gè)數(shù)據(jù)片段的集合,Map調(diào)用被分布到多臺(tái)機(jī)器上執(zhí)行。輸入的數(shù)據(jù)片段能夠在不同的機(jī)器上并行處理。使用分區(qū)函數(shù)將Map調(diào)用產(chǎn)生的中間key值分成R個(gè)不同分區(qū)(例如,hash(key)modR),Reduce調(diào)用也被分布到多臺(tái)機(jī)器上執(zhí)行。分區(qū)數(shù)量(R)和分區(qū)函數(shù)由用戶(hù)來(lái)指定。圖4-3MapReduce計(jì)算執(zhí)行過(guò)程圖4-3展示了我們的MapReduce實(shí)現(xiàn)中操作的全部流程[6]。當(dāng)用戶(hù)調(diào)用MapReduce函數(shù)時(shí),將發(fā)生下面的一系列動(dòng)作(下面的序號(hào)和圖中的序號(hào)一一對(duì)應(yīng)):1)用戶(hù)程序首先調(diào)用的MapReduce庫(kù)將輸入文件分成M個(gè)數(shù)據(jù)片度,每個(gè)數(shù)據(jù)片段的大小一般從16MB到64MB(可以通過(guò)可選的參數(shù)來(lái)控制每個(gè)數(shù)據(jù)片段的大小)。然后用戶(hù)程序在集群中創(chuàng)建大量的程序副本。
2)這些程序副本中的有一個(gè)特殊的程序–Master。副本中其它的程序都是Worker程序,由Master分配任務(wù)。有M個(gè)Map任務(wù)和R個(gè)Reduce任務(wù)將被分配,Master將一個(gè)Map任務(wù)或Reduce任務(wù)分配給一個(gè)空閑的Worker。3)被分配了map任務(wù)的worker程序讀取相關(guān)的輸入數(shù)據(jù)片段,從輸入的數(shù)據(jù)片段中解析出key/valuepair,然后把key/valuepair傳遞給用戶(hù)自定義的Map函數(shù),由Map函數(shù)生成并輸出的中間key/valuepair,并緩存在內(nèi)存中。4)緩存中的key/valuepair通過(guò)分區(qū)函數(shù)分成R個(gè)區(qū)域,之后周期性的寫(xiě)入到本地磁盤(pán)上。緩存的key/valuepair在本地磁盤(pán)上的存儲(chǔ)位置將被回傳給Master,由Master負(fù)責(zé)把這些存儲(chǔ)位置再傳送給ReduceWorker。5)當(dāng)ReduceWorker程序接收到Master程序發(fā)來(lái)的數(shù)據(jù)存儲(chǔ)位置信息后,使用RPC從MapWorker所在主機(jī)的磁盤(pán)上讀取這些緩存數(shù)據(jù)。當(dāng)ReduceWorker讀取了所有的中間數(shù)據(jù)后,通過(guò)對(duì)key進(jìn)行排序后使得具有相同key值的數(shù)據(jù)聚合在一起。由于許多不同的key值會(huì)映射到相同的Reduce任務(wù)上,因此必須進(jìn)行排序。如果中間數(shù)據(jù)太大無(wú)法在內(nèi)存中完成排序,那么就要在外部進(jìn)行排序。6)ReduceWorker程序遍歷排序后的中間數(shù)據(jù),對(duì)于每一個(gè)唯一的中間key值,ReduceWorker程序?qū)⑦@個(gè)key值和它相關(guān)的中間value值的集合傳遞給用戶(hù)自定義的Reduce函數(shù)。Reduce函數(shù)的輸出被追加到所屬分區(qū)的輸出文件。7)當(dāng)所有的Map和Reduce任務(wù)都完成之后,Master喚醒用戶(hù)程序。在這個(gè)時(shí)候,在用戶(hù)程序里的對(duì)MapReduce調(diào)用才返回。
在成功完成任務(wù)之后,MapReduce的輸出存放在R個(gè)輸出文件中(對(duì)應(yīng)每個(gè)Reduce任務(wù)產(chǎn)生一個(gè)輸出文件,文件名由用戶(hù)指定)。一般情況下,用戶(hù)不需要將這R個(gè)輸出文件合并成一個(gè)文件–他們經(jīng)常把這些文件作為另外一個(gè)MapReduce的輸入,或者在另外一個(gè)可以處理多個(gè)分割文件的分布式應(yīng)用中使用。GFS和MapReduce配合使用,再加上Chubby鎖服務(wù)、GWQ消息隊(duì)列等技術(shù)的輔助,Google云計(jì)算平臺(tái)才能夠?qū)崿F(xiàn)海量數(shù)據(jù)的存儲(chǔ)和處理,為上層應(yīng)用程序提供有力的支撐。4.2.3AppEngine應(yīng)用程序環(huán)境和沙盒通過(guò)GoogleAppEngine,即使在負(fù)載很重和數(shù)據(jù)量極大的情況下,也可以輕松構(gòu)建能安全運(yùn)行的應(yīng)用程序。AppEngine包括以下功能:1).動(dòng)態(tài)網(wǎng)絡(luò)服務(wù),提供對(duì)常用網(wǎng)絡(luò)技術(shù)的完全支持。2).持久存儲(chǔ)空間,支持查詢(xún)、分類(lèi)和事務(wù)。3).自動(dòng)擴(kuò)展和負(fù)載平衡。4).用于對(duì)用戶(hù)進(jìn)行身份驗(yàn)證和使用Google帳戶(hù)發(fā)送電子郵件的API。5).一種功能完整的本地開(kāi)發(fā)環(huán)境,可以在您的計(jì)算機(jī)上模擬GoogleAppEngine。6).用于在指定時(shí)間和定期觸發(fā)事件的計(jì)劃任務(wù)。本次測(cè)試以應(yīng)用程序使用java語(yǔ)言編寫(xiě),下面介紹一下java語(yǔ)言的運(yùn)行時(shí)環(huán)境和沙盒限制。AppEngine使用Java6虛擬機(jī)(JVM)來(lái)運(yùn)行Java應(yīng)用程序。AppEngineSDK支持Java5及更高版本,該環(huán)境包括JavaSE運(yùn)行時(shí)環(huán)境(JRE)6平臺(tái)和庫(kù)。出于服務(wù)和安全原因,JVM在安全的“沙盒”環(huán)境中運(yùn)行以隔離不同的應(yīng)用程序。沙盒確保了應(yīng)用程序僅執(zhí)行不影響其他應(yīng)用程序的性能和可伸縮性的操作。沙盒限制了應(yīng)用程序不得進(jìn)行一下操作:1.向文件系統(tǒng)寫(xiě)入;2.打開(kāi)套接字或直接訪問(wèn)另一主機(jī);3.產(chǎn)生子進(jìn)程或線程。可以在JVM使用的更多類(lèi)可以參考AppEngineJRE白名單。AppEngine對(duì)網(wǎng)絡(luò)應(yīng)用程序使用JavaServlet標(biāo)準(zhǔn)。您以標(biāo)準(zhǔn)WAR目錄結(jié)構(gòu)提供應(yīng)用程序的servlet類(lèi)、JavaServerPages(JSP)、靜態(tài)文件和數(shù)據(jù)文件以及部署描述符(web.xml文件)和其他配置文件。我們也可以在應(yīng)用程序中使用JavaWeb編程中的常用框架,但是像Hibernate這樣面向關(guān)系型數(shù)據(jù)庫(kù)的持久層框架不可以使用。其他框架中在沙沙盒限制范圍的功能將不能使用。4.3AppEngine測(cè)試程序設(shè)計(jì)4.3.1測(cè)試程序概要設(shè)計(jì)本系統(tǒng)采用了分層的架構(gòu)來(lái)設(shè)計(jì),整個(gè)系統(tǒng)可以分為模型層、服務(wù)層和web展示層。分層的架構(gòu)能夠降低系統(tǒng)各個(gè)組件之間的耦合度,提高了程序的可讀性和可測(cè)試性,圖4-4展示了本系統(tǒng)的架構(gòu)設(shè)計(jì)。圖4-4系統(tǒng)架構(gòu)設(shè)計(jì)圖模型層設(shè)計(jì)模型層是由可持久化到Google數(shù)據(jù)存儲(chǔ)區(qū)的實(shí)體類(lèi)組成。這些實(shí)體類(lèi)最終存儲(chǔ)在Google的BigTable中,BigTable是構(gòu)建在GFS和MapReduce上的一個(gè)多維分布式數(shù)據(jù)庫(kù),與關(guān)系模型相比,BigTable的數(shù)據(jù)模型維度更多,能夠存儲(chǔ)的信息更多,組織方式更加靈活。Bigtable是一個(gè)多維度排序Map。Map的索引是行關(guān)鍵字、列關(guān)鍵字以及時(shí)間戳;Map中的每個(gè)value都是一個(gè)未經(jīng)解析的byte數(shù)組[7]。與關(guān)系型數(shù)據(jù)庫(kù)采用二維模型不同,BigTable是具有行關(guān)鍵字、列族、列關(guān)鍵字和時(shí)間戳的多維模型,提高了存儲(chǔ)的靈活性,同時(shí)能夠存儲(chǔ)數(shù)據(jù)的多個(gè)版本。行:表中的行關(guān)鍵字可以是任意的字符串。對(duì)同一個(gè)行關(guān)鍵字的讀或者寫(xiě)操作都是原子的(不管讀或者寫(xiě)這一行里多少個(gè)不同列),這個(gè)設(shè)計(jì)決策能夠使用戶(hù)很容易的理解程序在對(duì)同一個(gè)行進(jìn)行并發(fā)更新操作時(shí)的行為。Bigtable通過(guò)行關(guān)鍵字的字典順序來(lái)組織數(shù)據(jù)。表中的每個(gè)行都可以動(dòng)態(tài)分區(qū)。每個(gè)分區(qū)叫做一個(gè)”Tablet”,Tablet是數(shù)據(jù)分布和負(fù)載均衡調(diào)整的最小單位。這樣做的結(jié)果是,當(dāng)操作只讀取行中很少幾列的數(shù)據(jù)時(shí)效率很高,通常只需要很少幾次機(jī)器間的通信即可完成。用戶(hù)可以通過(guò)選擇合適的行關(guān)鍵字,在數(shù)據(jù)訪問(wèn)時(shí)有效利用數(shù)據(jù)的位置相關(guān)性,從而更好的利用這個(gè)特性。列族:列關(guān)鍵字組成的集合叫做“列族“,列族是訪問(wèn)控制的基本單位。存放在同一列族下的所有數(shù)據(jù)通常都屬于同一個(gè)類(lèi)型(我們可以把同一個(gè)列族下的數(shù)據(jù)壓縮在一起)。列族在使用之前必須先創(chuàng)建,然后才能在列族中任何的列關(guān)鍵字下存放數(shù)據(jù);列族創(chuàng)建后,其中的任何一個(gè)列關(guān)鍵字下都可以存放數(shù)據(jù)。根據(jù)我們的設(shè)計(jì)意圖,一張表中的列族不能太多(最多幾百個(gè)),并且列族在運(yùn)行期間很少改變。與之相對(duì)應(yīng)的,一張表可以有無(wú)限多個(gè)列。訪問(wèn)控制、磁盤(pán)和內(nèi)存的使用統(tǒng)計(jì)都是在列族層面進(jìn)行的。時(shí)間戳:在Bigtable中,表的每一個(gè)數(shù)據(jù)項(xiàng)都可以包含同一份數(shù)據(jù)的不同版本;不同版本的數(shù)據(jù)通過(guò)時(shí)間戳來(lái)索引。Bigtable時(shí)間戳的類(lèi)型是64位整型。Bigtable可以給時(shí)間戳賦值,用來(lái)表示精確到毫秒的“實(shí)時(shí)”時(shí)間;用戶(hù)程序也可以給時(shí)間戳賦值。如果應(yīng)用程序需要避免數(shù)據(jù)版本沖突,那么它必須自己生成具有唯一性的時(shí)間戳。數(shù)據(jù)項(xiàng)中,不同版本的數(shù)據(jù)按照時(shí)間戳倒序排序,即最新的數(shù)據(jù)排在最前面。Google數(shù)據(jù)存儲(chǔ)區(qū)以BigTable作為基礎(chǔ),封裝了BigTable與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別,為用戶(hù)提供了一個(gè)類(lèi)似關(guān)系數(shù)據(jù)庫(kù)的簡(jiǎn)單接口來(lái)使用Google的BigTable,但是在實(shí)體類(lèi)的主鍵、實(shí)體類(lèi)間關(guān)系的配置問(wèn)題上還是以Google的數(shù)據(jù)模型為依據(jù)來(lái)考慮。服務(wù)層設(shè)計(jì)服務(wù)層依賴(lài)于GAE提供的各種服務(wù),依據(jù)設(shè)計(jì)模式中的門(mén)面模式,根據(jù)服務(wù)的類(lèi)別設(shè)計(jì)了適合本測(cè)試程序使用的服務(wù)類(lèi),例如博客服務(wù)類(lèi)使用JPA接口操作Google數(shù)據(jù)存儲(chǔ)區(qū),具有增刪改查博客的功能,圖像服務(wù)類(lèi)使用Google的圖像處理服務(wù)ImagesService,具有調(diào)整、翻轉(zhuǎn)、旋轉(zhuǎn)、裁剪圖像的功能。web控制層設(shè)計(jì)Web控制層是由多個(gè)Servlet構(gòu)成,根據(jù)請(qǐng)求中攜帶的控制參數(shù)判斷執(zhí)行流程,調(diào)用服務(wù)層的服務(wù)類(lèi)進(jìn)行數(shù)據(jù)處理,根據(jù)數(shù)據(jù)處理結(jié)果返回相應(yīng)頁(yè)面。web控制層是用戶(hù)界面和服務(wù)層的橋梁,是測(cè)試程序的控制器。4.3.2測(cè)試程序詳細(xì)設(shè)計(jì)概要設(shè)計(jì)在橫向上對(duì)測(cè)試程序的層次有了明確的劃分,并且確定了各個(gè)層次間的依賴(lài)關(guān)系,下面在縱向上以模塊為單位進(jìn)行類(lèi)的詳細(xì)設(shè)計(jì)。模塊是跨越了應(yīng)用程序的各個(gè)層次,組合了各個(gè)層次的相關(guān)類(lèi)從而能提供獨(dú)立功能的組件,根據(jù)需求分析的結(jié)果,測(cè)試程序分為三個(gè)模塊,一下就是這三個(gè)模塊的詳細(xì)類(lèi)設(shè)計(jì)。博客的發(fā)布和瀏覽模塊該模塊主要包括:存儲(chǔ)博客信息的Blog實(shí)體類(lèi),它存儲(chǔ)了Google提供的User對(duì)象來(lái)與用戶(hù)建立無(wú)主的關(guān)系;用戶(hù)獲取Google數(shù)據(jù)存儲(chǔ)區(qū)連接的EMF工具類(lèi);對(duì)博客實(shí)體類(lèi)進(jìn)行增刪改查的BlogService類(lèi);控制博客處理流程的BlogServlet類(lèi)。圖4-5博客模塊類(lèi)圖用戶(hù)資料管理模塊該模塊包括:用來(lái)存儲(chǔ)用戶(hù)資料的實(shí)體類(lèi)AccountInfo,它以用戶(hù)的郵件地址作為主鍵,依次與用戶(hù)建立關(guān)聯(lián);對(duì)用戶(hù)資料實(shí)體進(jìn)行增刪改查的AccountService類(lèi);控制用戶(hù)資料處理流程的AccountServlet類(lèi),它使用了Google提供的blobStore服務(wù)來(lái)完成頭像的上傳;操作用戶(hù)頭像變化的ImageService類(lèi);控制用戶(hù)的頭像顯示和頭像轉(zhuǎn)變流程的logoServlet類(lèi)。圖4-6用戶(hù)資料管理模塊類(lèi)圖郵件模塊該模塊包括:能夠發(fā)送普通文本郵件和多部分郵件的MyMailService類(lèi);處理發(fā)送郵件表單并返回相應(yīng)結(jié)果的MailServlet類(lèi)。圖4-7郵件發(fā)送模塊類(lèi)圖對(duì)測(cè)試程序進(jìn)行概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)之后,對(duì)測(cè)試程序的結(jié)構(gòu)和各模塊的組成有了總體的認(rèn)識(shí),接下來(lái)的工作就是參照測(cè)試程序的設(shè)計(jì)來(lái)實(shí)現(xiàn)功能。5GoogleAppEngine測(cè)試程序?qū)崿F(xiàn)5.1開(kāi)發(fā)環(huán)境Google提供了AppEngineSdk開(kāi)發(fā)包,能夠在本地計(jì)算機(jī)上模擬GAE提供的各項(xiàng)服務(wù),其中包括:用于調(diào)試程序的一個(gè)內(nèi)嵌的Jetty服務(wù)器,用于上傳應(yīng)用程序到GAE的工具,本地開(kāi)發(fā)依賴(lài)的jar包及其doc文檔,還有一些實(shí)例供參考。測(cè)試程序的開(kāi)發(fā)和調(diào)試是在Eclipse集成環(huán)境中完成,通過(guò)使用Google的Eclipse插件,可以方便的建立、調(diào)試以及上傳GAE項(xiàng)目。5.2應(yīng)用程序配置AppEngine使用若干配置文件來(lái)控制網(wǎng)絡(luò)服務(wù)器運(yùn)行應(yīng)用程序的方式、應(yīng)用程序的上傳方式、構(gòu)建數(shù)據(jù)存儲(chǔ)區(qū)索引的方式以及執(zhí)行計(jì)劃任務(wù)的方式。Java網(wǎng)絡(luò)應(yīng)用程序使用部署描述符文件來(lái)配置應(yīng)用程序的行為。此文件名為web.xml,且位于應(yīng)用程序的WAR中的WEB-INF/目錄中。web.xml是網(wǎng)絡(luò)應(yīng)用程序的servlet標(biāo)準(zhǔn)的一部分。在測(cè)試程序中,配置的內(nèi)容為:Servlet和url的映射,字符編碼過(guò)濾器和需要過(guò)濾url的映射,網(wǎng)址的安裝約束配置(既配置只有登錄用戶(hù)能夠訪問(wèn)的頁(yè)面)。AppEngineJava應(yīng)用程序使用名為appengine-web.xml的配置文件來(lái)指定應(yīng)用程序的注冊(cè)應(yīng)用程序ID以及最新代碼的版本標(biāo)識(shí)符,并確定在應(yīng)用程序的WAR中哪些文件是靜態(tài)文件,哪些是應(yīng)用程序使用的資源文件。當(dāng)您上傳應(yīng)用程序時(shí),AppCfg命令將使用這些信息。測(cè)試程序中配置了應(yīng)用程序的ID以及最新代碼版本。AppEngine數(shù)據(jù)存儲(chǔ)區(qū)對(duì)您的應(yīng)用程序進(jìn)行的每個(gè)查詢(xún)都將使用索引。每當(dāng)實(shí)體更改時(shí),這些索引將更新,以便在應(yīng)用程序進(jìn)行查詢(xún)時(shí)快速返回結(jié)果。為此,數(shù)據(jù)存儲(chǔ)區(qū)必須預(yù)先了解應(yīng)用程序?qū)⑦M(jìn)行哪些查詢(xún)。可在配置文件中指定應(yīng)用程序所需的查詢(xún)。測(cè)試程序中沒(méi)有配置存儲(chǔ)區(qū)索引,所以開(kāi)發(fā)服務(wù)器會(huì)使用自動(dòng)索引配置。5.3博客的發(fā)布和瀏覽模塊實(shí)現(xiàn)該模塊的核心功能就是博客的新增和查詢(xún),使用的是GAE的數(shù)據(jù)存儲(chǔ)服務(wù)。GAE數(shù)據(jù)存儲(chǔ)區(qū)是一個(gè)無(wú)架構(gòu)對(duì)象數(shù)據(jù)存儲(chǔ)區(qū),具有查詢(xún)引擎和原子事務(wù)。該存儲(chǔ)區(qū)是出于網(wǎng)絡(luò)應(yīng)用程序的考慮而設(shè)計(jì)的,著重于讀取和查詢(xún)性能。它存儲(chǔ)帶屬性的數(shù)據(jù)實(shí)體,通過(guò)由應(yīng)用程序定義的類(lèi)型進(jìn)行組織。通過(guò)對(duì)屬性值和鍵設(shè)置過(guò)濾條件和排序順序,該數(shù)據(jù)存儲(chǔ)區(qū)可以對(duì)同一類(lèi)型的實(shí)體執(zhí)行查詢(xún)。所有的查詢(xún)都預(yù)先編入索引,便于在處理很大的數(shù)據(jù)集時(shí)快速獲得結(jié)果。該數(shù)據(jù)存儲(chǔ)區(qū)支持事務(wù)更新,使用由應(yīng)用程序定義的實(shí)體分組作為分布式數(shù)據(jù)網(wǎng)絡(luò)中事務(wù)性的單位。該模塊的主要工作是用來(lái)存儲(chǔ)博客的實(shí)體類(lèi)的及跟它相關(guān)的實(shí)體類(lèi)的設(shè)計(jì)以及通過(guò)JPA接口來(lái)操作實(shí)體類(lèi)。Google官方給出的是使用JDO配置的實(shí)例,采用了簡(jiǎn)單的java標(biāo)注技術(shù)將一個(gè)普通的java類(lèi)配置為一個(gè)可以被持久化到GAE存儲(chǔ)區(qū)的實(shí)體類(lèi)。JPA下的配置與JDO基本原理相同,在實(shí)體類(lèi)的設(shè)計(jì)有如下幾個(gè)關(guān)鍵性問(wèn)題。5.3.1實(shí)體健的配置每個(gè)實(shí)體都具有一個(gè)在AppEngine的所有實(shí)體中唯一的鍵,一個(gè)完整的鍵包含若干條信息,其中包括應(yīng)用程序ID、類(lèi)型和實(shí)體ID(鍵也包含有關(guān)實(shí)體組的信息)。對(duì)象的鍵存儲(chǔ)在實(shí)例的某一個(gè)字段中,GAE存取區(qū)提供了4種配置主鍵字段的方法:1)由數(shù)據(jù)存儲(chǔ)區(qū)自動(dòng)生成的長(zhǎng)整形實(shí)體ID。對(duì)于沒(méi)有父實(shí)體組、其ID應(yīng)由數(shù)據(jù)存儲(chǔ)區(qū)自動(dòng)生成的對(duì)象,使用此類(lèi)型合適。實(shí)例的長(zhǎng)整型鍵字段在該實(shí)例保存時(shí)填充。@IdprivateLongid2)對(duì)象創(chuàng)建時(shí)由應(yīng)用程序提供的字符串類(lèi)型實(shí)體ID(“鍵名”)。對(duì)于沒(méi)有父實(shí)體組、其ID應(yīng)由應(yīng)用程序提供的對(duì)象,使用此類(lèi)型合適。應(yīng)用程序在保存前將此域設(shè)置為所需的ID。@IdPrivateStringid3)Key實(shí)例(com.google.appengine.api.datastore.Key)。鍵值包括父實(shí)體組(如果有)的鍵以及應(yīng)用程序分配的字符串ID或系統(tǒng)生成的數(shù)字ID。要?jiǎng)?chuàng)建帶應(yīng)用程序分配的字符串ID的對(duì)象,請(qǐng)創(chuàng)建帶有該ID的鍵值并將字段設(shè)置為該值。要?jiǎng)?chuàng)建帶系統(tǒng)分配的數(shù)字ID的對(duì)象,請(qǐng)將鍵字段留為null。@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateKeykey;實(shí)體設(shè)置主鍵字段Keykey=KeyFactory.createKey(Object.class.getSimplename,"id");Objecto=newObject();o.setKey(key);4)編碼字符串形式的鍵。與鍵類(lèi)似,但值是鍵的編碼字符串形式。編碼字符串鍵允許您以便攜方式編寫(xiě)應(yīng)用程序且仍可以利用AppEngine數(shù)據(jù)存儲(chǔ)區(qū)實(shí)體組。由于考慮到使用自動(dòng)生成的長(zhǎng)整形主鍵能夠避免手工維護(hù)主鍵的復(fù)雜并且使用更加簡(jiǎn)單,博客實(shí)體類(lèi)采用了第一種主鍵策略。5.3.2實(shí)體間關(guān)系使用對(duì)象類(lèi)型的字段,可以在持久對(duì)象之間建模關(guān)系。JPA接口的AppEngine實(shí)現(xiàn)可以建模有主的一對(duì)一關(guān)系和有主的一對(duì)多關(guān)系,既一個(gè)對(duì)象無(wú)法脫離另一個(gè)而存在,這些關(guān)系既單向又雙向。有主關(guān)系的兩個(gè)實(shí)體會(huì)被放在同一個(gè)實(shí)體組中,處于同一個(gè)實(shí)體組中的實(shí)體在持久化,更新和刪除時(shí)會(huì)產(chǎn)生級(jí)聯(lián)。例如當(dāng)擁有有主關(guān)系的對(duì)象保存到數(shù)據(jù)存儲(chǔ)區(qū)中時(shí),會(huì)自動(dòng)保存能夠沿關(guān)系到達(dá)且需要保存的所有其他對(duì)象(都為新建對(duì)象的時(shí)候需要使用事務(wù))。例如刪除父對(duì)象,則也會(huì)刪除所有子對(duì)象。而且通過(guò)對(duì)父對(duì)象的從屬字段賦新的值來(lái)打破有主關(guān)系也會(huì)刪除舊的子對(duì)象。無(wú)主的關(guān)系(兩個(gè)對(duì)象都可存在,而不管其彼此的關(guān)系)尚未為自然語(yǔ)法所支持,但可以通過(guò)直接在字段中存儲(chǔ)數(shù)據(jù)存儲(chǔ)區(qū)鍵來(lái)自己管理這些關(guān)系。本博客系統(tǒng)中的用戶(hù)資料實(shí)體和博客實(shí)體具有一對(duì)多的關(guān)系,用戶(hù)資料實(shí)體存儲(chǔ)的是使用Google賬戶(hù)登錄本系統(tǒng)的用戶(hù)上傳的資料,使用登錄用戶(hù)的郵件地址作為主鍵。博客實(shí)體需要有作者信息,而博客可以獨(dú)立于用戶(hù)資料而存在,只要存儲(chǔ)了Google賬戶(hù)的郵件即可找到作者信息。所以通過(guò)用戶(hù)的郵件地址即可建立兩個(gè)實(shí)體的無(wú)主關(guān)系。5.3.3事務(wù)事務(wù)是數(shù)據(jù)庫(kù)中最重要的問(wèn)題,事務(wù)是一項(xiàng)或一系列數(shù)據(jù)存儲(chǔ)區(qū)操作,這些操作要么全部成功,要么全部失敗。如果事務(wù)成功完成,則會(huì)對(duì)數(shù)據(jù)存儲(chǔ)區(qū)產(chǎn)生所有預(yù)期的作用。如果事務(wù)失敗,則不會(huì)起任何作用。要想在一個(gè)事務(wù)中控制多個(gè)實(shí)體,必須保證這些實(shí)體在同一個(gè)組中。當(dāng)應(yīng)用程序創(chuàng)建一個(gè)實(shí)體時(shí),它將另一個(gè)實(shí)體分配為新實(shí)體的父實(shí)體。向新實(shí)體分配父實(shí)體會(huì)將新實(shí)體放置在與父實(shí)體相同的實(shí)體組。在博客模塊中使用的都是對(duì)單個(gè)實(shí)體的操作,所以沒(méi)有涉及到事務(wù)的使用。在實(shí)體類(lèi)設(shè)計(jì)完畢之后,接下來(lái)就是編寫(xiě)Service類(lèi)實(shí)現(xiàn)對(duì)實(shí)體的增刪改查操作。通過(guò)使用JPA接口,可以以對(duì)象的方式來(lái)管理實(shí)體,操作十分方便。Web層使用了Java的Servlet和JSP技術(shù),以Servlet作為控制器控制請(qǐng)求和響應(yīng)的流程,以JSP頁(yè)面向作者展示請(qǐng)求結(jié)果。5.4用戶(hù)的登錄和資料管理模塊實(shí)現(xiàn)該模塊在使用GAE數(shù)據(jù)存儲(chǔ)區(qū)的基礎(chǔ)上,還要使用Google賬戶(hù)服務(wù)驗(yàn)證用戶(hù)登錄;使用BlobStore服務(wù)存儲(chǔ)用戶(hù)頭像;使用Google的圖像服務(wù)來(lái)處理用戶(hù)頭像;使用GoogleMap服務(wù)來(lái)定位用戶(hù)位置。5.4.1用戶(hù)驗(yàn)證在本博客系統(tǒng)中,只有登錄的用戶(hù)才可以發(fā)布博客,游客只能夠?yàn)g覽博客,而對(duì)博客的管理則需要管理員權(quán)限。用戶(hù)登錄和權(quán)限可以通過(guò)在實(shí)體中存儲(chǔ)相關(guān)的信息來(lái)實(shí)現(xiàn),但是Google為我們提供了可以直接使用Google賬戶(hù)登錄和權(quán)限驗(yàn)證的服務(wù)。AppEngine應(yīng)用程序可以使用Google帳戶(hù)驗(yàn)證用戶(hù)。應(yīng)用程序可以檢測(cè)到當(dāng)前用戶(hù)是否以Google帳戶(hù)登錄,并且可以將用戶(hù)重定向到Google帳戶(hù)登錄頁(yè)面,以便登錄或新建一個(gè)帳戶(hù)。用戶(hù)登錄應(yīng)用程序后,應(yīng)用程序可以訪問(wèn)用戶(hù)的電子郵件地址。應(yīng)用程序也可以檢測(cè)當(dāng)前用戶(hù)是否為管理員,這樣便可在應(yīng)用程序中輕松實(shí)現(xiàn)僅管理員區(qū)域。該服務(wù)中最核心的兩個(gè)類(lèi)為UserServiceFactory和UserService:userService.createLoginURL(Stringurl)用于重定向到Google的登錄界面;userService.isUserLoggedIn()用于檢測(cè)用戶(hù)是否登錄;userService.getCurrentUser()用于獲取登錄用戶(hù)的信息;userService.isUserAdmin()用于檢測(cè)用戶(hù)是否為管理員;userService.createLogoutURL(Stringurl)用于返回當(dāng)前用戶(hù)退出此應(yīng)用程序的網(wǎng)址。5.4.2資料管理登錄的用戶(hù)可以上傳自己的頭像和描述。頭像和描述作為用戶(hù)資料實(shí)體的屬性被存儲(chǔ)在數(shù)據(jù)存儲(chǔ)區(qū)中,在最初的設(shè)計(jì)中,頭像是以Blob(任意數(shù)量的字節(jié))存儲(chǔ)的,通過(guò)使用Commons-Fileupload組件將用戶(hù)上傳的頭像解析為字節(jié)數(shù)組存儲(chǔ)到Blob中,但是經(jīng)過(guò)測(cè)試上傳的字節(jié)數(shù)組長(zhǎng)度限制在3000左右。GAE的BlobStore提供了存儲(chǔ)圖片,視頻等大文件的服務(wù),用戶(hù)只要將帶有文件的表單提交到BlobStore指定的url下,便可以通過(guò)BlobStore存儲(chǔ)數(shù)據(jù),然后通過(guò)BlobKey來(lái)指向存儲(chǔ)的數(shù)據(jù)。BlobStore中的核心類(lèi)為BlobstoreService、BlobKey和BlobInfo。blobstoreService.createUploadUrl(Stringurl)用于提交帶有文件的表單到BlobStore服務(wù)將上傳文件存儲(chǔ)后再轉(zhuǎn)到處理程序的url。blobstoreService.getUploadedBlobs(HttpRequestrequest)用戶(hù)獲取含有上傳文件的BlobKey的Map,Map的鍵為上傳組件的名字。blobstoreService.serve(BlobKeyblobKey,HttpResponseresponse)用于將BlobKey標(biāo)示的文件返回給用戶(hù)。BlobKey是存儲(chǔ)在BlobStore中文件的唯一標(biāo)示,本模塊將BlobKey以String的形式存儲(chǔ)為用戶(hù)資料實(shí)體的一個(gè)屬性,用來(lái)關(guān)聯(lián)到用戶(hù)上傳的頭像。BlobInfo類(lèi)存儲(chǔ)了blob的信息,例如大小,類(lèi)型等等,可以通過(guò)BlobKey來(lái)獲取一個(gè)blob的BlobInfo。5.4.3頭像處理GAE提供了使用專(zhuān)用圖像服務(wù)來(lái)操作圖像數(shù)據(jù)的功能。圖像服務(wù)可以調(diào)整圖像大小,旋轉(zhuǎn)、翻轉(zhuǎn)和裁剪圖像;可以將多個(gè)圖像合并為單個(gè)圖像;可以在多種格式之間轉(zhuǎn)換圖像數(shù)據(jù)。它還能夠使用預(yù)先定義的算法提高照片質(zhì)量,在該模塊中,實(shí)現(xiàn)了用戶(hù)頭像的大小調(diào)整、翻轉(zhuǎn)、旋轉(zhuǎn)和裁剪圖像。在圖像服務(wù)中最核心的類(lèi)為Image、ImagesServiceFactory、ImagesService和Transform。Image類(lèi)表示一個(gè)圖像實(shí)體,它是通過(guò)字節(jié)數(shù)據(jù)來(lái)產(chǎn)生圖像的。Transform類(lèi)表示對(duì)圖像的轉(zhuǎn)換。ImagesServiceFactory是一個(gè)工具類(lèi),它可以利用字節(jié)數(shù)據(jù)來(lái)產(chǎn)生Image,可以產(chǎn)生多種Transform。ImageService類(lèi)將Transform應(yīng)用于Image來(lái)產(chǎn)生新的圖像。5.4.4用戶(hù)定位通過(guò)此功能,登錄用戶(hù)能夠在Google地圖中定位到所在位置。地理定位指通過(guò)各種數(shù)據(jù)收集機(jī)制識(shí)別用戶(hù)或計(jì)算設(shè)備的地理位置。通常而言,大多數(shù)地理定位服務(wù)使用網(wǎng)絡(luò)路由地址或內(nèi)部GPS設(shè)備來(lái)確定該位置。某些瀏覽器/設(shè)備支持地理定位,但某些則不支持(或無(wú)法支持),因此您不能始終假定網(wǎng)絡(luò)應(yīng)用程序具備該功能。目前瀏覽器支持3種定位方式,它們不是GoogleMap的特性,而是公共的標(biāo)準(zhǔn)。根據(jù)瀏覽器支持的程度,我分三個(gè)層次依次調(diào)用3種定位服務(wù),確保用戶(hù)能夠正確定位。最先使用的是W3CGeolocation標(biāo)準(zhǔn),此標(biāo)準(zhǔn)是HTML5的一部分,只被一些最新版本的瀏覽器所支持,使用舊版瀏覽器會(huì)定位失敗。接下來(lái)使用GoogleGearsGeolocationAPI實(shí)現(xiàn)定位。前提是瀏覽器帶有GoogleGears,由于其對(duì)W3C標(biāo)準(zhǔn)的廣泛支持,所以用這種方式定位的成功率比較高。最后使用Geoip公司提供的Ip查詢(xún)服務(wù)來(lái)定位,此服務(wù)能夠查詢(xún)ip地址所在的經(jīng)緯度、國(guó)家、省市等信息。這種方式是最穩(wěn)妥和瀏覽器支持最廣泛的定位方式,很多舊版的瀏覽器也能夠成功定位,由于ip地址的問(wèn)題,會(huì)出現(xiàn)一定的偏差,但是通過(guò)測(cè)試基本可以成功定位。5.5電子郵件發(fā)送模塊實(shí)現(xiàn)該模塊實(shí)現(xiàn)了登錄用戶(hù)通過(guò)GAE郵件服務(wù)向合法的電子郵件地址發(fā)送郵件的功能。GAE應(yīng)用程序可以代表應(yīng)用程序管理員和擁有Google帳戶(hù)的用戶(hù)發(fā)送電子郵件。GAE應(yīng)用程序使用JavaMail標(biāo)準(zhǔn)來(lái)發(fā)送郵件,但是與普通的應(yīng)用程序不同,它無(wú)需設(shè)置SMTP服務(wù)器的信息,JavaMail始終調(diào)用GAE郵件服務(wù)來(lái)發(fā)送電子郵件,郵件服務(wù)支持普通郵件和多部分的郵件。JavaMail的核心類(lèi)是Session、MimeMessage、MimeMultipart、MimeBodyPart和Transport。Session用來(lái)建立和郵件服務(wù)器的鏈接,MimeMessage表示郵件實(shí)體,包含了發(fā)件人、收件人、主題、內(nèi)容等郵件信息,對(duì)于多部分的郵件需要在MimeMessage中添加MimeMultipart對(duì)象,MimeMultipart對(duì)象則由多個(gè)MimeBodyPart對(duì)象構(gòu)成,它們可以是普通文本、Html和郵件服務(wù)允許的Mime類(lèi)型的附件。Transport用來(lái)發(fā)送設(shè)置好的郵件。5.6AppEngine測(cè)試程序結(jié)果博客的發(fā)布和瀏覽模塊:圖5-1博客概覽頁(yè)面圖5-2博客詳解頁(yè)面用戶(hù)資料管理模塊:圖5-3用戶(hù)資料頁(yè)面圖5-4頭像處理頁(yè)面圖5-5用戶(hù)定位頁(yè)面電子郵件發(fā)送模塊:圖5-6電子郵件發(fā)送頁(yè)面5.7AppEngine測(cè)試程序部署在本地開(kāi)發(fā)服務(wù)器調(diào)試過(guò)的測(cè)試程序要上傳到GAE。可以使用GAE提供的管理控制臺(tái)是基于網(wǎng)絡(luò)的接口,用于管理在AppEngine上運(yùn)行的應(yīng)用程序。可以使用域上的免費(fèi)域名來(lái)為您的應(yīng)用程序提供服務(wù),也可以綁定自己的頂級(jí)域名。5.7.1測(cè)試程序上傳AppEngineJavaSDK含有用于和AppEngine交互的命令。可使用該命令將您的應(yīng)用程序的新版本代碼、配置和靜態(tài)文件上傳到AppEngine。還可使用該命令來(lái)管理數(shù)據(jù)存儲(chǔ)區(qū)索引以及下載日志數(shù)據(jù)。測(cè)試程序使用了Google的Eclipse插件來(lái)上傳應(yīng)用程序,要求登錄Google賬戶(hù)才能夠上傳。5.7.2測(cè)試程序管理谷歌應(yīng)用程序引擎的管理控制臺(tái)提供了完整的訪問(wèn)應(yīng)用程序的公開(kāi)版本的網(wǎng)絡(luò)接口。可以使用它創(chuàng)建新應(yīng)用程序、配置域名、更改您的應(yīng)用程序當(dāng)前的版本、檢查訪問(wèn)權(quán)限和錯(cuò)誤日志以及瀏覽應(yīng)用程序數(shù)據(jù)存儲(chǔ)區(qū)。每個(gè)免費(fèi)使用的用戶(hù)可以最多創(chuàng)建十個(gè)應(yīng)用程序,每個(gè)應(yīng)用程序可以有多個(gè)版本。圖5-7應(yīng)用程序管理通過(guò)管理控制臺(tái),可以監(jiān)視正在運(yùn)行的實(shí)例的各項(xiàng)數(shù)據(jù)包括請(qǐng)求數(shù)、錯(cuò)誤數(shù)、QPS(每秒查詢(xún)率)、Latency(延遲時(shí)間)和AverageMemory(平均內(nèi)存占用)。圖5-8應(yīng)用程序?qū)嵗龣z測(cè)管理控制臺(tái)的日志界面記錄了應(yīng)用程序運(yùn)行過(guò)程中產(chǎn)生的日志,可以通過(guò)選擇日志級(jí)別來(lái)篩選。圖5-9應(yīng)用程序日志通過(guò)管理控制臺(tái)還可以查看應(yīng)用程序的存儲(chǔ)數(shù)據(jù)以及索引,還可以通過(guò)控制臺(tái)來(lái)新增和刪除實(shí)體。圖5-10應(yīng)用程序數(shù)據(jù)管理控制臺(tái)還提供了許多其它的管理功能,例如任務(wù)隊(duì)列管理可以產(chǎn)看和刪除正在運(yùn)行的后臺(tái)任務(wù),但是本測(cè)試程序中并沒(méi)有使用。BlobStore查看界面用來(lái)管理存儲(chǔ)在GAE中的大文件,但是需要開(kāi)啟計(jì)費(fèi)模式才能夠使用。通過(guò)管理控制臺(tái),可以管理和監(jiān)控運(yùn)行在GAE上的網(wǎng)絡(luò)應(yīng)用程序,了解應(yīng)用程序的負(fù)載,及時(shí)的做出調(diào)整。5.7.3GAE應(yīng)用程序配額和限制AppEngine應(yīng)用程序可以消耗的資源上限為特定的最大值或配額,以日為單位結(jié)算。利用配額,AppEngine可確保您的應(yīng)用程序不會(huì)超出預(yù)算,并且在AppEngine上運(yùn)行的其他應(yīng)用程序不會(huì)影響您的應(yīng)用程序的性能。收費(fèi)配額是由您(應(yīng)用程序管理員)設(shè)置的資源最大值,用來(lái)避免應(yīng)用程序的成本超出您的預(yù)算。每個(gè)應(yīng)用程序可免費(fèi)獲得一定數(shù)量的各種收費(fèi)配額。您可以通過(guò)啟用付費(fèi)、設(shè)置每日預(yù)算,然后將預(yù)算分配給配額來(lái)為應(yīng)用程序增加收費(fèi)配額。您只需對(duì)應(yīng)用程序?qū)嶋H使用的資源以及使用的超過(guò)了免費(fèi)配額上限的資源量付費(fèi)。AppEngine會(huì)記錄應(yīng)用程序在一個(gè)日歷日中使用的各資源的量,并在此量達(dá)到資源的應(yīng)用程序配額時(shí)認(rèn)為資源耗盡。當(dāng)應(yīng)用程序耗盡分配的全部資源時(shí),如果沒(méi)有補(bǔ)充配額,則資源會(huì)變得不可用。AppEngine為各種服務(wù)都制定了配額限制,必須在限制下使用AppEngine提供的各項(xiàng)資源。用戶(hù)請(qǐng)求配額圖5-11用戶(hù)請(qǐng)求配額GAE提供了每天6.5cpu小時(shí)來(lái)處理用戶(hù)發(fā)起的請(qǐng)求,傳入和傳出的帶寬配額限制在1GB。數(shù)據(jù)存儲(chǔ)區(qū)配額圖5-12數(shù)據(jù)存儲(chǔ)配額數(shù)據(jù)存儲(chǔ)區(qū)存儲(chǔ)數(shù)據(jù)的免費(fèi)默認(rèn)配額為1GB,索引數(shù)默認(rèn)配額為200個(gè)。數(shù)據(jù)存儲(chǔ)區(qū)API調(diào)用、發(fā)送至API的數(shù)據(jù)、從API接收的數(shù)據(jù)沒(méi)有限制,將計(jì)入傳入傳出帶寬配額,數(shù)據(jù)存儲(chǔ)區(qū)的Cpu時(shí)間計(jì)算計(jì)入CPU時(shí)間配額。BlobStore中存儲(chǔ)的數(shù)據(jù)計(jì)在數(shù)據(jù)存儲(chǔ)區(qū)的配額中,對(duì)BlobStoreAPI的調(diào)用沒(méi)有限制。圖片處理配額圖5-13圖片處理配額圖片處理API調(diào)用、發(fā)送至API的數(shù)據(jù)、從API收到的數(shù)據(jù)、執(zhí)行的轉(zhuǎn)換次數(shù)都沒(méi)有限制,將計(jì)入傳入傳出帶寬配額中,發(fā)送到服務(wù)的圖像的最大數(shù)據(jù)大小和從服務(wù)接收的圖像的最大數(shù)據(jù)大小的都為1MB。郵件發(fā)送配額圖5-14郵件配額每日可以使用7000次的郵件API調(diào)用,每日最多可以使用應(yīng)用程序給2000個(gè)收件人地址發(fā)送郵件,可以給作為管理員的收件人發(fā)送5000封郵件。每封郵件的大小限制為1MB,每日可發(fā)送的正文數(shù)據(jù)量為60MB,計(jì)入到傳出帶寬配額,每日允許攜帶的附件數(shù)為2000個(gè),可發(fā)送的附件數(shù)據(jù)量為100MB,計(jì)入到傳出帶寬配額之內(nèi)。結(jié)論云計(jì)算是Google于2006年提出的概念,云計(jì)算描述了一種基于互聯(lián)網(wǎng)的新的IT服務(wù)增加、使用和交付模式,讓計(jì)算資源的使用像使用水電一樣的簡(jiǎn)單。由于云計(jì)算具有十分廣闊的應(yīng)用前景,已引起了許多IT廠商和學(xué)術(shù)界的高度重視,各種云計(jì)算技術(shù)如雨后春筍般涌現(xiàn)。本課題研究的是Google云計(jì)算平臺(tái)的核心技術(shù)和云計(jì)算應(yīng)用程序的開(kāi)發(fā),通過(guò)查閱云計(jì)算的相關(guān)期刊以
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年監(jiān)理工程師(合同管理)考試真題模擬題庫(kù)
- 二年級(jí)下班主任工作計(jì)劃與學(xué)生個(gè)性發(fā)展
- 幼兒園疫情期間小班社交技能培養(yǎng)計(jì)劃
- 醫(yī)院高危患者監(jiān)測(cè)與管理計(jì)劃
- 服務(wù)行業(yè)客戶(hù)滿意度與質(zhì)量提升計(jì)劃
- 小學(xué)《道德與法治》課題研究計(jì)劃
- 跨國(guó)公司服務(wù)職業(yè)的質(zhì)量管理體系優(yōu)化研究-洞察闡釋
- 精準(zhǔn)污染控制與資源化利用-洞察闡釋
- 聚焦藥物釋放效率的貼敷式給藥系統(tǒng)研究-洞察闡釋
- 植物基可生物降解文具材料的開(kāi)發(fā)與應(yīng)用-洞察闡釋
- 【真題】2023年常州市中考道德與法治試卷(含答案解析)
- 酒吧計(jì)劃創(chuàng)業(yè)計(jì)劃書(shū)
- 光伏項(xiàng)目安全培訓(xùn)課件
- 拉森鋼板樁監(jiān)理實(shí)施細(xì)則樣本
- 個(gè)人房屋抵押借款合同范本-借款合同
- 《原碼一位乘法》課件
- 中華人民共和國(guó)監(jiān)察法學(xué)習(xí)解讀課件
- 中小學(xué)教務(wù)主任培訓(xùn)
- 眼鏡行業(yè)目標(biāo)市場(chǎng)分析
- 空間向量與立體幾何教材分析
- 1-STM32F4xx中文參考手冊(cè)
評(píng)論
0/150
提交評(píng)論