網(wǎng)站擴展實例:1億用戶、50億pv的Tagged架構(gòu)進化史
譯文【51CTO 8月16日外電頭條】一家2004年創(chuàng)建的試水社交網(wǎng)站,經(jīng)過7年的成長和擴展,現(xiàn)在已經(jīng)擁有了1億用戶。平均50億次的pv,承擔在1000多臺服務(wù)器的網(wǎng)站架構(gòu)上。本文將要介紹的就是這個叫Tagged的網(wǎng)站——Tagged架構(gòu)實例:1億個用戶、1千臺服務(wù)器和50億次頁面瀏覽量。下面,Tagged的CTO兼聯(lián)合創(chuàng)始人 Johann Schleier-Smith 將為我們介紹Tagged網(wǎng)站架構(gòu)的成長歷程。
自2004年以來,Tagged從一家試水社交領(lǐng)域的小不點網(wǎng)站,逐漸變成全球***的社交網(wǎng)絡(luò)之一,數(shù)百萬的成員訪問該網(wǎng)站以結(jié)交新成員,每個月的頁面瀏覽量達到50億次。這個逐步發(fā)展的歷程迫使我們Tagged不斷完善網(wǎng)站架構(gòu),最終獲得了功能異常強大的平臺。
***個階段:2004年,PHP Web應(yīng)用程序、10萬個用戶和15臺服務(wù)器
孵化器有著一種快速成型文化:每年通常推出兩個新概念,尋覓其中的大贏家。正是在這樣的文化中,Tagged 應(yīng)運而生。LAMP是適合這種類型的工作的自然選擇;這種工作注重靈活性和快速開發(fā)周期。當時,Java開發(fā)主要面向大企業(yè)的開發(fā)工作,Python吸引的編程員***,Perl方面的編程員又不是我們所要的那一種。我們還知道,雅虎是PHP的大力支持者;所以一旦有需要,完全有可能擴展業(yè)務(wù)規(guī)模。
我在以前的項目上運行MySQL方面有著豐富的經(jīng)歷,這讓我對這項技術(shù)愛恨交加。本著嘗試的精神,我們?yōu)門agged購買了幾份入門級Oracle許可證,看看甲骨文的技術(shù)是不是用起來更好。
值得注意的是,許多構(gòu)建的小型網(wǎng)站仍然就像早期的Tagged。具有一種簡單的美;無狀態(tài)的PHP與有狀態(tài)的Oracle之間的雙向分離正是一臺服務(wù)器中最棘手的部分,而額外的Web顯示計算能力很容易添加。
第二個階段:2005年,緩存PHP Web應(yīng)用程序、100萬個用戶和20臺服務(wù)器
即使只有在8臺服務(wù)器的時候,Tagged的網(wǎng)站流量也要比大多數(shù)人所知道的來得多。幸運的是,分布式內(nèi)存緩存系統(tǒng)memcached帶來了兩個優(yōu)勢:既消除了90%以上的數(shù)據(jù)庫讀操作,又確保含有大量不同信息的社交網(wǎng)絡(luò)面面可以迅速顯示。
自一開始,我們的對象緩存注重顯式緩存更新,支持更簡單的技術(shù),比如刪除無效的鍵;或者根據(jù)計時器,使失效數(shù)據(jù)無效。這種方法的缺點是代碼比較復(fù)雜,但大幅減輕了數(shù)據(jù)庫負載,而且使網(wǎng)站保持快速運行,涉及經(jīng)常更新的對象時更是如此。
我們的網(wǎng)站繼續(xù)越來越復(fù)雜,在標準的社交網(wǎng)絡(luò)功能(交友、個人檔案和訊息)的基礎(chǔ)上,添加了搜索和社交發(fā)現(xiàn)等功能。我的團隊說服我使用Java來建立搜索功能,那樣我們就能得益于Lucene庫。當我們學(xué)會了讓Java順暢運行后,我有一種如釋重負的感覺;我早期用過JDK 1.0,感覺不爽,所以不大情愿使用Java,但是后來卻對這個平臺滿懷熱情。
第三個階段:2006年,數(shù)據(jù)庫擴展、1000萬個用戶和100臺服務(wù)器
此時Tagged已擁有1000萬個注冊用戶,隨時都有成千上萬個用戶在線,我們開始著手解決我一直憂心忡忡的挑戰(zhàn)。那時我們剛籌集到了一筆資金,竭力尋求發(fā)展,但是數(shù)據(jù)庫亟需添加容量。我們進行了一次又一次的緩存或SQL調(diào)整和優(yōu)化,但服務(wù)器的處理器其占用率還是會一再逼近100%大關(guān)。
向上擴展系統(tǒng)的想法是個權(quán)宜之計,但是多插座服務(wù)器硬件動輒數(shù)百萬美元,于是我們選擇了Oracle真正應(yīng)用集群RAC,該系統(tǒng)讓我們可以使用標準網(wǎng)絡(luò)系統(tǒng)來連接數(shù)量眾多的大眾化Linux主機,以構(gòu)建一個龐大的數(shù)據(jù)庫。再結(jié)合***處理器具有的優(yōu)勢,Oracle RAC的容量比我們的***臺數(shù)據(jù)庫服務(wù)器足足增加了20倍,這一點很重要,而且允許應(yīng)用程序開發(fā)人員可以繼續(xù)致力于開發(fā)新的功能特性。
Tagged通過結(jié)合來自一個龐大內(nèi)存中數(shù)據(jù)集的統(tǒng)計數(shù)字,開始提供個性化的人員匹配(people-matching)推薦服務(wù)。用PHP實現(xiàn)這一點完全不現(xiàn)實,于是Java進一步滲透到了我們的環(huán)境中。
第四個階段:2007年,數(shù)據(jù)庫拆分、5000萬個用戶和500臺服務(wù)器
毫無疑問,拆分數(shù)據(jù)庫是***有難度的任務(wù),也是在擴展Tagged方面***有成效的技術(shù)。由于在多個數(shù)據(jù)庫之間分割用戶,我們最終擁有了這種設(shè)計:在所有地方都允許我們只要添加硬件,就可以進行擴展。
我們Tagged的一條規(guī)定是,將每個表分成64個分區(qū);我們牢牢遵守這個不成文的規(guī)定,除非有著非常誘人的理由才允許有例外。只有得益于游戲玩家之間高性能受保護事務(wù)的某些游戲才在單獨的數(shù)據(jù)庫中垂直分區(qū)。
拆分現(xiàn)有的數(shù)據(jù)意味著針對數(shù)TB的數(shù)據(jù)進行復(fù)雜的轉(zhuǎn)換工作。一開始,我們每次逐個著手解決功能特性,依賴應(yīng)用程序代碼來代替連接(join),但***我們還是在應(yīng)用程序的核心部分遇到了一大批表,這些表的結(jié)合得太緊密了,這個方法行不通。于是我們編寫了生成SQL的遷移代碼,導(dǎo)出、轉(zhuǎn)換和重新裝入了數(shù)億行的數(shù)據(jù),并使用觸發(fā)器來跟蹤源系統(tǒng)上面出現(xiàn)的變化,逐漸更新目標,那樣***的同步所帶來的停運時間不到30分鐘。
擁有許多數(shù)據(jù)庫意味著擁有許多的數(shù)據(jù)庫連接。尤其是由于我們添加了更多的“社交發(fā)現(xiàn)”功能(比如我們的***項約會功能Meet Me),拆分工作可能會讓PHP不堪重負,畢竟PHP缺少甲骨文的連接池技術(shù)。為了解決這個問題,我們開發(fā)了一款Java應(yīng)用程序,負責提供運行查詢的Web服務(wù);該應(yīng)用程序還繼續(xù)提供一個非常方便的監(jiān)控點,便于輕松自如地處理數(shù)據(jù)庫故障。
第五個階段:2010年,架構(gòu)完善和擴展、8000萬個用戶和1000臺服務(wù)器
這次我們把時間提前幾年。解決了關(guān)鍵的數(shù)據(jù)庫擴展性問題后,我們發(fā)現(xiàn)通過添加硬件來支持擴展相當容易。PHP和memcached繼續(xù)很好地服務(wù)于我們,支持功能特性的快速開發(fā)。
在這一段期間,擴展性方面的考量因素轉(zhuǎn)向了減少故障和應(yīng)對越來越多的易損壞部件所帶來的威脅。通過負載均衡器的運行狀況檢查和自動關(guān)閉毫無反應(yīng)的服務(wù),實現(xiàn)了針對Web層的全方位保護,避免了各種相關(guān)問題。我們在設(shè)計核心組件的架構(gòu)時還考慮到了彈性;比如說,如果memcached系統(tǒng)因連接過多而出現(xiàn)過載,那么一旦這個負擔卸下,它必須立即復(fù)原。
Java扮演了極其重要的角色,一方面歸因于Java越來越得到接受,擁有相應(yīng)專長的人也越來越多;另一方面是由于面臨的挑戰(zhàn)越來越多。為了對付垃圾郵件及其他濫用現(xiàn)象,我們的算法充分利用了龐大的共享內(nèi)存空間,還充分利用了計算密集型方法。社交游戲也得益于Java的高性能和并發(fā)控制,但面臨的代價是系統(tǒng)很復(fù)雜;現(xiàn)在不同的應(yīng)用程序池比以前多得多,有待我們加以管理。
展望未來
如今,Tagged每個月給數(shù)百萬成員帶來50億次的頁面瀏覽量。由于我們獲得了可擴展的設(shè)計,因而可以將大部分精力花在構(gòu)建能夠更好地服務(wù)于用戶的功能特性上。我們擁有開發(fā)可擴展軟件的高效工具,但我們可以設(shè)想工具會出色得多,于是目前的精力和資源主要集中于軟件庫,提高編程人員的效率和生產(chǎn)力,并且改進Stig——Stig是我們即將推出的采用開源技術(shù)的基于圖形的數(shù)據(jù)庫項目,該項目為大規(guī)模的社交網(wǎng)絡(luò)、實時服務(wù)和云應(yīng)用系統(tǒng)而設(shè)計。
原文:Tagged Architecture - Scaling To 100 Million Users, 1000 Servers, And 5 Billion Page Views
【編輯推薦】