Google,無疑是互聯網時代最閃亮的新星。截止到2008年1月22日,Google美國主站在Alexa排名第二,Alexa Top100中,各國的Google分站竟然霸占了超過20個名額,不得不令人感嘆Google的強大。不論何時,不論何地,也不論你搜索多么冷門的詞匯,只要你的電腦連接互聯網,只要你輕輕點擊“google搜索”,那么這一切相關內容google都會在1秒鐘之內全部搞定,這甚至比你查詢“我的文檔”都要快捷。這也就是為什么Google創業十年,市值超過1500億美金的原因。
有人可能認為谷歌擁有幾臺“藍色基因”那樣的超級計算機來處理各種數據和搜索,事實是怎樣的呢?下面我們就將詳細解析神奇谷歌的神奇架構。
硬件:
截止到2006年,Google大約有45萬臺服務器,有超過200個計算機集群,處理不同地域的不同任務。可惜服務器的詳細配置和最新集群的具體情況,在多個文獻庫里面都查詢不到,我個人理解,這可能屬于商業機密。大概也是因為機密的緣故,強大的Google計算機集群并沒有遞交Top500計算機的申請,多年來我們在Top500中都看不到Google的影子。(進入Top500需要提交并且公開自己計算機系統的詳細配置)不過根據文獻資料,可以肯定的是,這45萬臺服務器都不是什么昂貴的服務器,而是非常普通的PC級別服務器,其中的服務器硬盤在兩年前還普遍是IDE接口、并且采用PC級主板而非昂貴的服務器專用主板。Google的集群也全部是自己搭建的,沒有采用Myricom 的 Myrinet或者Giganet 的 cLAN等先進昂貴的集群連接技術,Google各個數據中心和服務器間不同的耦合程度都隨需而定自行連接。
那么google的存儲呢?Google存儲著海量的資訊,近百億個網頁、數十億張圖片。早在2004年,Google的存儲容量就已經達到了5PB??赡芎芏嘧x者一開始都認為Google采用了諸如EMC Symmetrix系列磁盤陣列來保存大量的資訊,但是Google的實際做法又一次讓我們大跌眼鏡——Google沒有使用任何磁盤陣列,哪怕是低端的磁盤陣列也沒用。Google的方法是將集群中的每一臺PC級服務器,配備兩個普通IDE硬盤來存儲。不過Google倒也不是都是什么設備都落后,至少這些硬盤的轉速都很高,而且每臺服務器的內存也還算比較大。最大的電腦DIY消費者是誰?恐怕Google又登上了這個DIY寶座。Google的絕大部分服務器甚至也不是采購什么大品牌,而是購買各種廉價零件而后自行裝配的。有趣的是,Google非常不滿意現存的各種PC電源的功耗,甚至還自行設計了Google專用服務器電源。
很快,我們就有了疑問。這樣的一個以PC級別服務器搭建起來的系統,怎么能承受巨大的工作負載呢?怎么能保證高可用性呢?的確,這些低端的服務器經常出現故障——硬盤壞道、系統宕機這類的事故其實每天都在45萬臺服務器中發生。而Google的方法是設立鏡像站。以Google主站為例,2003年就在美國硅谷和弗吉尼亞設立了多個鏡像站。這些鏡像站其實不是傳統的鏡像站。真正的鏡像站是雙機熱備,當一臺服務器宕機時,另一臺服務器接管相關任務。而Google的鏡像站其實真正的職責是DNS負載均衡,所以有的Google鏡像站本身還有自己的鏡像站。這里舉例說明Google鏡像站的作用:一個訪問,DNS正常解析到A處,但當A處負載過大時,DNS服務就將域名解析到B處,這樣既達到了冗余,也縮減了投資。由于不是雙機熱備,某一時間,鏡像站的內容可能略有不同,不過對于精確度要求不那么高的普通檢索而言,并不是問題。
平臺:GFS/MapReduce/ BigTable/Linux
GFS/MapReduce/ BigTable/這三個平臺,是谷歌最引以為傲的平臺,全部架構在Linux之上。
首先我們來看一看GFS(Google File System)谷歌文件系統。我們知道,一般的數據中心檢索時候需要用到數據庫系統。但是Google的情況很特殊——Google擁有全球上百億個Web文檔,如果用常規數據庫系統檢索,那么檢索速度就可想而知了。因此,當Crawlers采集到許多新的Web后,Google將很多的Web都匯集到一個文件里進行存儲管理,而且Google將Web文件壓縮成Chunk塊,進一步減少占用空間(64MB一個chunk)。最后,Google只檢索壓縮后的部分。而GFS(Google File System)正是在這樣的檢索技術上構建的文件系統,GFS包括了GFS Master服務器和Chunk服務器。如下圖所示,系統的流程從GFS客戶端開始:GFS客戶端以chunk偏移量制作目錄索引并且發送請求——GFS Master收到請求通過chunk映射表映射反饋客戶端——客戶端有了chunk handle和chunk 位置,并將文件名和chunk的目錄索引緩存,向chunk服務器發送請求——chunk服務器回復請求傳輸chunk數據。
如果讀者您讀著有點迷糊,這很正常,因為只有少數搜索引擎企業才采用這樣的技術。簡單來說是這樣:Google運用GFS大大簡化了檢索的難度。
除了GFS,MapReduce對Google也是功不可沒。Google擁有不少于45萬臺服務器,看起來每臺服務器的職能都非常明確,但是其中卻有重要的協同問題有待解決:如何并發計算,如何分布數據,如何處理失敗,如何負載均衡?我們可以預見,無數的代碼將被用在協同問題上,而且很可能效率低下。這時候,MapReduce就派上用場了。MapReduce是Google開發的C++編程工具,用于大規模數據集的并行運算。MapReduce主要功能是提供了一個簡單強大的接口,可以將計算自動的并發和分布執行。這樣一來,就可以通過普通PC的集群,實現高性能。MapReduce主要從兩方面提升了系統:首先是失效的計算機問題。如果某一臺計算機失效了,或者是I/O出現了問題——這在Google以廉價服務器組建的集群中極為常見,MapReduce的解決方法是用多個計算機同時計算一個任務,一旦一臺計算機有了結果,其它計算機就停止該任務,而進入下一任務。另外,在MapReduce之間傳輸的數據都是經過壓縮的,節省了很多帶寬資源。至于BigTable,這是一個用來處理大數據量的系統,適合處理半結構化的數據。
Google心經:
Google總是嘗試用最少的錢,做最多的事情。不要小看那些便宜、不牢靠的PC級服務器,一臺服務器也許確實不牢靠,但是45萬臺的有機集成卻成為了全球最完善、最穩定的系統之一。在采購服務器方面,谷歌也從未一次性大量購買,都是有了需求再選購。另一個能夠體現Google精打細算的方面是Google盡量壓縮所有能夠壓縮的文件。
包括軟件和硬件,Google的設計構想都很前衛,Google嘗試過許多還在實驗室里的萌芽技術,如上文所說,很多都取得了巨大成功。谷歌早先的目標是0.5秒鐘做出搜索結果,但實際上目前的平均時間已經縮減到了0.25秒。而且,谷歌從來沒有停止研究的腳步,現在還在測試OpenSoalris,觀察OpenSoalris是否能夠替代Linux。
Google的行為非常踏實。不參加Top500評選,文獻里也鮮有相關資料??梢姽雀璨淮祰u、也沒有過度宣傳,只是勤勤懇懇的更新程序、優化集群。今天,google收錄了絕大多數人類語言的網頁,并且在多數國家都建立了Google分站,收錄的網頁也是與日俱增,全球影響力更是不言而喻。
向谷歌的架構學習,向谷歌的成就致敬。