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