走在架構師的大道上 Jack.Wang's home

          Java, C++, linux c, C#.net 技術,軟件架構,領域建模,IT 項目管理 Dict.CN 在線詞典, 英語學習, 在線翻譯

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
          原文:Google Architecture

          Google是伸縮性的王者。Google一直的目標就是構建高性能高伸縮性的基礎組織來支持它們的產(chǎn)品。

          平臺
          Linux
          大量語言:Python,Java,C++

          狀態(tài)
          在2006年大約有450,000臺廉價服務器
          在2005年Google索引了80億Web頁面,現(xiàn)在沒有人知道數(shù)目
          目前在Google有超過200個GFS集群。一個集群可以有1000或者甚至5000臺機器。成千上萬的機器從運行著5000000000000000字節(jié)存儲的GFS集群獲取數(shù)據(jù),集群總的讀寫吞吐量可以達到每秒40兆字節(jié)
          目前在Google有6000個MapReduce程序,而且每個月都寫成百個新程序
          BigTable伸縮存儲幾十億的URL,幾百千千兆的衛(wèi)星圖片和幾億用戶的參數(shù)選擇

          堆棧
          Google形象化它們的基礎組織為三層架構:
          1,產(chǎn)品:搜索,廣告,email,地圖,視頻,聊天,博客
          2,分布式系統(tǒng)基礎組織:GFS,MapReduce和BigTable
          3,計算平臺:一群不同的數(shù)據(jù)中心里的機器
          4,確保公司里的人們部署起來開銷很小
          5,花費更多的錢在避免丟失日志數(shù)據(jù)的硬件上,其他類型的數(shù)據(jù)則花費較少

          可信賴的存儲機制GFS(Google File System)
          1,可信賴的伸縮性存儲是任何程序的核心需求。GFS就是Google的核心存儲平臺
          2,Google File System - 大型分布式結構化日志文件系統(tǒng),Google在里面扔了大量的數(shù)據(jù)
          3,為什么構建GFS而不是利用已有的東西?因為可以自己控制一切并且這個平臺與別的不一樣,Google需要:
          -跨數(shù)據(jù)中心的高可靠性
          -成千上萬的網(wǎng)絡節(jié)點的伸縮性
          -大讀寫帶寬的需求
          -支持大塊的數(shù)據(jù),可能為上千兆字節(jié)
          -高效的跨節(jié)點操作分發(fā)來減少瓶頸
          4,系統(tǒng)有Master和Chunk服務器
          -Master服務器在不同的數(shù)據(jù)文件里保持元數(shù)據(jù)。數(shù)據(jù)以64MB為單位存儲在文件系統(tǒng)中。客戶端與Master服務器交流來在文件上做元數(shù)據(jù)操作并且找到包含用戶需要數(shù)據(jù)的那些Chunk服務器
          -Chunk服務器在硬盤上存儲實際數(shù)據(jù)。每個Chunk服務器跨越3個不同的Chunk服務器備份以創(chuàng)建冗余來避免服務器崩潰。一旦被Master服務器指明,客戶端程序就會直接從Chunk服務器讀取文件
          6,一個上線的新程序可以使用已有的GFS集群或者可以制作自己的GFS集群
          7,關鍵點在于有足夠的基礎組織來讓人們對自己的程序有所選擇,GFS可以調(diào)整來適應個別程序的需求

          使用MapReduce來處理數(shù)據(jù)
          1,現(xiàn)在你已經(jīng)有了一個很好的存儲系統(tǒng),你該怎樣處理如此多的數(shù)據(jù)呢?比如你有許多TB的數(shù)據(jù)存儲在1000臺機器上。數(shù)據(jù)庫不能伸縮或者伸縮到這種級別花費極大,這就是MapReduce出現(xiàn)的原因
          2,MapReduce是一個處理和生成大量數(shù)據(jù)集的編程模型和相關實現(xiàn)。用戶指定一個map方法來處理一個鍵/值對來生成一個中間的鍵/值對,還有一個reduce方法來合并所有關聯(lián)到同樣的中間鍵的中間值。許多真實世界的任務都可以使用這種模型來表現(xiàn)。以這種風格來寫的程序會自動并行的在一個大量機器的集群里運行。運行時系統(tǒng)照顧輸入數(shù)據(jù)劃分、程序在機器集之間執(zhí)行的調(diào)度、機器失敗處理和必需的內(nèi)部機器交流等細節(jié)。這允許程序員沒有多少并行和分布式系統(tǒng)的經(jīng)驗就可以很容易使用一個大型分布式系統(tǒng)資源
          3,為什么使用MapReduce?
          -跨越大量機器分割任務的好方式
          -處理機器失敗
          -可以與不同類型的程序工作,例如搜索和廣告。幾乎任何程序都有map和reduce類型的操作。你可以預先計算有用的數(shù)據(jù)、查詢字數(shù)統(tǒng)計、對TB的數(shù)據(jù)排序等等
          4,MapReduce系統(tǒng)有三種不同類型的服務器
          -Master服務器分配用戶任務到Map和Reduce服務器。它也跟蹤任務的狀態(tài)
          -Map服務器接收用戶輸入并在其基礎上處理map操作。結果寫入中間文件
          -Reduce服務器接收Map服務器產(chǎn)生的中間文件并在其基礎上處理reduce操作
          5,例如,你想在所有Web頁面里的字數(shù)。你將存儲在GFS里的所有頁面拋入MapReduce。這將在成千上萬臺機器上同時進行并且所有的調(diào)整、工作調(diào)度、失敗處理和數(shù)據(jù)傳輸將自動完成
          -步驟類似于:GFS -> Map -> Shuffle -> Reduction -> Store Results back into GFS
          -在MapReduce里一個map操作將一些數(shù)據(jù)映射到另一個中,產(chǎn)生一個鍵值對,在我們的例子里就是字和字數(shù)
          -Shuffling操作聚集鍵類型
          -Reduction操作計算所有鍵值對的綜合并產(chǎn)生最終的結果
          6,Google索引操作管道有大約20個不同的map和reduction。
          7,程序可以非常小,如20到50行代碼
          8,一個問題是掉隊者。掉隊者是一個比其他程序慢的計算,它阻塞了其他程序。掉隊者可能因為緩慢的IO或者臨時的CPU不能使用而發(fā)生。解決方案是運行多個同樣的計算并且當一個完成后殺死所有其他的
          9,數(shù)據(jù)在Map和Reduce服務器之間傳輸時被壓縮了。這可以節(jié)省帶寬和I/O。

          在BigTable里存儲結構化數(shù)據(jù)
          1,BigTable是一個大伸縮性、錯誤容忍、自管理的系統(tǒng),它包含千千兆的內(nèi)存和1000000000000000的存儲。它可以每秒鐘處理百萬的讀寫
          2,BigTable是一個構建于GFS之上的分布式哈希機制。它不是關系型數(shù)據(jù)庫。它不支持join或者SQL類型查詢
          3,它提供查詢機制來通過鍵訪問結構化數(shù)據(jù)。GFS存儲存儲不透明的數(shù)據(jù)而許多程序需求有結構化數(shù)據(jù)
          4,商業(yè)數(shù)據(jù)庫不能達到這種級別的伸縮性并且不能在成千上萬臺機器上工作
          5,通過控制它們自己的低級存儲系統(tǒng)Google得到更多的控制權來改進它們的系統(tǒng)。例如,如果它們想讓跨數(shù)據(jù)中心的操作更簡單這個特性,它們可以內(nèi)建它
          6,系統(tǒng)運行時機器可以自由的增刪而整個系統(tǒng)保持工作
          7,每個數(shù)據(jù)條目存儲在一個格子里,它可以通過一個行key和列key或者時間戳來訪問
          8,每一行存儲在一個或多個tablet中。一個tablet是一個64KB塊的數(shù)據(jù)序列并且格式為SSTable
          9,BigTable有三種類型的服務器:
          -Master服務器分配tablet服務器,它跟蹤tablet在哪里并且如果需要則重新分配任務
          -Tablet服務器為tablet處理讀寫請求。當tablet超過大小限制(通常是100MB-200MB)時它們拆開tablet。當一個Tablet服務器失敗時,則100個Tablet服務器各自挑選一個新的tablet然后系統(tǒng)恢復。
          -Lock服務器形成一個分布式鎖服務。像打開一個tablet來寫、Master調(diào)整和訪問控制檢查等都需要互斥
          10,一個locality組可以用來在物理上將相關的數(shù)據(jù)存儲在一起來得到更好的locality選擇
          11,tablet盡可能的緩存在RAM里

          硬件
          1,當你有很多機器時你怎樣組織它們來使得使用和花費有效?
          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,庫是構建程序的卓越方式
          3,一些程序作為服務提供
          4,一個基礎組織處理程序的版本,這樣它們可以發(fā)布而不用害怕會破壞什么東西

          Google將來的方向
          1,支持地理位置分布的集群
          2,為所有數(shù)據(jù)創(chuàng)建一個單獨的全局名字空間。當前的數(shù)據(jù)由集群分離
          3,更多和更好的自動化數(shù)據(jù)遷移和計算
          4,解決當使用網(wǎng)絡劃分來做廣闊區(qū)域的備份時的一致性問題(例如保持服務即使一個集群離線維護或由于一些損耗問題)

          學到的東西
          1,基礎組織是有競爭性的優(yōu)勢。特別是對Google而言。Google可以很快很廉價的推出新服務,并且伸縮性其他人很難達到。許多公司采取完全不同的方式。許多公司認為基礎組織開銷太大。Google認為自己是一個系統(tǒng)工程公司,這是一個新的看待軟件構建的方式
          2,跨越多個數(shù)據(jù)中心仍然是一個未解決的問題。大部分網(wǎng)站都是一個或者最多兩個數(shù)據(jù)中心。我們不得不承認怎樣在一些數(shù)據(jù)中心之間完整的分布網(wǎng)站是很需要技巧的
          3,如果你自己沒有時間從零開始重新構建所有這些基礎組織你可以看看Hadoop。Hadoop是這里很多同樣的主意的一個開源實現(xiàn)
          4,平臺的一個優(yōu)點是初級開發(fā)人員可以在平臺的基礎上快速并且放心的創(chuàng)建健全的程序。如果每個項目都需要發(fā)明同樣的分布式基礎組織的輪子,那么你將陷入困境因為知道怎樣完成這項工作的人相對較少
          5,協(xié)同工作不一直是擲骰子。通過讓系統(tǒng)中的所有部分一起工作則一個部分的改進將幫助所有的部分。改進文件系統(tǒng)則每個人從中受益而且是透明的。如果每個項目使用不同的文件系統(tǒng)則在整個堆棧中享受不到持續(xù)增加的改進
          6,構建自管理系統(tǒng)讓你沒必要讓系統(tǒng)關機。這允許你更容易在服務器之間平衡資源、動態(tài)添加更大的容量、讓機器離線和優(yōu)雅的處理升級
          7,創(chuàng)建可進化的基礎組織,并行的執(zhí)行消耗時間的操作并采取較好的方案
          8,不要忽略學院。學院有許多沒有轉變?yōu)楫a(chǎn)品的好主意。Most of what Google has done has prior art, just not prior large scale deployment.
          9,考慮壓縮。當你有許多CPU而IO有限時壓縮是一個好的選擇。



          本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。
          posted on 2008-03-18 13:18 Jack.Wang 閱讀(3645) 評論(5)  編輯  收藏 所屬分類: 架構師篇

          Feedback

          # re: Google 架構之學習 2008-03-19 11:53 草根網(wǎng)
          好文,收藏至20ju.com  回復  更多評論
            

          # re: Google 架構之學習 2008-03-20 13:00 深圳SEO
          你自己的分析?
          和實際差別很大啊



          http://www.shenzhenseo.org.cn
            回復  更多評論
            

          # re: Google 架構之學習 2008-03-20 15:21 Jack.Wang
          原文:Google Architecture
          樓上沒看到  回復  更多評論
            

          # re: Google 架構之學習 2008-04-21 15:14 chinetman
          這些東西怎么知道的?
          不會夸張吧?  回復  更多評論
            

          # re: Google 架構之學習 2010-01-16 18:03 happy
          http://blog.sina.com.cn/mpl398235717  回復  更多評論
            

          主站蜘蛛池模板: 黄浦区| 石嘴山市| 阿拉善左旗| 信宜市| 香港| 潞城市| 鲁甸县| 柳州市| 涞源县| 临澧县| 兴义市| 阿拉尔市| 马关县| 砚山县| 恩平市| 五指山市| 伊吾县| 乃东县| 东莞市| 西华县| 太康县| 乳山市| 萝北县| 左权县| 华池县| 鄄城县| 皮山县| 莒南县| 乌苏市| 凤山市| 江都市| 永平县| 建昌县| 牟定县| 柯坪县| 信丰县| 宁津县| 资溪县| 扎囊县| 中卫市| 甘肃省|