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