Google是可伸縮性之王。每個(gè)人都知道Google是因?yàn)樗麄儗Υ罅浚瑥?fù)雜信息的快速搜索,但是Google的技術(shù)并不只是在搜索領(lǐng)域閃閃發(fā) 光。他們構(gòu)建大型應(yīng)用的平臺方式能夠讓他們以驚人的競爭速度在網(wǎng)絡(luò)規(guī)模應(yīng)用上面大展拳腳。Google的目標(biāo)一直是構(gòu)建更高性能更高規(guī)模基礎(chǔ)設(shè)施來支持他 們的產(chǎn)品。他們怎么做到的呢?
參考資料以及信息來源
視頻:在Google上構(gòu)建大型系統(tǒng) (Video: Building Large Systems at Google )
Google實(shí)驗(yàn)室:Google文件系統(tǒng) (Google Lab: The Google File System )
Google實(shí)驗(yàn)室:MapReduce:在大規(guī)模集群上簡化數(shù)據(jù)處理 (Google Lab: MapReduce: Simplified Data Processing on Large Clusters )
Google實(shí)驗(yàn)室:BigTable: (Google Lab : BigTable .)
視頻:BigTable: 一個(gè)分布式的結(jié)構(gòu)化存儲系統(tǒng) (Video: BigTable: A Distributed Structured Storage System .)
Google實(shí)驗(yàn)室:松散耦合的分布式系統(tǒng)的 Chubby Lock服務(wù) (Google Lab: The Chubby Lock Service for Loosely-Coupled Distributed Systems. )
Google是如何工作的 作者 David Carr發(fā)表于Baseline雜志 (How Google Works by David Carr in Baseline Magazine.)
Google實(shí)驗(yàn)室:翻譯數(shù)據(jù):使用Sawzall并行分析(Google Lab: Interpreting the Data: Parallel Analysis with Sawzall. )
可伸縮性大會(huì)上Dare Obasonjo的筆記 (Dare Obasonjo’s Notes on the scalability conference. )
平臺
• Linux
• 多種不同的語言: Python, Java, C++
數(shù)據(jù)揭秘
目前的情形:
• 2006年估計(jì)有450,000個(gè)價(jià)格便宜的商用服務(wù)器
• 2005年Google索引了80億的web頁面。到現(xiàn)在為止有多少,已經(jīng)無法統(tǒng)計(jì)出來了。
• 目前Google有超過200GFS的集群。一個(gè)集群能有1000甚至5000個(gè)機(jī)器。成百上千的機(jī)器從運(yùn)行大到5peta字節(jié)存儲的GFS集群檢索數(shù)據(jù)。通過集群的總的讀寫吞吐量達(dá)到每秒400億字節(jié)。
• 目前在Google有6000個(gè) MapReduce應(yīng)用,并且每個(gè)月有幾百個(gè)新的應(yīng)用正在出現(xiàn)。
架構(gòu)的層次
Google把他們的基礎(chǔ)設(shè)施架構(gòu)描述為三個(gè)層次棧:
• 產(chǎn)品:檢索,廣告,電子郵件,地圖,視頻,聊天,博客
• 分布式系統(tǒng)基礎(chǔ)設(shè)施:GFS, MapReduce, 以及BigTable。
• 計(jì)算平臺:很多不同數(shù)據(jù)中心的很多機(jī)器
• 確保公司員工容易低成本配置。
• 看看每個(gè)應(yīng)用基線的價(jià)格性能數(shù)據(jù)。把更多的錢花在硬件上以期不丟失日志數(shù)據(jù),但是在其他類型的數(shù)據(jù)上花少一點(diǎn)。既然這樣處理,實(shí)際上他們就不會(huì)丟數(shù)據(jù)。
使用GFS(Google文件系統(tǒng))的可靠存儲機(jī)制
• 可靠的可伸縮存儲是任何應(yīng)用的一個(gè)核心需要。GFS就是他們的核心存儲平臺。
• Google文件系統(tǒng)- 大的分布式日志結(jié)構(gòu)化文件系統(tǒng),里面有大量數(shù)據(jù)
• 為什么不用其他的而非要構(gòu)建一個(gè)文件系統(tǒng)呢?因?yàn)樗麄冃枰刂扑械氖虑椋沁@個(gè)平臺把他們和其他任何一個(gè)區(qū)分開來。他們需要:
- 通過數(shù)據(jù)中心的高可靠性
- 對于幾千個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的可伸縮性
- 大的讀寫帶寬需求
- 支持十億字節(jié)大的數(shù)據(jù)塊
- 高效的通過節(jié)點(diǎn)減少瓶頸的分布式操作
• 系統(tǒng)有主服務(wù)器和分塊服務(wù)器(chunk servers)
- 主服務(wù)器在各種數(shù)據(jù)文件上保存元數(shù)據(jù)。數(shù)據(jù)以64MB大的塊存儲在文件系統(tǒng)中。客戶機(jī)和主服務(wù)器對話來操作文件里的元數(shù)據(jù),定位包含了磁盤上他們需要的數(shù)據(jù)的分塊服務(wù)器。
• 一個(gè)新的應(yīng)用可以使用一個(gè)已經(jīng)存在的GFS集群或者他們自己制作。去理解他們使用的通過數(shù)據(jù)中心的這個(gè)供應(yīng)過程將是非常有趣的。
• 主鍵是足夠的基礎(chǔ)設(shè)施來確保人們對他們的應(yīng)用有多種選擇。可以調(diào)整GFS以適應(yīng)個(gè)人應(yīng)用需要。
使用MapReduce對數(shù)據(jù)做一些事情
• 既然你有了一個(gè)好的存儲系統(tǒng),你怎樣使用如此多的數(shù)據(jù)呢?假如說你有很多TB的數(shù)據(jù)存儲在1000臺機(jī)器上。數(shù)據(jù)庫不能擴(kuò)展或者有效地?cái)U(kuò)展到這樣的規(guī)模。這時(shí)就要用到MapReduce了。
• MapReduce是一個(gè)編程模型和用來處理和產(chǎn)生大規(guī)模數(shù)據(jù)集。用戶指定一個(gè)映射函數(shù)處理一個(gè)鍵/值對來產(chǎn)生中間的鍵/值對集合,還指定一個(gè)縮小函數(shù)來合并所有的與同一中間鍵相關(guān)的中間值。
許多現(xiàn)實(shí)世界的任務(wù)在這個(gè)模型里被表示出來。用這個(gè)函數(shù)風(fēng)格寫的程序自動(dòng)并行化并且在一大集群商務(wù)機(jī)器上執(zhí)行。運(yùn)行時(shí)系統(tǒng)關(guān)心分割輸入數(shù)據(jù)的細(xì)節(jié), 通過一系列的機(jī)器安排程序的執(zhí)行,處理機(jī)器事故,以及管理所需的機(jī)器內(nèi)部通信。這使得沒有任何并行和分布式系統(tǒng)經(jīng)驗(yàn)的程序員能夠容易地利用一個(gè)大的分布式 系統(tǒng)的資源。
• 為什么使用MapReduce呢?
- 在大量機(jī)器上分割任務(wù)的極佳方式
- 處理機(jī)器故障
- 在不同類型的應(yīng)用上工作,如搜索和廣告。幾乎每個(gè)應(yīng)用都有映射簡化類型之類的操作。你可以預(yù)計(jì)算有用的數(shù)據(jù),統(tǒng)計(jì)字?jǐn)?shù),分類幾TB的數(shù)據(jù),等等。
- 計(jì)算可以自動(dòng)地更加靠近IO源。
• MapReduce 系統(tǒng)有三個(gè)不同類型的服務(wù)器。
- 主服務(wù)器分配用戶任務(wù)以映射和減少服務(wù)器。它也跟蹤任務(wù)的狀態(tài)。
- 映射服務(wù)器接收用戶輸入,在它們上面實(shí)行映射操作。結(jié)果寫入中間文件。
- 化簡服務(wù)器接收由映射服務(wù)器產(chǎn)生的中間文件并在它們上面實(shí)行化簡操作。
• 例如,你想要統(tǒng)計(jì)所有網(wǎng)頁中字符的個(gè)數(shù)。你可以把存儲在GFS中的頁面放入MapReduce。這些都將在1000秒內(nèi)發(fā)生,包括機(jī)器同步和協(xié)調(diào),任務(wù)安排,事故處理和數(shù)據(jù)傳輸將會(huì)自動(dòng)完成。
- 步驟如下:GFS -> Map -> Shuffle -> Reduction -> 把結(jié)果存回GFS
- 在MapReduce 里,一個(gè)映射把一個(gè)視圖映射到另一個(gè),產(chǎn)生一個(gè)鍵值對,在我們的例子里是單詞和數(shù)量。
- Shuffling 聚合鍵的類型
- 化簡把所有的鍵值對加起來產(chǎn)生最后的結(jié)果。
• Google索引管道有大概20個(gè)不同的映射化簡。一個(gè)管道把數(shù)據(jù)看做記錄的一個(gè)整體束和聚合鍵。第二個(gè)映射-化簡進(jìn)來把那個(gè)結(jié)果拿走做其他的一些事情。等等。
• 程序可以很小。可以小到20到50行的代碼。
• 一個(gè)問題是stragglers。Stragglers是一種比其他都要慢的計(jì)算。Stragglers會(huì)發(fā)生是因?yàn)槁腎O(比如一個(gè)糟糕的控制器)或者從一個(gè)臨時(shí)的CPU尖峰信號。解決辦法是運(yùn)行多個(gè)同樣的計(jì)算,當(dāng)一個(gè)完成時(shí)就銷毀所有其他的計(jì)算。
• 在映射和化簡之間轉(zhuǎn)換的數(shù)據(jù)被壓縮。這樣做是因?yàn)榉?wù)器不受CPU約束,花時(shí)間在數(shù)據(jù)的壓縮和解壓縮上還是有意義的,可以節(jié)省花在帶寬和I/O上的時(shí)間。
在BigTable中存儲結(jié)構(gòu)化數(shù)據(jù)
• BigTable 是一個(gè)大型的容錯(cuò)和自我管理系統(tǒng),包括太(萬億)字節(jié)的內(nèi)存和皮字節(jié)的內(nèi)存。它每秒能夠處理幾百萬的讀寫。
• BigTable是一個(gè)構(gòu)建在GFS之上的分布式散列機(jī)制。它不是一個(gè)關(guān)系數(shù)據(jù)庫。它不支持聯(lián)結(jié)或者SQL類型查詢。
• 它提供查找機(jī)制,可以通過鍵來訪問結(jié)構(gòu)化的數(shù)據(jù)。GFS存儲不透明數(shù)據(jù)和許多應(yīng)用所需的結(jié)構(gòu)化數(shù)據(jù)。
• 商業(yè)化數(shù)據(jù)不能伸縮到這個(gè)層次,它們不在1000個(gè)機(jī)器上工作。
• 通過控制它們自己的低層次存儲系統(tǒng),Google得到更多的控制和有力的工具來改進(jìn)它們的系統(tǒng)。例如,如果它們想要使得分布
數(shù)據(jù)操作更簡單的特征,它們可以在里面構(gòu)建。
• 當(dāng)系統(tǒng)運(yùn)行的時(shí)候,機(jī)器可以增加和減少,而整個(gè)系統(tǒng)還會(huì)正常工作。
• 每個(gè)數(shù)據(jù)條存儲在一個(gè)可以使用行鍵,列鍵或者時(shí)間郵票訪問的單元中。
• 每行存儲在一個(gè)或者更多個(gè)tablet中。一個(gè)tablet是數(shù)據(jù)形式的64KB塊的序列叫做SSTable。
• BigTable 有三個(gè)不同類型的服務(wù)器:
- 主服務(wù)器分配tablet到tablet服務(wù)器中。它們跟蹤的位置,當(dāng)需要時(shí)還會(huì)重新分配任務(wù)。
- Tablet 服務(wù)器處理tablet的讀寫請求。當(dāng)tablet超過規(guī)模限制(通常是100MB - 200MB)時(shí),它們將它分開。當(dāng)一個(gè)tablet服務(wù)器出故障時(shí),會(huì)有100個(gè)tablet服務(wù)器每個(gè)撿起一個(gè)新的tablet,所以系統(tǒng)就恢復(fù)了。
• 一個(gè)位置組可以被用作與幾比特的數(shù)據(jù)相關(guān)的物理存儲,為了有一個(gè)更好的參考位置。
• Tablets盡可能在RAM里被緩存。
硬件
• 當(dāng)你有很多個(gè)機(jī)器時(shí),你如何構(gòu)建它們以使花費(fèi)代價(jià)最小電能消耗最少呢?
• 使用超便宜的商業(yè)硬件,拼命利用它們在上面構(gòu)建軟件。
• 增加 1,000-fold 計(jì)算機(jī)電力,如果你使用容易出事故的基礎(chǔ)設(shè)施而不是構(gòu)建在高度可靠的部件之上的基礎(chǔ)設(shè)施時(shí),可以有33倍更低的花費(fèi)。你必須使用這一策略在不可靠之上構(gòu)建可靠。
• Linux,內(nèi)部的架構(gòu)設(shè)計(jì),PC類主機(jī)板,低端存儲。
• 性能基線中每瓦的價(jià)格沒有越來越好。存在著很多的電力和其他問題。
• 使用混合收集和它們自己的數(shù)據(jù)中心。
雜類
• 很快找出改變而不是等著提問和回答。
• 庫是構(gòu)建程序的主要方式。
• 一些是以服務(wù)的形式提供的應(yīng)用,比如crawling。
• 基礎(chǔ)設(shè)施處理應(yīng)用程序的版本,所以它們就能夠發(fā)布,不用擔(dān)心破壞事情。
Google未來的方向
• 支持地理位置分布的集群
• 為所有的數(shù)據(jù)創(chuàng)建單一的全局名字空間。當(dāng)前數(shù)據(jù)由集群分離開的。
• 更多更好的數(shù)據(jù)和計(jì)算的自動(dòng)化遷移。
• 解決當(dāng)你用網(wǎng)絡(luò)分割耦合大范圍的復(fù)制時(shí)產(chǎn)生的一致性問題(例如,即使一個(gè)集群已經(jīng)因?yàn)榫S修或是其他一些臨時(shí)停電等原因而下線時(shí),還能繼續(xù)提供服務(wù))
Goolge告訴我們的經(jīng)驗(yàn)
• 基礎(chǔ)設(shè)施是一個(gè)很有競爭性的優(yōu)勢。它當(dāng)然是屬于Google的。它們能更快更便宜地提供和生產(chǎn)新的網(wǎng)絡(luò)服務(wù),這在一定程度上是無人能比的。許多公司采取了 完全不同的方式。許多公司把基礎(chǔ)設(shè)施看做一種花銷。每個(gè)組將使用完全不同的技術(shù),而且他們很少有計(jì)劃如何更經(jīng)濟(jì)地構(gòu)建系統(tǒng)。Google把他們自己看做一 個(gè)系統(tǒng)工程公司,以一個(gè)非常新的方式來看待構(gòu)建軟件。
• 跨越多個(gè)數(shù)據(jù)中心仍是一個(gè)未解決的問題。大多數(shù)網(wǎng)站是一個(gè)至多是兩個(gè)數(shù)據(jù)中心。如何在大量數(shù)據(jù)中心上充分分配網(wǎng)站,我們說,非常復(fù)雜。
• 看一看Hadoop (產(chǎn)品)如果你沒有時(shí)間來從頭開始構(gòu)建所有這個(gè)基礎(chǔ)設(shè)施的話。Hadoop 是一個(gè)這里講的一些主意的開源實(shí)現(xiàn)。
• 一個(gè)平臺方式被忽略的優(yōu)點(diǎn)是初級開發(fā)人員可以在平臺上很快自信地構(gòu)建健壯的應(yīng)用。如果每個(gè)項(xiàng)目需要?jiǎng)?chuàng)建同樣的分布式基礎(chǔ)設(shè)施輪,你將會(huì)陷入困境,因?yàn)橹廊绾芜@樣做的人員相對稀少。
• 協(xié)同工作并不總是廢話。通過使系統(tǒng)中所有部件一起工作,一個(gè)改進(jìn)會(huì)有助于所有的改進(jìn)。改善文件系統(tǒng),每個(gè)人都會(huì)立刻明顯受益。如果每個(gè)項(xiàng)目使用一個(gè)不同的文件系統(tǒng),那么就沒有整個(gè)展的持續(xù)的改進(jìn)。
• 構(gòu)建不需要降低系統(tǒng)性能的自我管理系統(tǒng)。這可以讓你更容易地平衡各服務(wù)器的資源,動(dòng)態(tài)增加更多空間,允許機(jī)器下線,以及更從容地處理升級。
• 創(chuàng)建一個(gè)進(jìn)化式基礎(chǔ)設(shè)施。花時(shí)間在并行處理上會(huì)有回報(bào)的。
• 不要忽視了學(xué)院。學(xué)術(shù)界有很多好的創(chuàng)意并沒有轉(zhuǎn)入生產(chǎn)環(huán)境里。Google所做的大部分先于藝術(shù),不只是先于大規(guī)模配置。
• 考慮壓縮。當(dāng)你有大量CPU可以揮霍和IO限制時(shí),壓縮是一個(gè)很好的選擇。