Google是伸縮性的王者。Google一直的目標(biāo)就是構(gòu)建高性能高伸縮性的基礎(chǔ)組織來支持它們的產(chǎn)品。
平臺
Linux
大量語言:Python,Java,C++
狀態(tài)
在2006年大約有450,000臺廉價服務(wù)器
在2005年Google索引了80億Web頁面,現(xiàn)在沒有人知道數(shù)目
目前在Google有超過200個GFS集群。一個集群可以有1000或者甚至5000臺機(jī)器。成千上萬的機(jī)器從運行著5000000000000000字節(jié)存儲的GFS集群獲取數(shù)據(jù),集群總的讀寫吞吐量可以達(dá)到每秒40兆字節(jié)
目前在Google有6000個MapReduce程序,而且每個月都寫成百個新程序
BigTable伸縮存儲幾十億的URL,幾百千千兆的衛(wèi)星圖片和幾億用戶的參數(shù)選擇
堆棧
Google形象化它們的基礎(chǔ)組織為三層架構(gòu):
1,產(chǎn)品:搜索,廣告,email,地圖,視頻,聊天,博客
2,分布式系統(tǒng)基礎(chǔ)組織:GFS,MapReduce和BigTable
3,計算平臺:一群不同的數(shù)據(jù)中心里的機(jī)器
4,確保公司里的人們部署起來開銷很小
5,花費更多的錢在避免丟失日志數(shù)據(jù)的硬件上,其他類型的數(shù)據(jù)則花費較少
可信賴的存儲機(jī)制GFS(Google File System)
1,可信賴的伸縮性存儲是任何程序的核心需求。GFS就是Google的核心存儲平臺
2,Google File System - 大型分布式結(jié)構(gòu)化日志文件系統(tǒng),Google在里面扔了大量的數(shù)據(jù)
3,為什么構(gòu)建GFS而不是利用已有的東西?因為可以自己控制一切并且這個平臺與別的不一樣,Google需要:
-跨數(shù)據(jù)中心的高可靠性
-成千上萬的網(wǎng)絡(luò)節(jié)點的伸縮性
-大讀寫帶寬的需求
-支持大塊的數(shù)據(jù),可能為上千兆字節(jié)
-高效的跨節(jié)點操作分發(fā)來減少瓶頸
4,系統(tǒng)有Master和Chunk服務(wù)器
-Master服務(wù)器在不同的數(shù)據(jù)文件里保持元數(shù)據(jù)。數(shù)據(jù)以64MB為單位存儲在文件系統(tǒng)中??蛻舳伺cMaster服務(wù)器交流來在文件上做元數(shù)據(jù)操作并且找到包含用戶需要數(shù)據(jù)的那些Chunk服務(wù)器
-Chunk服務(wù)器在硬盤上存儲實際數(shù)據(jù)。每個Chunk服務(wù)器跨越3個不同的Chunk服務(wù)器備份以創(chuàng)建冗余來避免服務(wù)器崩潰。一旦被Master服務(wù)器指明,客戶端程序就會直接從Chunk服務(wù)器讀取文件
6,一個上線的新程序可以使用已有的GFS集群或者可以制作自己的GFS集群
7,關(guān)鍵點在于有足夠的基礎(chǔ)組織來讓人們對自己的程序有所選擇,GFS可以調(diào)整來適應(yīng)個別程序的需求
使用MapReduce來處理數(shù)據(jù)
1,現(xiàn)在你已經(jīng)有了一個很好的存儲系統(tǒng),你該怎樣處理如此多的數(shù)據(jù)呢?比如你有許多TB的數(shù)據(jù)存儲在1000臺機(jī)器上。數(shù)據(jù)庫不能伸縮或者伸縮到這種級別花費極大,這就是MapReduce出現(xiàn)的原因
2,MapReduce是一個處理和生成大量數(shù)據(jù)集的編程模型和相關(guān)實現(xiàn)。用戶指定一個map方法來處理一個鍵/值對來生成一個中間的鍵/值對,還有一個reduce方法來合并所有關(guān)聯(lián)到同樣的中間鍵的中間值。許多真實世界的任務(wù)都可以使用這種模型來表現(xiàn)。以這種風(fēng)格來寫的程序會自動并行的在一個大量機(jī)器的集群里運行。運行時系統(tǒng)照顧輸入數(shù)據(jù)劃分、程序在機(jī)器集之間執(zhí)行的調(diào)度、機(jī)器失敗處理和必需的內(nèi)部機(jī)器交流等細(xì)節(jié)。這允許程序員沒有多少并行和分布式系統(tǒng)的經(jīng)驗就可以很容易使用一個大型分布式系統(tǒng)資源
3,為什么使用MapReduce?
-跨越大量機(jī)器分割任務(wù)的好方式
-處理機(jī)器失敗
-可以與不同類型的程序工作,例如搜索和廣告。幾乎任何程序都有map和reduce類型的操作。你可以預(yù)先計算有用的數(shù)據(jù)、查詢字?jǐn)?shù)統(tǒng)計、對TB的數(shù)據(jù)排序等等
4,MapReduce系統(tǒng)有三種不同類型的服務(wù)器
-Master服務(wù)器分配用戶任務(wù)到Map和Reduce服務(wù)器。它也跟蹤任務(wù)的狀態(tài)
-Map服務(wù)器接收用戶輸入并在其基礎(chǔ)上處理map操作。結(jié)果寫入中間文件
-Reduce服務(wù)器接收Map服務(wù)器產(chǎn)生的中間文件并在其基礎(chǔ)上處理reduce操作
5,例如,你想在所有Web頁面里的字?jǐn)?shù)。你將存儲在GFS里的所有頁面拋入MapReduce。這將在成千上萬臺機(jī)器上同時進(jìn)行并且所有的調(diào)整、工作調(diào)度、失敗處理和數(shù)據(jù)傳輸將自動完成
-步驟類似于:GFS -> Map -> Shuffle -> Reduction -> Store Results back into GFS
-在MapReduce里一個map操作將一些數(shù)據(jù)映射到另一個中,產(chǎn)生一個鍵值對,在我們的例子里就是字和字?jǐn)?shù)
-Shuffling操作聚集鍵類型
-Reduction操作計算所有鍵值對的綜合并產(chǎn)生最終的結(jié)果
6,Google索引操作管道有大約20個不同的map和reduction。
7,程序可以非常小,如20到50行代碼
8,一個問題是掉隊者。掉隊者是一個比其他程序慢的計算,它阻塞了其他程序。掉隊者可能因為緩慢的IO或者臨時的CPU不能使用而發(fā)生。解決方案是運行多個同樣的計算并且當(dāng)一個完成后殺死所有其他的
9,數(shù)據(jù)在Map和Reduce服務(wù)器之間傳輸時被壓縮了。這可以節(jié)省帶寬和I/O。
在BigTable里存儲結(jié)構(gòu)化數(shù)據(jù)
1,BigTable是一個大伸縮性、錯誤容忍、自管理的系統(tǒng),它包含千千兆的內(nèi)存和1000000000000000的存儲。它可以每秒鐘處理百萬的讀寫
2,BigTable是一個構(gòu)建于GFS之上的分布式哈希機(jī)制。它不是關(guān)系型數(shù)據(jù)庫。它不支持join或者SQL類型查詢
3,它提供查詢機(jī)制來通過鍵訪問結(jié)構(gòu)化數(shù)據(jù)。GFS存儲存儲不透明的數(shù)據(jù)而許多程序需求有結(jié)構(gòu)化數(shù)據(jù)
4,商業(yè)數(shù)據(jù)庫不能達(dá)到這種級別的伸縮性并且不能在成千上萬臺機(jī)器上工作
5,通過控制它們自己的低級存儲系統(tǒng)Google得到更多的控制權(quán)來改進(jìn)它們的系統(tǒng)。例如,如果它們想讓跨數(shù)據(jù)中心的操作更簡單這個特性,它們可以內(nèi)建它
6,系統(tǒng)運行時機(jī)器可以自由的增刪而整個系統(tǒng)保持工作
7,每個數(shù)據(jù)條目存儲在一個格子里,它可以通過一個行key和列key或者時間戳來訪問
8,每一行存儲在一個或多個tablet中。一個tablet是一個64KB塊的數(shù)據(jù)序列并且格式為SSTable
9,BigTable有三種類型的服務(wù)器:
-Master服務(wù)器分配tablet服務(wù)器,它跟蹤tablet在哪里并且如果需要則重新分配任務(wù)
-Tablet服務(wù)器為tablet處理讀寫請求。當(dāng)tablet超過大小限制(通常是100MB-200MB)時它們拆開tablet。當(dāng)一個Tablet服務(wù)器失敗時,則100個Tablet服務(wù)器各自挑選一個新的tablet然后系統(tǒng)恢復(fù)。
-Lock服務(wù)器形成一個分布式鎖服務(wù)。像打開一個tablet來寫、Master調(diào)整和訪問控制檢查等都需要互斥
10,一個locality組可以用來在物理上將相關(guān)的數(shù)據(jù)存儲在一起來得到更好的locality選擇
11,tablet盡可能的緩存在RAM里
硬件
1,當(dāng)你有很多機(jī)器時你怎樣組織它們來使得使用和花費有效?
2,使用非常廉價的硬件
3,A 1,000-fold computer power increase can be had for a 33 times lower cost if you you use a failure-prone infrastructure rather than an infrastructure built on highly reliable components. You must build reliability on top of unreliability for this strategy to work.
4,Linux,in-house rack design,PC主板,低端存儲
5,Price per wattage on performance basis isn't getting better. Have huge power and cooling issues
6,使用一些collocation和Google自己的數(shù)據(jù)中心
其他
1,迅速更改而不是等待QA
2,庫是構(gòu)建程序的卓越方式
3,一些程序作為服務(wù)提供
4,一個基礎(chǔ)組織處理程序的版本,這樣它們可以發(fā)布而不用害怕會破壞什么東西
Google將來的方向
1,支持地理位置分布的集群
2,為所有數(shù)據(jù)創(chuàng)建一個單獨的全局名字空間。當(dāng)前的數(shù)據(jù)由集群分離
3,更多和更好的自動化數(shù)據(jù)遷移和計算
4,解決當(dāng)使用網(wǎng)絡(luò)劃分來做廣闊區(qū)域的備份時的一致性問題(例如保持服務(wù)即使一個集群離線維護(hù)或由于一些損耗問題)
學(xué)到的東西
1,基礎(chǔ)組織是有競爭性的優(yōu)勢。特別是對Google而言。Google可以很快很廉價的推出新服務(wù),并且伸縮性其他人很難達(dá)到。許多公司采取完全不同的方式。許多公司認(rèn)為基礎(chǔ)組織開銷太大。Google認(rèn)為自己是一個系統(tǒng)工程公司,這是一個新的看待軟件構(gòu)建的方式
2,跨越多個數(shù)據(jù)中心仍然是一個未解決的問題。大部分網(wǎng)站都是一個或者最多兩個數(shù)據(jù)中心。我們不得不承認(rèn)怎樣在一些數(shù)據(jù)中心之間完整的分布網(wǎng)站是很需要技巧的
3,如果你自己沒有時間從零開始重新構(gòu)建所有這些基礎(chǔ)組織你可以看看Hadoop。Hadoop是這里很多同樣的主意的一個開源實現(xiàn)
4,平臺的一個優(yōu)點是初級開發(fā)人員可以在平臺的基礎(chǔ)上快速并且放心的創(chuàng)建健全的程序。如果每個項目都需要發(fā)明同樣的分布式基礎(chǔ)組織的輪子,那么你將陷入困境因為知道怎樣完成這項工作的人相對較少
5,協(xié)同工作不一直是擲骰子。通過讓系統(tǒng)中的所有部分一起工作則一個部分的改進(jìn)將幫助所有的部分。改進(jìn)文件系統(tǒng)則每個人從中受益而且是透明的。如果每個項目使用不同的文件系統(tǒng)則在整個堆棧中享受不到持續(xù)增加的改進(jìn)
6,構(gòu)建自管理系統(tǒng)讓你沒必要讓系統(tǒng)關(guān)機(jī)。這允許你更容易在服務(wù)器之間平衡資源、動態(tài)添加更大的容量、讓機(jī)器離線和優(yōu)雅的處理升級
7,創(chuàng)建可進(jìn)化的基礎(chǔ)組織,并行的執(zhí)行消耗時間的操作并采取較好的方案
8,不要忽略學(xué)院。學(xué)院有許多沒有轉(zhuǎn)變?yōu)楫a(chǎn)品的好主意。Most of what Google has done has prior art, just not prior large scale deployment.
9,考慮壓縮。當(dāng)你有許多CPU而IO有限時壓縮是一個好的選擇。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。