MySpace已經(jīng)成為全球眾口皆碑的社區(qū)網(wǎng)站之王。盡管一流和營(yíng)銷(xiāo)和管理經(jīng)驗(yàn)自然是每個(gè)IT企業(yè)取得成功的首要因素,但是我們卻拋棄這一點(diǎn),而主要著眼于探討在數(shù)次面臨系統(tǒng)擴(kuò)張的緊急關(guān)頭MySpace是如何從技術(shù)方面采取應(yīng)對(duì)策略的。
MySpace信息系統(tǒng)發(fā)展歷程:
第一代架構(gòu)—添置更多的Web服務(wù)器
MySpace最初的系統(tǒng)很小,只有兩臺(tái)Web服務(wù)器(分擔(dān)處理用戶請(qǐng)求的工作量)和一個(gè)數(shù)據(jù)庫(kù)服務(wù)器(所有數(shù)據(jù)都存儲(chǔ)在這一個(gè)地方)。那時(shí)使用的是Dell雙CPU、4G內(nèi)存的系統(tǒng)。在早期階段,MySpace基本是通過(guò)添置更多Web服務(wù)器來(lái)對(duì)付用戶暴增問(wèn)題的。但到在2004年早期,在 MySpace用戶數(shù)增長(zhǎng)到五十萬(wàn)后,其數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)開(kāi)始疲于奔命了。
第二代架構(gòu)—增加數(shù)據(jù)庫(kù)服務(wù)器
與增加Web服務(wù)器不同,增加數(shù)據(jù)庫(kù)并沒(méi)那么簡(jiǎn)單。如果一個(gè)站點(diǎn)由多個(gè)數(shù)據(jù)庫(kù)支持,設(shè)計(jì)者必須考慮的是,如何在保證數(shù)據(jù)一致性的前提下讓多個(gè)數(shù)據(jù)庫(kù)分擔(dān)壓力。
MySpace運(yùn)行在三個(gè)SQL Server數(shù)據(jù)庫(kù)服務(wù)器上—一個(gè)為主,所有的新數(shù)據(jù)都向它提交,然后由它復(fù)制到其它兩個(gè);另兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器全力向用戶供給數(shù)據(jù),用以在博客和個(gè)人資料 欄顯示。這種方式在一段時(shí)間內(nèi)效果很好——只要增加數(shù)據(jù)庫(kù)服務(wù)器,加大硬盤(pán),就可以應(yīng)對(duì)用戶數(shù)和訪問(wèn)量的增加。
這一次的數(shù)據(jù)庫(kù)架構(gòu)按照垂直分割模式設(shè)計(jì),不同的數(shù)據(jù)庫(kù)服務(wù)于站點(diǎn)的不同功能,如登錄、用戶資料和博客。垂直分割策略利于多個(gè)數(shù)據(jù)庫(kù)分擔(dān)訪問(wèn)壓力,當(dāng)用戶要求增加新功能時(shí),MySpace只需要投入新的數(shù)據(jù)庫(kù)加以支持。在賬戶到達(dá)二百萬(wàn)后,MySpace還從存儲(chǔ)設(shè)備與數(shù)據(jù)庫(kù)服務(wù)器直接交互的方 式切換到SAN(存儲(chǔ)區(qū)域網(wǎng)絡(luò))—用高帶寬、專(zhuān)門(mén)設(shè)計(jì)的網(wǎng)絡(luò)將大量磁盤(pán)存儲(chǔ)設(shè)備連接在一起,而數(shù)據(jù)庫(kù)連接到SAN。這項(xiàng)措施極大提升了系統(tǒng)性能、正常運(yùn)行時(shí)間和可靠性。然而,當(dāng)用戶繼續(xù)增加到三百萬(wàn)后,垂直分割策略也變得難以維持下去。
第三代架構(gòu)—轉(zhuǎn)到分布式計(jì)算架構(gòu)
幾經(jīng)折騰,最終,MySpace將目光移到分布式計(jì)算架構(gòu)——它在物理上分布的眾多服務(wù)器,整體必須邏輯上等同于單臺(tái)機(jī)器。拿數(shù)據(jù)庫(kù)來(lái)說(shuō),就不 能再像過(guò)去那樣將應(yīng)用拆分,再以不同數(shù)據(jù)庫(kù)分別支持,而必須將整個(gè)站點(diǎn)看作一個(gè)應(yīng)用。現(xiàn)在,數(shù)據(jù)庫(kù)模型里只有一個(gè)用戶表,支持博客、個(gè)人資料和其他核心功能的數(shù)據(jù)都存儲(chǔ)在相同數(shù)據(jù)庫(kù)。
既然所有的核心數(shù)據(jù)邏輯上都組織到一個(gè)數(shù)據(jù)庫(kù),那么MySpace必須找到新的辦法以分擔(dān)負(fù)荷——顯然,運(yùn)行在普通硬件上的單個(gè)數(shù)據(jù)庫(kù)服務(wù)器是 無(wú)能為力的。這次,不再按站點(diǎn)功能和應(yīng)用分割數(shù)據(jù)庫(kù),MySpace開(kāi)始將它的用戶按每百萬(wàn)一組分割,然后將各組的全部數(shù)據(jù)分別存入獨(dú)立的SQL Server實(shí)例。目前,MySpace的每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器實(shí)際運(yùn)行兩個(gè)SQL Server實(shí)例,也就是說(shuō)每臺(tái)服務(wù)器服務(wù)大約二百萬(wàn)用戶。據(jù)MySpace的技術(shù)人員說(shuō),以后還可以按照這種模式以更小粒度劃分架構(gòu),從而優(yōu)化負(fù)荷分擔(dān)。
第四代架構(gòu)—求助于微軟方案
2005年早期,賬戶達(dá)到九百萬(wàn),MySpace開(kāi)始用微軟的C#編寫(xiě)ASP.NET程序。在收到一定成效后,MySpace開(kāi)始大規(guī)模遷移到 ASP.NET。用戶達(dá)到一千萬(wàn)時(shí),MySpace再次遭遇存儲(chǔ)瓶頸問(wèn)題。SAN的引入解決了早期一些性能問(wèn)題,但站點(diǎn)目前的要求已經(jīng)開(kāi)始周期性超越 SAN的I/O容量——即它從磁盤(pán)存儲(chǔ)系統(tǒng)讀寫(xiě)數(shù)據(jù)的極限速度。
第五代架構(gòu)—增加數(shù)據(jù)緩存層并轉(zhuǎn)到支持64位處理器的SQL Server 2005
2005年春天,MySpace賬戶達(dá)到一千七百萬(wàn),MySpace又啟用了新的策略以減輕存儲(chǔ)系統(tǒng)壓力,即增加數(shù)據(jù)緩存層——位于Web服務(wù) 器和數(shù)據(jù)庫(kù)服務(wù)器之間,其唯一職能是在內(nèi)存中建立被頻繁請(qǐng)求數(shù)據(jù)對(duì)象的副本,如此一來(lái),不訪問(wèn)數(shù)據(jù)庫(kù)也可以向Web應(yīng)用供給數(shù)據(jù)。
2005年中期,服務(wù)賬戶數(shù)達(dá)到兩千六百萬(wàn)時(shí),MySpace因?yàn)槲覀儗?duì)內(nèi)存的渴求而切換到了還處于beta測(cè)試的支持64位處理器的SQL Server 2005。升級(jí)到SQL Server 2005和64位Windows Server 2003后,MySpace每臺(tái)服務(wù)器配備了32G內(nèi)存,后于2006年再次將配置標(biāo)準(zhǔn)提升到64G。
事實(shí)上,MySpace的Web服務(wù)器和數(shù)據(jù)庫(kù)仍然經(jīng)常發(fā)生超負(fù)荷,其用戶頻繁遭遇“意外錯(cuò)誤”和“站點(diǎn)離線維護(hù)”等告示,他們不得不在論壇抱怨不停……
MySpace正是在這樣不斷重構(gòu)站點(diǎn)軟件、數(shù)據(jù)庫(kù)和存儲(chǔ)系統(tǒng)中,才一步步走到今天。事實(shí)上,MySpace已經(jīng)成功解決了很多系統(tǒng)擴(kuò)展性問(wèn) 題,其中存在相當(dāng)?shù)慕?jīng)驗(yàn)值得我們借鑒。MySpace系統(tǒng)架構(gòu)到目前為止保持了相對(duì)穩(wěn)定,但其技術(shù)人員仍然在為SQL Server支持的同時(shí)連接數(shù)等方面繼續(xù)攻堅(jiān),盡可能把事情做到最好。
雖然自2005年早期,站點(diǎn)賬戶數(shù)超過(guò)7百萬(wàn)后,系統(tǒng)架構(gòu)到目前為止保持了相對(duì)穩(wěn)定,但MySpace仍然在為SQL Server支持的同時(shí)連接數(shù)等方面繼續(xù)攻堅(jiān)。
里程碑一:50萬(wàn)賬戶
MySpace最初的系統(tǒng)很小,只有兩臺(tái)Web服務(wù)器和一個(gè)數(shù)據(jù)庫(kù)服務(wù)器。那時(shí)使用的是Dell雙路CPU、4G內(nèi)存的系統(tǒng)。
單個(gè)數(shù)據(jù)庫(kù)就意味著所有數(shù)據(jù)都存儲(chǔ)在一個(gè)地方,再由兩臺(tái)Web服務(wù)器分擔(dān)處理用戶請(qǐng)求的工作量。但就像MySpace后來(lái)的幾次底層系統(tǒng)修訂時(shí) 的情況一樣,三服務(wù)器架構(gòu)很快不堪重負(fù)。此后一個(gè)時(shí)期內(nèi),MySpace基本是通過(guò)添置更多Web服務(wù)器來(lái)對(duì)付用戶暴增問(wèn)題的。
但到在2004年早期,MySpace用戶數(shù)增長(zhǎng)到50萬(wàn)后,數(shù)據(jù)庫(kù)服務(wù)器也已開(kāi)始汗流浹背。
但和Web服務(wù)器不同,增加數(shù)據(jù)庫(kù)可沒(méi)那么簡(jiǎn)單。如果一個(gè)站點(diǎn)由多個(gè)數(shù)據(jù)庫(kù)支持,設(shè)計(jì)者必須考慮的是,如何在保證數(shù)據(jù)一致性的前提下,讓多個(gè)數(shù)據(jù)庫(kù)分擔(dān)壓力。
在第二代架構(gòu)中,MySpace運(yùn)行在3個(gè)SQL Server數(shù)據(jù)庫(kù)服務(wù)器上——一個(gè)為主,所有的新數(shù)據(jù)都向它提交,然后由它復(fù)制到其他兩個(gè);另兩個(gè)全力向用戶供給數(shù)據(jù),用以在博客和個(gè)人資料欄顯示。這種方式在一段時(shí)間內(nèi)效果很好——只要增加數(shù)據(jù)庫(kù)服務(wù)器,加大硬盤(pán),就可以應(yīng)對(duì)用戶數(shù)和訪問(wèn)量的增加。
里程碑二:1-2百萬(wàn)賬戶
MySpace注冊(cè)數(shù)到達(dá)1百萬(wàn)至2百萬(wàn)區(qū)間后,數(shù)據(jù)庫(kù)服務(wù)器開(kāi)始受制于I/O容量——即它們存取數(shù)據(jù)的速度。而當(dāng)時(shí)才是2004年中,距離上 次數(shù)據(jù)庫(kù)系統(tǒng)調(diào)整不過(guò)數(shù)月。用戶的提交請(qǐng)求被阻塞,就像千人樂(lè)迷要擠進(jìn)只能容納幾百人的夜總會(huì),站點(diǎn)開(kāi)始遭遇”主要矛盾”,Benedetto說(shuō),這意味著MySpace永遠(yuǎn)都會(huì)輕度落后于用戶需求。
有人花5分鐘都無(wú)法完成留言,因此用戶總是抱怨說(shuō)網(wǎng)站已經(jīng)完蛋了。這一次的數(shù)據(jù)庫(kù)架構(gòu)按照垂直分割模式設(shè)計(jì),不同的數(shù)據(jù)庫(kù)服務(wù)于站點(diǎn)的不同功能,如登錄、用戶資料和博客。于是,站點(diǎn)的擴(kuò)展性問(wèn)題看似又可以告一段落了,可以歇一陣子。
垂直分割策略利于多個(gè)數(shù)據(jù)庫(kù)分擔(dān)訪問(wèn)壓力,當(dāng)用戶要求增加新功能時(shí),MySpace將投入新的數(shù)據(jù)庫(kù)予以支持它。賬戶到達(dá)2百萬(wàn) 后,MySpace還從存儲(chǔ)設(shè)備與數(shù)據(jù)庫(kù)服務(wù)器直接交互的方式切換到SAN(Storage Area Network,存儲(chǔ)區(qū)域網(wǎng)絡(luò))——用高帶寬、專(zhuān)門(mén)設(shè)計(jì)的網(wǎng)絡(luò)將大量磁盤(pán)存儲(chǔ)設(shè)備連接在一起,而數(shù)據(jù)庫(kù)連接到SAN。這項(xiàng)措施極大提升了系統(tǒng)性能、正常運(yùn)行時(shí)間和可靠性。
里程碑三:3百萬(wàn)賬戶
當(dāng)用戶繼續(xù)增加到3百萬(wàn)后,垂直分割策略也開(kāi)始難以為繼。盡管站點(diǎn)的各個(gè)應(yīng)用被設(shè)計(jì)得高度獨(dú)立,但有些信息必須共享。在這個(gè)架構(gòu)里,每個(gè)數(shù)據(jù)庫(kù)必須有各自的用戶表副本——MySpace授權(quán)用戶的電子花名冊(cè)。這就意味著一個(gè)用戶注冊(cè)時(shí),該條賬戶記錄必須在9個(gè)不同數(shù)據(jù)庫(kù)上分別創(chuàng)建。但在個(gè)別情況 下,如果其中某臺(tái)數(shù)據(jù)庫(kù)服務(wù)器臨時(shí)不可到達(dá),對(duì)應(yīng)事務(wù)就會(huì)失敗,從而造成賬戶非完全創(chuàng)建,最終導(dǎo)致此用戶的該項(xiàng)服務(wù)無(wú)效。
另外一個(gè)問(wèn)題是,個(gè)別應(yīng)用如博客增長(zhǎng)太快,那么專(zhuān)門(mén)為它服務(wù)的數(shù)據(jù)庫(kù)就有巨大壓力。
2004年中,MySpace面臨Web開(kāi)發(fā)者稱(chēng)之為”向上擴(kuò)展”對(duì)”向外擴(kuò)展”(譯者注:Scale Up和Scale Out,也稱(chēng)硬件擴(kuò)展和軟件擴(kuò)展)的抉擇——要么擴(kuò)展到更大更強(qiáng)、也更昂貴的服務(wù)器上,要么部署大量相對(duì)便宜的服務(wù)器來(lái)分擔(dān)數(shù)據(jù)庫(kù)壓力。一般來(lái)說(shuō),大型站點(diǎn)傾向于向外擴(kuò)展,因?yàn)檫@將讓它們得以保留通過(guò)增加服務(wù)器以提升系統(tǒng)能力的后路。
但成功地向外擴(kuò)展架構(gòu)必須解決復(fù)雜的分布式計(jì)算問(wèn)題,大型站點(diǎn)如Google、Yahoo和Amazon.com,都必須自行研發(fā)大量相關(guān)技術(shù)。以Google為例,它構(gòu)建了自己的分布式文件系統(tǒng)。
另外,向外擴(kuò)展策略還需要大量重寫(xiě)原來(lái)軟件,以保證系統(tǒng)能在分布式服務(wù)器上運(yùn)行。”搞不好,開(kāi)發(fā)人員的所有工作都將白費(fèi)”,Benedetto 說(shuō)。因此,MySpace首先將重點(diǎn)放在了向上擴(kuò)展上,花費(fèi)了大約1個(gè)半月時(shí)間研究升級(jí)到32CPU服務(wù)器以管理更大數(shù)據(jù)庫(kù)的問(wèn)題。Benedetto 說(shuō),”那時(shí)候,這個(gè)方案看似可能解決一切問(wèn)題。”如穩(wěn)定性,更棒的是對(duì)現(xiàn)有軟件幾乎沒(méi)有改動(dòng)要求。
糟糕的是,高端服務(wù)器極其昂貴,是購(gòu)置同樣處理能力和內(nèi)存速度的多臺(tái)服務(wù)器總和的很多倍。而且,站點(diǎn)架構(gòu)師預(yù)測(cè),從長(zhǎng)期來(lái)看,即便是巨型數(shù)據(jù)庫(kù),最后也會(huì)不堪重負(fù),Benedetto說(shuō),”換句話講,只要增長(zhǎng)趨勢(shì)存在,我們最后無(wú)論如何都要走上向外擴(kuò)展的道路。”
因此,MySpace最終將目光移到分布式計(jì)算架構(gòu)——它在物理上分布的眾多服務(wù)器,整體必須邏輯上等同于單臺(tái)機(jī)器。拿數(shù)據(jù)庫(kù)來(lái)說(shuō),就不能再像 過(guò)去那樣將應(yīng)用拆分,再以不同數(shù)據(jù)庫(kù)分別支持,而必須將整個(gè)站點(diǎn)看作一個(gè)應(yīng)用。現(xiàn)在,數(shù)據(jù)庫(kù)模型里只有一個(gè)用戶表,支持博客、個(gè)人資料和其他核心功能的數(shù)據(jù)都存儲(chǔ)在相同數(shù)據(jù)庫(kù)。
既然所有的核心數(shù)據(jù)邏輯上都組織到一個(gè)數(shù)據(jù)庫(kù),那么MySpace必須找到新的辦法以分擔(dān)負(fù)荷——顯然,運(yùn)行在普通硬件上的單個(gè)數(shù)據(jù)庫(kù)服務(wù)器是 無(wú)能為力的。這次,不再按站點(diǎn)功能和應(yīng)用分割數(shù)據(jù)庫(kù),MySpace開(kāi)始將它的用戶按每百萬(wàn)一組分割,然后將各組的全部數(shù)據(jù)分別存入獨(dú)立的SQL Server實(shí)例。目前,MySpace的每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器實(shí)際運(yùn)行兩個(gè)SQL Server實(shí)例,也就是說(shuō)每臺(tái)服務(wù)器服務(wù)大約2百萬(wàn)用戶。Benedetto指出,以后還可以按照這種模式以更小粒度劃分架構(gòu),從而優(yōu)化負(fù)荷分擔(dān)。
當(dāng)然,還是有一個(gè)特殊數(shù)據(jù)庫(kù)保存了所有賬戶的名稱(chēng)和密碼。用戶登錄后,保存了他們其他數(shù)據(jù)的數(shù)據(jù)庫(kù)再接管服務(wù)。特殊數(shù)據(jù)庫(kù)的用戶表雖然龐大,但它只負(fù)責(zé)用戶登錄,功能單一,所以負(fù)荷還是比較容易控制的。
里程碑四:9百萬(wàn)到1千7百萬(wàn)賬戶
2005年早期,賬戶達(dá)到9百萬(wàn)后,MySpace開(kāi)始用Microsoft的C#編寫(xiě)ASP.NET程序。C#是C語(yǔ)言的最新派生語(yǔ)言,吸收 了C++和Java的優(yōu)點(diǎn),依托于Microsoft .NET框架(Microsoft為軟件組件化和分布式計(jì)算而設(shè)計(jì)的模型架構(gòu))。ASP.NET則由編寫(xiě)Web站點(diǎn)腳本的ASP技術(shù)演化而來(lái),是 Microsoft目前主推的Web站點(diǎn)編程環(huán)境。
可以說(shuō)是立竿見(jiàn)影, MySpace馬上就發(fā)現(xiàn)ASP.NET程序運(yùn)行更有效率,與ColdFusion相比,完成同樣任務(wù)需消耗的處理器能力更小。據(jù)技術(shù)總監(jiān) Whitcomb說(shuō),新代碼需要150臺(tái)服務(wù)器完成的工作,如果用ColdFusion則需要246臺(tái)。Benedetto還指出,性能上升的另一個(gè)原因可能是在變換軟件平臺(tái),并用新語(yǔ)言重寫(xiě)代碼的過(guò)程中,程序員復(fù)審并優(yōu)化了一些功能流程。
最終,MySpace開(kāi)始大規(guī)模遷移到ASP.NET。即便剩余的少部分ColdFusion代碼,也從Cold-Fusion服務(wù)器搬到了 ASP.NET,因?yàn)樗麄兊玫搅?span lang="EN-US">BlueDragon.NET(喬治亞州阿爾法利塔New Atlanta Communications公司的產(chǎn)品,它能將ColdFusion代碼自動(dòng)重新編譯到Microsoft平臺(tái))的幫助。
賬戶達(dá)到1千萬(wàn)時(shí),MySpace再次遭遇存儲(chǔ)瓶頸問(wèn)題。SAN的引入解決了早期一些性能問(wèn)題,但站點(diǎn)目前的要求已經(jīng)開(kāi)始周期性超越SAN的I/O容量——即它從磁盤(pán)存儲(chǔ)系統(tǒng)讀寫(xiě)數(shù)據(jù)的極限速度。
原因之一是每數(shù)據(jù)庫(kù)1百萬(wàn)賬戶的分割策略,通常情況下的確可以將壓力均分到各臺(tái)服務(wù)器,但現(xiàn)實(shí)并非一成不變。比如第七臺(tái)賬戶數(shù)據(jù)庫(kù)上線后,僅僅7天就被塞滿了,主要原因是佛羅里達(dá)一個(gè)樂(lè)隊(duì)的歌迷瘋狂注冊(cè)。
某個(gè)數(shù)據(jù)庫(kù)可能因?yàn)槿魏卧颍谌魏螘r(shí)候遭遇主要負(fù)荷,這時(shí),SAN中綁定到該數(shù)據(jù)庫(kù)的磁盤(pán)存儲(chǔ)設(shè)備簇就可能過(guò)載。”SAN讓磁盤(pán)I/O能力大幅提升了,但將它們綁定到特定數(shù)據(jù)庫(kù)的做法是錯(cuò)誤的。”Benedetto說(shuō)。
最初,MySpace通過(guò)定期重新分配SAN中數(shù)據(jù),以讓其更為均衡的方法基本解決了這個(gè)問(wèn)題,但這是一個(gè)人工過(guò)程,”大概需要兩個(gè)人全職工作。”Benedetto說(shuō)。
長(zhǎng)期解決方案是遷移到虛擬存儲(chǔ)體系上,這樣,整個(gè)SAN被當(dāng)作一個(gè)巨型存儲(chǔ)池,不再要求每個(gè)磁盤(pán)為特定應(yīng)用服務(wù)。MySpace目前采用了一種新型SAN設(shè)備——來(lái)自加利福尼亞州弗里蒙特的3PARdata。
在3PAR的系統(tǒng)里,仍能在邏輯上按容量劃分?jǐn)?shù)據(jù)存儲(chǔ),但它不再被綁定到特定磁盤(pán)或磁盤(pán)簇,而是散布于大量磁盤(pán)。這就使均分?jǐn)?shù)據(jù)訪問(wèn)負(fù)荷成為可能。當(dāng)數(shù)據(jù)庫(kù)需要寫(xiě)入一組數(shù)據(jù)時(shí),任何空閑磁盤(pán)都可以馬上完成這項(xiàng)工作,而不再像以前那樣阻塞在可能已經(jīng)過(guò)載的磁盤(pán)陣列處。而且,因?yàn)槎鄠€(gè)磁盤(pán)都有數(shù)據(jù)副 本,讀取數(shù)據(jù)時(shí),也不會(huì)使SAN的任何組件過(guò)載。
當(dāng)2005年春天賬戶數(shù)達(dá)到1千7百萬(wàn)時(shí),MySpace又啟用了新的策略以減輕存儲(chǔ)系統(tǒng)壓力,即增加數(shù)據(jù)緩存層——位于Web服務(wù)器和數(shù)據(jù)庫(kù) 服務(wù)器之間,其唯一職能是在內(nèi)存中建立被頻繁請(qǐng)求數(shù)據(jù)對(duì)象的副本,如此一來(lái),不訪問(wèn)數(shù)據(jù)庫(kù)也可以向Web應(yīng)用供給數(shù)據(jù)。換句話說(shuō),100個(gè)用戶請(qǐng)求同一份 資料,以前需要查詢(xún)數(shù)據(jù)庫(kù)100次,而現(xiàn)在只需1次,其余都可從緩存數(shù)據(jù)中獲得。當(dāng)然如果頁(yè)面變化,緩存的數(shù)據(jù)必須從內(nèi)存擦除,然后重新從數(shù)據(jù)庫(kù)獲取—— 但在此之前,數(shù)據(jù)庫(kù)的壓力已經(jīng)大大減輕,整個(gè)站點(diǎn)的性能得到提升。
緩存區(qū)還為那些不需要記入數(shù)據(jù)庫(kù)的數(shù)據(jù)提供了驛站,比如為跟蹤用戶會(huì)話而創(chuàng)建的臨時(shí)文件——Benedetto坦言他需要在這方面補(bǔ)課,”我是數(shù)據(jù)庫(kù)存儲(chǔ)狂熱分子,因此我總是想著將萬(wàn)事萬(wàn)物都存到數(shù)據(jù)庫(kù)。”但將像會(huì)話跟蹤這類(lèi)的數(shù)據(jù)也存到數(shù)據(jù)庫(kù),站點(diǎn)將陷入泥沼。
里程碑五:2千6百萬(wàn)賬戶
2005年中期,服務(wù)賬戶數(shù)達(dá)到2千6百萬(wàn)時(shí),MySpace切換到了還處于beta測(cè)試的SQL Server 2005。轉(zhuǎn)換何太急?主流看法是2005版支持64位處理器。但Benedetto說(shuō),”這不是主要原因,盡管這也很重要;主要還是因?yàn)槲覀儗?duì)內(nèi)存的渴 求。”支持64位的數(shù)據(jù)庫(kù)可以管理更多內(nèi)存。
更多內(nèi)存就意味著更高的性能和更大的容量。原來(lái)運(yùn)行32位版本的SQL Server服務(wù)器,能同時(shí)使用的內(nèi)存最多只有4G。切換到64位,就好像加粗了輸水管的直徑。升級(jí)到SQL Server 2005和64位Windows Server 2003后,MySpace每臺(tái)服務(wù)器配備了32G內(nèi)存,后于2006年再次將配置標(biāo)準(zhǔn)提升到64G。
意外錯(cuò)誤促進(jìn)系統(tǒng)健康成長(zhǎng)
如果沒(méi)有對(duì)系統(tǒng)架構(gòu)的歷次修改與升級(jí),MySpace根本不可能走到今天。但是,為什么系統(tǒng)還經(jīng)常吃撐著了?很多用戶抱怨的”意外錯(cuò)誤”是怎么引起的呢?
原因之一是MySpace對(duì)Microsoft的Web技術(shù)的應(yīng)用已經(jīng)進(jìn)入連Microsoft自己也才剛剛開(kāi)始探索的領(lǐng)域。比如11月,超出 SQL Server最大同時(shí)連接數(shù),MySpace系統(tǒng)崩潰。Benedetto說(shuō),這類(lèi)可能引發(fā)系統(tǒng)崩潰的情況大概三天才會(huì)出現(xiàn)一次,但仍然過(guò)于頻繁了,以致 惹人惱怒。一旦數(shù)據(jù)庫(kù)罷工,”無(wú)論這種情況什么時(shí)候發(fā)生,未緩存的數(shù)據(jù)都不能從SQL Server獲得,那么你就必然看到一個(gè)’意外錯(cuò)誤’提示。”他解釋說(shuō)。
去年夏天,MySpace的Windows 2003多次自動(dòng)停止服務(wù)。后來(lái)發(fā)現(xiàn)是操作系統(tǒng)一個(gè)內(nèi)置功能惹的禍——預(yù)防分布式拒絕服務(wù)攻擊(黑客使用很多客戶機(jī)向服務(wù)器發(fā)起大量連接請(qǐng)求,以致服務(wù)器癱瘓)。MySpace和其他很多頂級(jí)大站點(diǎn)一樣,肯定會(huì)經(jīng)常遭受攻擊,但它應(yīng)該從網(wǎng)絡(luò)級(jí)而不是依靠Windows本身的功能來(lái)解決問(wèn)題——否則,大量 MySpace合法用戶連接時(shí)也會(huì)引起服務(wù)器反擊。
“我們花了大約一個(gè)月時(shí)間尋找Windows 2003服務(wù)器自動(dòng)停止的原因。”Benedetto說(shuō)。最后,通過(guò)Microsoft的幫助,他們才知道該怎么通知服務(wù)器:”別開(kāi)槍?zhuān)怯衍姟?span lang="EN-US">”
緊接著是在去年7月某個(gè)周日晚上,MySpace總部所在地洛杉磯停電,造成整個(gè)系統(tǒng)停運(yùn)12小時(shí)。大型Web站點(diǎn)通常要在地理上分布配置多個(gè) 數(shù)據(jù)中心以預(yù)防單點(diǎn)故障。本來(lái),MySpace還有其他兩個(gè)數(shù)據(jù)中心以應(yīng)對(duì)突發(fā)事件,但Web服務(wù)器都依賴(lài)于部署在洛杉磯的SAN。沒(méi)有洛杉磯的 SAN,Web服務(wù)器除了懇求你耐心等待,不能提供任何服務(wù)。
Benedetto說(shuō),主數(shù)據(jù)中心的可靠性通過(guò)下列措施保證:可接入兩張不同電網(wǎng),另有后備電源和一臺(tái)儲(chǔ)備有30天燃料的發(fā)電機(jī)。但在這次事故中,不僅兩張電網(wǎng)失效,而且在切換到備份電源的過(guò)程中,操作員燒掉了主動(dòng)力線路。
2007年中,MySpace在另兩個(gè)后備站點(diǎn)上也建設(shè)了SAN。這對(duì)分擔(dān)負(fù)荷大有幫助——正常情況下,每個(gè)SAN都能負(fù)擔(dān)三分之一的數(shù)據(jù)訪問(wèn)量。而在緊急情況下,任何一個(gè)站點(diǎn)都可以獨(dú)立支撐整個(gè)服務(wù),Benedetto說(shuō)。
MySpace仍然在為提高穩(wěn)定性?shī)^斗,雖然很多用戶表示了足夠信任且能原諒偶現(xiàn)的錯(cuò)誤頁(yè)面。
“作為開(kāi)發(fā)人員,我憎惡Bug,它太氣人了。”Dan Tanner這個(gè)31歲的德克薩斯軟件工程師說(shuō),他通過(guò)MySpace重新聯(lián)系到了高中和大學(xué)同學(xué)。”不過(guò),MySpace對(duì)我們的用處很大,因此我們可 以原諒偶發(fā)的故障和錯(cuò)誤。” Tanner說(shuō),如果站點(diǎn)某天出現(xiàn)故障甚至崩潰,恢復(fù)以后他還是會(huì)繼續(xù)使用。
這就是為什么Drew在論壇里咆哮時(shí),大部分用戶都告訴他應(yīng)該保持平靜,如果等幾分鐘,問(wèn)題就會(huì)解決的原因。Drew無(wú)法平靜,他寫(xiě)道,”我已 經(jīng)兩次給MySpace發(fā)郵件,而它說(shuō)一小時(shí)前還是正常的,現(xiàn)在出了點(diǎn)問(wèn)題……完全是一堆廢話。”另一個(gè)用戶回復(fù)說(shuō),”畢竟它是免費(fèi) 的。”Benedetto坦承100%的可靠性不是他的目標(biāo)。”它不是銀行,而是一個(gè)免費(fèi)的服務(wù)。”他說(shuō)。
換句話說(shuō),MySpace的偶發(fā)故障可能造成某人最后更新的個(gè)人資料丟失,但并不意味著網(wǎng)站弄丟了用戶的錢(qián)財(cái)。”關(guān)鍵是要認(rèn)識(shí)到,與保證站點(diǎn)性 能相比,丟失少許數(shù)據(jù)的故障是可接受的。”Benedetto說(shuō)。所以,MySpace甘冒丟失2分鐘到2小時(shí)內(nèi)任意點(diǎn)數(shù)據(jù)的危險(xiǎn),在SQL Server配置里延長(zhǎng)了”checkpoint”操作——它將待更新數(shù)據(jù)永久記錄到磁盤(pán)——的間隔時(shí)間,因?yàn)檫@樣做可以加快數(shù)據(jù)庫(kù)的運(yùn)行。
Benedetto說(shuō),同樣,開(kāi)發(fā)人員還經(jīng)常在幾個(gè)小時(shí)內(nèi)就完成構(gòu)思、編碼、測(cè)試和發(fā)布全過(guò)程。這有引入Bug的風(fēng)險(xiǎn),但這樣做可以更快實(shí)現(xiàn)新 功能。而且,因?yàn)檫M(jìn)行大規(guī)模真實(shí)測(cè)試不具可行性,他們的測(cè)試通常是在僅以部分活躍用戶為對(duì)象,且用戶對(duì)軟件新功能和改進(jìn)不知就里的情況下進(jìn)行的。因?yàn)槭聦?shí)上不可能做真實(shí)的加載測(cè)試,他們做的測(cè)試通常都是針對(duì)站點(diǎn)。