Google目前Alexa排名第1。它誕生于1997年,當時是一個研究性項目,每個月build一次索引,build出來的索引通過(guò)sharding(shard by doc)的方式分散到多台服務器(Index Server)上,具體的網頁數據同樣(yàng)通過(guò)sharding的方式分散到多台服務器(Doc Server)上,當用戶提交請求時,通過(guò)前端的一台服務器將(jiāng)請求提交給Index Server獲得打了分的倒排索引,然後(hòu)從Doc Server提取具體的網頁信息(例如網頁标題、搜索關鍵詞匹配的片段信息等),最終展現給用戶。
随著(zhe)索引的網頁增加,這(zhè)個結構可通過(guò)增加Index Server以及Doc Server來存儲索引以及網頁的數據,但仍然會面(miàn)臨其他很多方面(miàn)的問題,于是在這(zhè)之後(hòu)的十多年的時間裡(lǐ),Google做了很多事(shì)情來改進(jìn)上面(miàn)的結構。
1999年,Google增加了一個Cache Cluster,用來Cache查詢的索引結果和文檔片段信息,同時將(jiāng)Index Server和Doc Server通過(guò)Replicate的方式變成(chéng)了Cluster。這(zhè)兩(liǎng)個改造帶來的好(hǎo)處是網站的響應速度、可支撐的訪問量以及可用性(Availability)得到了提升。這(zhè)個變化造成(chéng)了成(chéng)本的增加,Google在硬件方面(miàn)的風格始終是不用昂貴的高端硬件,而是在軟件層面(miàn)來保證系統的可靠性及高性能(néng),于是同年,Google開(kāi)始采用自行設計的服務器來降低成(chéng)本。2000年,Google開(kāi)始自行設計DataCenter,采用了各種(zhǒng)方法(例如采用其他的制冷方法來替代空調)來優化PUE(能(néng)源利用率),同時對(duì)自行設計的服務器也做了很多化。2001年,Google對(duì)Index的格式進(jìn)行了修改,將(jiāng)所有的Index放入内存, 這(zhè)次改造帶來的好(hǎo)處是網站的響應速度以及可支撐的訪問量得到了極大的提升。2003年,Google發(fā)表了文章Google Cluster Architecture,其Cluster結構組成(chéng)爲硬件LB+Index Cluster+Doc Cluster+大量廉價服務器(例如IDE硬盤、性價比高的CPU等),通過(guò)并行處理+sharding來保證在降低對(duì)硬件要求的同時,響應速度仍然很快。同年Google發(fā)表了關于Google文件系統的論文(GFS在2000年就已經(jīng)上線),這(zhè)篇論文很大程度也體現了Google不用昂貴硬件的風格,通過(guò)GFS+大量廉價的服務器即可存儲大量的數據。2004年,Google再次對(duì)Index的格式進(jìn)行了修改,使得網站的響應速度繼續提升。同年Google發(fā)表關于MapReduce的論文,通過(guò)MapReduce+大量廉價的服務器即可快速完成(chéng)以前要使用昂貴小型機、中型機甚至是大型機才能(néng)完成(chéng)的計算任務,而這(zhè)顯然對(duì)于Google快速地構建索引提供了很大的幫助。2006年,Google發(fā)表了關于BigTable的論文(2003年開(kāi)始上線),使得海量數據的分析能(néng)夠達到在線系統的要求了,這(zhè)對(duì)于Google提升網站的響應速度起(qǐ)到了很大的幫助。
以上3篇論文徹底改變了業界對(duì)于海量數據的存儲、分析和檢索的方法(小道(dào)消息:Google内部已完成(chéng)了GFS、MapReduce、BigTable的替換),也奠定了Google在業界的技術領導地位。
在一些場景中,Google也采用MySQL來存儲數據。同樣(yàng),Google對(duì)MySQL也做了很多修改,它使用的MySQL信息可以從https://code.google.com/p/google-mysql/了解。
2007年,Google將(jiāng)build索引的時間縮短到分鍾級,當新網頁出現後(hòu),幾分鍾後(hòu)即可在Google搜索到,同時將(jiāng)Index Cluster通過(guò)Protocol Buffers對(duì)外提供Service,以供Google各種(zhǒng)搜索(例如網頁、圖片、新聞、書籍等)使用,除了Index Cluster提供的Service外,還(hái)有很多其他的Service,例如廣告、詞法檢查等。Google的一次搜索大概需要調用内部50個以上的Service,Service主要用C++或Java來編寫。2009年,Google的一篇《How Google uses Linux》文章,揭示了Google在提升機器利用率方面(miàn)也做了很多的努力,例如將(jiāng)不同資源消耗類型的應用部署在同一台機器上。
在之後(hòu),Google又研發(fā)了Colossus(下一代類GFS文件系統)、Spanner(下一代類BigTable海量存儲和計算架構)、實時搜索(基于Colossus實現),主要都(dōu)是爲了提升搜索的實時性以及存儲更多數據。除了在海量數據相關技術上的革新外,Google也不斷對(duì)業界的傳統技術進(jìn)行創新,例如提高TCP的初始擁塞窗口值、改進(jìn)HTTP的SPDY協議、新的圖片格式WebP等。
在Google的發(fā)展過(guò)程中,其技術的改造主要圍繞在可伸縮性、性能(néng)、成(chéng)本和可用性4個方面(miàn),Google不采用昂貴硬件的風格以及領先其他網站的數據量決定了其技術改造基本都(dōu)是對(duì)傳統的軟硬件技術的革新。
Facebook目前Alexa排名第2。它采用LAMP構建,随著(zhe)業務的發(fā)展,它也在技術上做了很多改造。
作爲改造的第一步,Facebook首先在LAMP結構中增加了Memcached,用來緩存各種(zhǒng)數據,從而大幅度提升系統的響應時間以及可支撐的訪問量,之後(hòu)又增加了Services層,將(jiāng)News Feed、Search等較通用的功能(néng)作爲Service提供給前端的PHP系統使用,前端的系統通過(guò)Thrift訪問這(zhè)些Service。Facebook采用了多種(zhǒng)語言來編寫各種(zhǒng)不同的Service,主要是針對(duì)不同的場景選擇合适的語言,例如C++、Java、Erlang。
大量使用Memcached以及訪問量的不斷上漲,導緻訪問Memcached的網絡流量太大,交換機無法支撐,Facebook通過(guò)改造采用UDP的方式來訪問Memcached,以降低單連接上的網絡流量。除此之外,還(hái)有其他一些改造,具體信息可以查看http://on.fb.me/8R0C。
PHP作爲腳本語言,優勢是開(kāi)發(fā)簡單、易上手,劣勢是需要消耗較多的CPU和内存。當Facebook的訪問量增長(cháng)到了一定規模後(hòu),這(zhè)個劣勢就比較突出了,于是從2007年起(qǐ),Facebook就嘗試多種(zhǒng)方法來解決這(zhè)個問題,最後(hòu)誕生于Facebook Hackathon的HipHop産品成(chéng)功地脫穎而出。HipHop可以自動將(jiāng)PHP轉化爲C++代碼,Facebook在使用HipHop後(hòu),同等配置的機器,可支撐的請求量是之前的6倍,CPU的使用率平均下降了50%,從而爲Facebook節省了大量主機。將(jiāng)來Facebook還(hái)會對(duì)HipHop進(jìn)行再次改進(jìn),通過(guò)HipHop將(jiāng)PHP編譯爲bytecode,放入HipHop VM中執行,再由HipHop VM來編譯爲機器代碼,方式與JIT類似。
2009年,Facebook研發(fā)了BigPipe,借助此系統,Facebook成(chéng)功讓網站的速度提升了兩(liǎng)倍。随著(zhe)Facebook訪問量的上漲,收集衆多服務器上的執行日志也開(kāi)始面(miàn)臨挑戰,于是Facebook研發(fā)了Scribe來解決此問題。對(duì)于存儲在MySQL中的數據,Facebook采用垂直拆分庫和水平拆分表的方式來支撐不斷增長(cháng)的數據量。作爲Facebook技術體系中重要的一環,Facebook也對(duì)MySQL進(jìn)行了很多優化和改進(jìn),例如Online Schema Change等,更多信息可見http://www.facebook.com/MySQLAtFacebook。
發(fā)展之初的Facebook采用了高端的存儲設備(例如NetApp、Akamai)來存圖片,随著(zhe)圖片不斷增加,成(chéng)本也大幅提高,于是2009年Facebook開(kāi)發(fā)了Haystack來存儲圖片。Haystack可采用廉價的PC Server進(jìn)行存儲,大幅度降低了成(chéng)本。
Facebook除了使用MySQL存儲數據外,近幾年也開(kāi)始摸索采用新的方式。在2008年Facebook開(kāi)發(fā)了Cassandra,在Message Inbox Search中作爲新的存儲方式。不過(guò)在2010年,Facebook又放棄了Cassandra,轉爲采用HBase作爲其Messages的存儲,并在2011年將(jiāng)HBase應用在了Facebook更多的項目上(例如Puma、ODS)。據說,現在Facebook更是在嘗試將(jiāng)其用戶以及關系數據從MySQL遷移到HBase。
從2009年開(kāi)始,Facebook嘗試自行設計DataCenter以及服務器,以降低其運行成(chéng)本,并對(duì)外開(kāi)放了其構建的PUE僅1.07的DataCenter的相關技術。Facebook在技術方面(miàn)的基本原則是:“在能(néng)用開(kāi)源産品的情況下就用開(kāi)源,根據情況對(duì)其進(jìn)行優化并反饋給社區”。從Facebook的技術發(fā)展曆程上可以看到這(zhè)個原則貫徹始終,Facebook的技術改造也主要是圍繞在可伸縮、性能(néng)、成(chéng)本和可用性4個方面(miàn)。
Twitter目前Alexa排名第8。在2006年誕生之時是采用Ruby On Rails+ MySQL構建的,2007年增加了Memcached作爲Cache層,以提升響應速度。基于Ruby on Rails讓Twitter享受到了快速的開(kāi)發(fā)能(néng)力,但随著(zhe)訪問量的增長(cháng),其對(duì)CPU和内存的消耗也讓Twitter痛苦不堪,于是Twitter做了不少改造和努力,例如編寫了一個優化版的Ruby GC。
2008年Twitter決定逐步往Java遷移,選擇了Scala作爲主力的開(kāi)發(fā)語言(理由是“難以向(xiàng)一屋子的Ruby程序員推銷Java”),采用Thrift作爲其主要的通信框架,開(kāi)發(fā)了Finagle作爲其Service Framework,可將(jiāng)後(hòu)端各種(zhǒng)功能(néng)暴露爲Service提供給前端系統使用,使得前端系統無需關心各種(zhǒng)不同的通信協議(例如對(duì)于使用者可以用同樣(yàng)的調用服務的方式去訪問Memcache、Redis、Thrift服務端),開(kāi)發(fā)了Kestrel作爲其消息中間件(替代之前用Ruby寫的Starling)。
Twitter的數據存儲一直采用MySQL,發(fā)展過(guò)程中出現的小插曲是,當Facebook開(kāi)源了Cassandra時,Twitter本計劃使用,但最終還(hái)是放棄,仍然保持了使用MySQL,Twitter的MySQL版本已開(kāi)源(https://github.com/twitter/mysql)。Twitter也是采用分庫分表的方式來支撐大數據量,使用Memcached來Cache tweet,timeline的信息則遷移爲用Redis來Cache。
2010年,Twitter在鹽湖城擁有了第一個自建的DataCenter,主要是爲了增加可控性。從Twitter的發(fā)展過(guò)程看,6年來它的技術改造主要圍繞可伸縮以及可用性。
作爲一家電子商務網站的員工,請允許我在此介紹這(zhè)個Alexa排名21的著名電子商務網站的技術演變。
1995年,eBay誕生,當時采用CGI編寫,數據庫采用的是GDBM,最多隻能(néng)支撐5萬件在線商品。1997年,eBay將(jiāng)操作系統從FreeBSD遷移到Windows NT,另外將(jiāng)數據庫從GDBM遷移爲Oracle。1999年,eBay將(jiāng)前端系統改造爲Cluster(之前隻有一台主機),采用Resonate作爲負載均衡,後(hòu)端的Oracle機器升級爲Sun E1000小型機,同年給數據庫增加了一台機器作爲備庫,提升可用性。前端機器随著(zhe)訪問量不斷增加還(hái)可以應付,但數據庫機器在1999年11月時已經(jīng)達到了瓶頸(已經(jīng)不能(néng)再加CPU和内存了),于是在11月開(kāi)始將(jiāng)數據庫按業務拆分爲多個庫。2001-2002年,eBay將(jiāng)數據表進(jìn)行了水平拆分,例如按類目存儲商品,同時部署Oracle的小型機換爲Sun A3500。2002年,將(jiāng)整個網站遷移爲用Java構建,在這(zhè)個階段,做了DAL框架來屏蔽數據庫分庫分表帶來的影響,同時還(hái)設計了一個開(kāi)發(fā)框架以供開(kāi)發(fā)人員更好(hǎo)地上手進(jìn)行功能(néng)開(kāi)發(fā)。從eBay的整個發(fā)展過(guò)程來看,技術改造主要圍繞在可伸縮性和可用性兩(liǎng)點。
騰訊目前Alexa排名第9。最初QQ IM采用的是單台接入服務器來處理用戶的登錄和狀态保持,但在發(fā)展到一百萬用戶同時在線時,這(zhè)台服務器已經(jīng)無法支撐。于是QQ IM將(jiāng)所有單台服務器改造爲了集群,并增加了狀态同步服務器,由其完成(chéng)集群内狀态的同步,用戶的信息存儲在MySQL中,做了分庫分表,好(hǎo)友關系存儲在自行實現的文件存儲中。爲了提升進(jìn)程間通信的效率,騰訊自行實現了用戶态IPC。之後(hòu)騰訊將(jiāng)狀态同步服務器也改造爲同步集群,以支撐越來越多的在線用戶。在經(jīng)曆了前面(miàn)幾次改造後(hòu),已基本能(néng)支撐千萬級别的用戶同時在線,但可用性比較差,于是騰訊對(duì)QQ IM再次進(jìn)行改造,實現了同城跨IDC的容災,加強了監控和運維系統的建設。此後(hòu)騰訊決定對(duì)QQ IM架構完全重寫(大概是2009年持續到現在),主要是爲了增強靈活性、支持跨城市的IDC、支撐千萬級的好(hǎo)友。在這(zhè)次大的技術改造過(guò)程中,騰訊的數據都(dōu)不再存儲于MySQL中,而是全部存儲在了自己設計的系統裡(lǐ)。
從QQ IM的技術演變來看,其技術改造主要是圍繞在可伸縮性和可用性上。
2003年,淘寶誕生,直接購買了一個商業的phpAuction的軟件,在此基礎上改造産生了淘寶。2004年,將(jiāng)系統由PHP遷移到Java,MySQL遷移爲Oracle(小型機、高端存儲設備),應用服務器采用了WebLogic。2005-2007年的發(fā)展過(guò)程中,用JBoss替代了WebLogic,對(duì)數據庫進(jìn)行了分庫,基于BDB做了分布式緩存,自行開(kāi)發(fā)了分布式文件系統TFS以支持小文件的存儲,并建設了自己的CDN。2007-2009年對(duì)應用系統進(jìn)行垂直拆分,拆分後(hòu)的系統都(dōu)以Service的方式對(duì)外提供功能(néng),對(duì)數據采用了垂直和水平拆分。
在進(jìn)行了數據的垂直和水平拆分後(hòu),Oracle産生的成(chéng)本越來越高,于是在之後(hòu)的幾年,淘寶又開(kāi)始將(jiāng)數據逐漸從Oracle遷移到MySQL,同時開(kāi)始嘗試新型的數據存儲方案,例如采用HBase來支撐曆史交易訂單的存儲和檢索等。近幾年淘寶開(kāi)始進(jìn)行Linux内核、JVM、Nginx等軟件的修改定制工作,同時也自行設計了低能(néng)耗服務器,同時在軟硬件上進(jìn)行優化,以更好(hǎo)地降低成(chéng)本。
從淘寶的整個發(fā)展過(guò)程來看,技術改造主要圍繞在可伸縮性和可用性兩(liǎng)點,現在也開(kāi)始逐漸將(jiāng)精力投入在了性能(néng)和成(chéng)本上。目前淘寶的Alexa排名爲第14。
總結
從上面(miàn)這(zhè)些Alexa排名靠前網站的技術發(fā)展過(guò)程來看,每家網站由于其所承擔的業務不同、團隊人員組成(chéng)不同、做事(shì)風格相異,在技術的不同發(fā)展階段中會采用不同的方法來支撐業務的發(fā)展,但基本都(dōu)會圍繞在可伸縮性、可用性、性能(néng)以及成(chéng)本這(zhè)4點上,在發(fā)展到比較大規模後(hòu),各網站在技術結構上有了很多的相似點,并且這(zhè)些結構還(hái)將(jiāng)繼續進(jìn)行演變。
作者林昊,目前就職于淘寶,2007-2010年負責設計和實現淘寶的服務框架,此服務框架在淘寶大面(miàn)積使用,每天承擔了150億+的請求;2011年開(kāi)始負責HBase在淘寶的落地,目前淘寶已有20個以上的在線項目在使用HBase。[轉載自騰訊網]