一、 web2.0網(wǎng)站常用可用性功能模塊分析
二、 Flickr的幕后故事
三、 YouTube 的架構(gòu)擴展
四、 mixi.jp:使用開源軟件搭建的可擴展SNS網(wǎng)站
五、 Technorati的后臺數(shù)據(jù)庫架構(gòu)
六、 通過了解MySpace的六次重構(gòu)經(jīng)歷,來認識分布式系統(tǒng)到底該如何創(chuàng)建
七、 從LiveJournal后臺發(fā)展看大規(guī)模網(wǎng)站性能優(yōu)化方法
八、 說說大型高并發(fā)高負載網(wǎng)站的系統(tǒng)架構(gòu)
一、 web2.0網(wǎng)站常用可用性功能模塊分析
Web 2.0網(wǎng)站是指將傳統(tǒng)的網(wǎng)站構(gòu)架(平臺、內(nèi)容源、用戶、傳播方式等)轉(zhuǎn)化到以用戶為核心的網(wǎng)站構(gòu)架上來,包括一系列體現(xiàn)web2.0概念的元素、定位和創(chuàng) 意。web2.0網(wǎng)站在構(gòu)架上須體現(xiàn)兩大宗旨,即強大的后臺系統(tǒng)和簡單的前臺頁面,也即提供良好的用戶體驗,體現(xiàn)以人為本,技術(shù)服務(wù)人類的宗旨。
web2.0網(wǎng)站常用功能塊通常包括以下幾大項:
1.Tag標(biāo)簽功能塊
Tag(中文叫做"標(biāo)簽") 是一種新的組織和管理在線信息的方式。它不同于傳統(tǒng)的、針對文件本身的關(guān)鍵字檢索,而是一種模糊化、智能化的分類。
網(wǎng)頁使用Tag標(biāo)簽的好處:
為頁面設(shè)置一個或者多個Tag標(biāo)簽可以引導(dǎo)讀者閱讀更多相關(guān)文章,為別人帶去流量同理也為自己帶來流量。
可以幫助讀者及時了解一些未知的概念和知識點,提高用戶體驗。
Tag是人的意志和趨向的體現(xiàn),Tag可以幫助你找到興趣相投的人。
基于以上優(yōu)勢,Tag標(biāo)簽代替了傳統(tǒng)的分類法,成為web2.0網(wǎng)站使用率最高的功能塊(與其說是功能塊倒不如說是一種內(nèi)容導(dǎo)航和內(nèi)容組織形式)。
一句話:Tag標(biāo)簽是一種更靈活的分類方法,功能在于引導(dǎo),特點是無處不在,體現(xiàn)智能性、模糊性和趨向性。
2.RSS訂閱功能塊
RSS是在線共享內(nèi)容的一種簡易方式(也叫聚合內(nèi)容,Really Simple Syndication)。通常在時效性比較強的內(nèi)容上使用RSS訂閱能更快速獲取信息,網(wǎng)站提供RSS輸出,有利于讓用戶獲取網(wǎng)站內(nèi)容的最新更新。網(wǎng)絡(luò) 用戶可以在客戶端借助于支持RSS的聚合工具軟件(例如SharpReader,NewzCrawler、FeedDemon),在不打開網(wǎng)站內(nèi)容頁面的 情況下閱讀支持RSS輸出的網(wǎng)站內(nèi)容。
RSS訂閱的方式:
訂閱到客戶端軟件如周伯通、遨游瀏覽器RSS閱讀、Foxmail RSS閱讀等,此方式使用者較多
訂閱到在線閱讀(聚合類)門戶網(wǎng)站如Google Reader,Yahoo Reader,抓蝦、Gougou等,省去了安裝RSS閱讀器的麻煩
訂閱到在線單用戶聚合器如Lilina等,比較靈活
RSS訂閱功能的最大好處是定向投遞,也就是說RSS機制更能體現(xiàn)用戶的意愿和個性,獲取信息的方式也最直接和簡單,這是RSS訂閱功能備受青睞的一大主要原因。
3.推薦和收藏功能塊
說到推薦功能,不僅web2.0網(wǎng)站在大量使用,傳統(tǒng)的以cms平臺為代表的內(nèi)容模式的網(wǎng)站也在大量使用,推薦功能主要是指向一些網(wǎng)摘或者聚合類門戶網(wǎng)站推薦自己所瀏覽到的網(wǎng)頁。當(dāng)然,一種變相的推薦就是閱讀者的自我收藏行為,在共享的模式下也能起到推薦的作用。
比較有名的推薦目標(biāo)有以del.icio.us為代表的網(wǎng)摘類網(wǎng)站包括國內(nèi)比較有名氣的365key、和訊網(wǎng)摘、新浪vivi、天極網(wǎng)摘等。這 里值得一提的是前段時間曾涌現(xiàn)了大批網(wǎng)摘類網(wǎng)站,但他們堅持活下來的好像沒有幾個了,推薦使用前面提到的這幾個網(wǎng)摘門戶,人氣基本上是使最旺的。
4.評論和留言功能塊
web2.0強調(diào)參與性,強調(diào)發(fā)揮用戶的主導(dǎo)作用,這里的參與性除了所謂的訂閱、推薦功能外更多地體現(xiàn)在用戶對內(nèi)容的評價和態(tài)度,這就要靠評論 功能塊來完成。一個典型的web2.0網(wǎng)站或者說一個能體現(xiàn)人氣的web2.0網(wǎng)站都會花大量篇幅來體現(xiàn)用戶的觀點和視覺。這里尤其要提到web2.0中 的帶頭老大web blog,評論功能已經(jīng)成為博客主人與瀏覽者交流的主要陣地,是體現(xiàn)網(wǎng)站人氣的最直觀因素。
評論功能塊應(yīng)用在博客系統(tǒng)中實際上已經(jīng)和博客內(nèi)容相分離,而更好的應(yīng)用恰恰是一些以點評為主的web2.0網(wǎng)站比如豆瓣、點評網(wǎng)等,這里的評論功能塊直接制造了內(nèi)容也極大地體現(xiàn)了網(wǎng)站的人氣,所以說評論功能塊是web2.0網(wǎng)站最有力的武器。
5.站內(nèi)搜索功能塊
搜索是信息來源最直接的方式之一,無論你的網(wǎng)站是否打上web2.0的烙印,搜索對于一個體系龐大、內(nèi)容豐富的大型網(wǎng)站都是非常必要的。Tag 標(biāo)簽在某種程度上起到搜索的作用,它能夠有效聚合以此Tag為關(guān)鍵詞的內(nèi)容,但這種情況的前提是此Tag標(biāo)簽對瀏覽者是可見的,也就是說當(dāng)Tag標(biāo)簽擺在 瀏覽者的眼前時才成立,而對于那些瀏覽者想要的信息卻沒有Tag標(biāo)簽來引導(dǎo)時搜索就是達到此目的的最好方法。
對于web2.0網(wǎng)站,站內(nèi)搜索以標(biāo)題或者Tag為搜索域都能起到好的效果,但本人不建議使用內(nèi)容搜索域,因為這不符合搜索的高效性原則。同 時,具有突出關(guān)鍵詞的內(nèi)容往往都可以用Tag標(biāo)簽來引導(dǎo),因此使用內(nèi)容域來搜索實際上是一種浪費服務(wù)器資源的行為,而且搜索結(jié)果的準(zhǔn)確性將大打折扣。
6.群組功能塊
我為什么要把群組作為web2.0網(wǎng)站的功能塊來分析呢,因為群組是web2.0網(wǎng)站的一大特點,也是web2.0所要體現(xiàn)的服務(wù)宗旨所在。一 個web2.0網(wǎng)站,博客也好、播客也好、點評也好,抑或是網(wǎng)摘、聚合門戶,他們都強調(diào)人的參與性。物以類聚、人以群分,每個參與者都有自己的興趣趨向, web2.0網(wǎng)站的另一主要功能就是幫助這些人找到同樣興趣的人并形成一個活躍的群體,這是web2.0網(wǎng)站的根本。
總結(jié):web2.0網(wǎng)站倡導(dǎo)的是集體創(chuàng)作、共享資源,靠的是人氣,體現(xiàn)的是參與性,一個沒有參與性的web2.0網(wǎng)站都不足以成為 web2.0。以上提到的這幾個功能塊就是以吸引用戶參與和引導(dǎo)用戶參與為目的的,真正的web2.0不是什么深奧的東西,只有一點,那就是如何讓瀏覽者 沸騰起來。
二、 Flickr的幕后故事
我們都看到 Flickr 的成功,而又有多少"精英"們了解過 Flickr 背后的過程是多么充滿艱險。
Flickr 是全 CGI 的動態(tài)構(gòu)架(呀呀....),并以一種 .gne 的腳本作為 CGI 程序語言。不管網(wǎng)站制作菜鳥還是高手都會疑惑:gne 是哪種程序語言?答案:gne 不是一種語言,F(xiàn)lickr 是以極為經(jīng)典的 PHP + MySQL 方式實現(xiàn)的,在被 Yahoo 收購服務(wù)器搬入美國之前,使用了 21 臺(69.90.111.101-121) Apache/PHP 做 Web、23 臺圖片服務(wù)器、另有 MySQL 服務(wù)器組成的數(shù)據(jù)庫集群的服務(wù)器數(shù)量未知。現(xiàn)在估計使用的是 Yahoo 的負載均衡系統(tǒng),對外只有一個 Web 的 IP 和圖片服務(wù)器的 IP 了。
那為何 .php 的文件要改成 .gne 呢?以往有大型網(wǎng)站為向后兼容性考慮,隱藏以程序語言命名的腳本文件擴展名,比如 Baidu 隱藏了 .php(哈哈..baidu也是php的,還以為是c)(Google 的 http 服務(wù)器是自己寫的,整合了腳本程序,個別頁面是 .py--Python);還有一些網(wǎng)站是改成自己網(wǎng)站名相關(guān)的擴展名,如 MSN 的群組則是 .msnw,榕樹下是 .rs。
那 Flickr 的 gne 是什么意思?我在維基百科的 Flickr 條目上找到了答案(中文 Flickr 條目上沒有寫明) 。原來 GNE 是 Game NeverEnding 的縮寫,F(xiàn)lickr 的開發(fā)者 Ludicorp 在 2002-2004 年一直在開發(fā)這套以 Game NerverEnding 為名稱的大型多人在線角色扮演游戲--一套基于瀏覽器的 Web 游戲系統(tǒng),個人以為應(yīng)該就是當(dāng)年九城的虛擬城市。但是開發(fā)近 3 年后該計劃不得不破產(chǎn),最終只發(fā)布了一個 Beta 版,而 Ludicorp 將這套系統(tǒng)稍加移植,就有了 Flickr。呵呵,原來 gne 是一個項目的名稱。關(guān)于 GNE 的一些連接:http://del.icio.us/schee/gne。
早期的 Flickr 想做成在類似聊天室的地方讓網(wǎng)友分享、交流自己的照片,注重社區(qū)形式和保護照片不被外部引用(見徐子涵2004年的文章),可能是看到了 Hello 的模式吧。但是聰明的 Flickr 團隊不久就改變了策略,淡化了傳統(tǒng)的社區(qū)形式--如聊天室、而加強了現(xiàn)在使其功成名就的 Tag 組織形式,一種更自由更隨興更輕松好玩的大社區(qū)形式,或者叫它廣義社區(qū)吧,我隨便叫的,可能太學(xué)究,看著別太在意就是了。另外,將原來照片只能在 Flash 內(nèi)瀏覽的限制區(qū)除了,并大力推薦用戶將照片引用到自己的 Blog,這無疑對于挑戰(zhàn)傳統(tǒng)相冊系統(tǒng)有決定性意義。減少 Flash 后的網(wǎng)頁更多地引進了新興的 Ajax 技術(shù),使界面操作變得非常 Cool。
這就是 Flickr 的歷史,清晰地看到了他們對于優(yōu)秀產(chǎn)品的執(zhí)著。有了技術(shù)和經(jīng)驗積累(這是很必要的),加上不斷堅持,總有一天時來運轉(zhuǎn),你的產(chǎn)品會成為新潮流的里程碑。
還有一句話要告訴 Yupoo 等:把 Flickr 想成一個有 Tag 功能的在線相冊就已經(jīng)錯遠了;復(fù)制粘貼者們想當(dāng)然將 Flickr 去其糟粕取其精華,結(jié)果無關(guān)緊要的拿來了,將令人激動的優(yōu)點都去掉了,結(jié)果剩下什么?
三、 YouTube的架構(gòu)擴展
在西雅圖擴展性的技術(shù)研討會上,YouTube 的 Cuong Do 做了關(guān)于 YouTube Scalability 的報告。視頻內(nèi)容在 Google Video 上有(地址),可惜國內(nèi)用戶看不到。
Kyle Cordes 對這個視頻中的內(nèi)容做了介紹。里面有不少技術(shù)性的內(nèi)容。值得分享一下。(Kyle Cordes 的介紹是本文的主要來源)
簡單的說 YouTube 的數(shù)據(jù)流量, "一天的YouTube流量相當(dāng)于發(fā)送750億封電子郵件.", 2006 年中就有消息說每日 PV 超過 1 億,現(xiàn)在? 更夸張了,"每天有10億次下載以及6,5000次上傳", 真假姑且不論, 的確是超乎尋常的海量. 國內(nèi)的互聯(lián)網(wǎng)應(yīng)用,但從數(shù)據(jù)量來看,怕是只有 51.com 有這個規(guī)模. 但技術(shù)上和 YouTube 就沒法子比了.
1.Web服務(wù)器
YouTube 出于開發(fā)速度的考慮,大部分代碼都是 Python 開發(fā)的。Web 服務(wù)器有部分是 Apache, 用 FastCGI 模式。對于視頻內(nèi)容則用 Lighttpd 。據(jù)我所知,MySpace 也有部分服務(wù)器用 Lighttpd ,但量不大。YouTube 是 Lighttpd 最成功的案例。(國內(nèi)用 Lighttpd 站點不多,豆瓣用的比較舒服。by Fenng)
2.視頻
視頻的縮略圖(Thumbnails)給服務(wù)器帶來了很大的挑戰(zhàn)。每個視頻平均有4個縮略圖,而每個 Web 頁面上更是有多個,每秒鐘因為這個帶來的磁盤 IO 請求太大。YouTube 技術(shù)人員啟用了單獨的服務(wù)器群組來承擔(dān)這個壓力,并且針對 Cache 和 OS 做了部分優(yōu)化。另一方面,縮略圖請求的壓力導(dǎo)致 Lighttpd 性能下降。通過 Hack Lighttpd 增加更多的 worker 線程很大程度解決了問題。而最新的解決方案是起用了 Google 的 BigTable, 這下子從性能、容錯、緩存上都有更好表現(xiàn)。看人家這收購的,好鋼用在了刀刃上。
出于冗余的考慮,每個視頻文件放在一組迷你 Cluster 上,所謂 "迷你 Cluster" 就是一組具有相同內(nèi)容的服務(wù)器。最火的視頻放在 CDN 上,這樣自己的服務(wù)器只需要承擔(dān)一些"漏網(wǎng)"的隨即訪問即可。YouTube 使用簡單、廉價、通用的硬件,這一點和 Google 風(fēng)格倒是一致。至于維護手段,也都是常見的工具,如 rsync, SSH 等,只不過人家更手熟罷了。
3.數(shù)據(jù)庫
YouTube 用 MySQL 存儲元數(shù)據(jù)--用戶信息、視頻信息什么的。數(shù)據(jù)庫服務(wù)器曾經(jīng)一度遇到 SWAP 顛簸的問題,解決辦法是刪掉了 SWAP 分區(qū)! 管用。
最初的 DB 只有 10 塊硬盤,RAID 10 ,后來追加了一組 RAID 1。夠省的。這一波 Web 2.0 公司很少有用 Oracle 的(我知道的只有 Bebo,參見這里). 在擴展性方面,路線也是和其他站點類似,復(fù)制,分散 IO。最終的解決之道是"分區(qū)",這個不是數(shù)據(jù)庫層面的表分區(qū),而是業(yè)務(wù)層面的分區(qū)(在用戶名字或者 ID 上做文章,應(yīng)用程序控制查找機制)
YouTube 也用 Memcached.
很想了解一下國內(nèi) Web 2.0 網(wǎng)站的數(shù)據(jù)信息,有誰可以提供一點 ?
四、 mixi.jp:使用開源軟件搭建的可擴展SNS網(wǎng)站
Mixi目前是日本排名第三的網(wǎng)站,全球排名42,主要提供SNS服務(wù):日記,群組,站內(nèi)消息,評論,相冊等等,是日本最大的SNS網(wǎng)站。 Mixi從2003年12月份開始開發(fā),由現(xiàn)在它的CTO - Batara Kesuma一個人焊,焊了四個月,在2004年2月份開始上線運行。兩個月后就注冊了1w用戶,日訪問量60wPV。在隨后的一年里,用戶增長到了 21w,第二年,增長到了200w。到今年四月份已經(jīng)增長到370w注冊用戶,并且還在以每天1.5w人的注冊量增長。這些用戶中70%是活躍用戶(活躍 用戶:三天內(nèi)至少登錄一次的用戶),平均每個用戶每周在線時間為將近3個半小時。
下面我們來看它的技術(shù)架構(gòu)。Mixi采用開源軟件作為架構(gòu)的基礎(chǔ):Linux 2.6,Apache 2.0,MySQL,Perl 5.8,memcached,Squid等等。到目前為止已經(jīng)有100多臺MySQL數(shù)據(jù)庫服務(wù)器,并且在以每月10多臺的速度增長。Mixi的數(shù)據(jù)庫連 接方式采用的是每次查詢都進行連接,而不是持久連接。數(shù)據(jù)庫大多數(shù)是以InnoDB方式運行。Mixi解決擴展問題主要依賴于對數(shù)據(jù)庫的切分。
首先進行垂直切分,按照表的內(nèi)容將不同的表劃分到不同的數(shù)據(jù)庫中。然后是水平切分,根據(jù)用戶的ID將不同用戶的內(nèi)容再劃分的不同的數(shù)據(jù)庫中,這 是比較通常的做法,也很管用。劃分的關(guān)鍵還是在于應(yīng)用中的實現(xiàn),需要將操作封裝在在數(shù)據(jù)層,而盡量不影響業(yè)務(wù)層。當(dāng)然完全不改變邏輯層也不可能,這時候最 能檢驗以前的設(shè)計是否到位,如果以前設(shè)計的不錯,那創(chuàng)建連接的時候傳個表名,用戶ID進去差不多就解決問題了,而以前如果sql代碼到處飛,或者數(shù)據(jù)層封 裝的不太好的話那就累了。
這樣做了以后并不能從根本上解決問題,尤其是對于像mixi這種SNS網(wǎng)站,頁面上往往需要引用大量的用戶信息,好友信息,圖片,文章信息,跨 表,跨庫操作相當(dāng)多。這個時候就需要發(fā)揮memcached的作用了,用大內(nèi)存把這些不變的數(shù)據(jù)全都緩存起來,而當(dāng)修改時就通知cache過期,這樣應(yīng)用 層基本上就可以解決大部分問題了,只會有很小一部分請求穿透應(yīng)用層,用到數(shù)據(jù)庫。Mixi的經(jīng)驗是平均每個頁面的加載時間在0.02秒左右(當(dāng)然根據(jù)頁面 大小情況不盡相似),可以說明這種做法是行之有效的。Mixi一共在32臺機器上有緩存服務(wù)器,每個Cache Server 2G內(nèi)存,這些Cache Server與App Server裝在一起。因為Cache Server對CPU消耗不大,而有了Cache Server的支援,App Server對內(nèi)存要求也不是太高,所以可以和平共處,更有效的利用資源。
圖片的處理就顯得相對簡單的多了。對于mixi而言,圖像主要有兩部分:一部分是經(jīng)常要使用到的,像用戶頭像,群組的頭像等等,大概有100多 GB,它們被Squid和CDN所緩存,命中率相對比較高;另一部分是用戶上傳的大量照片,它們的個體訪問量相對而言比較小,命中率也比較低,使用 Cache不劃算,所以對于這些照片的策略是直接在用戶上傳的時候分發(fā)到到圖片存儲服務(wù)器上,在用戶訪問的時候直接進行訪問,當(dāng)然圖片的位置需要在數(shù)據(jù)庫 中進行記錄,不然找不到放在哪臺服務(wù)器上就郁悶了。
五、 Technorati的后臺數(shù)據(jù)庫架構(gòu)
Technorati(現(xiàn)在被阻尼了, 可能你訪問不了)的 Dorion Carroll在 2006 MySQL 用戶會議上介紹了一些關(guān)于 Technorati 后臺數(shù)據(jù)庫架構(gòu)的情況.
基本情況
目前處理著大約 10Tb 核心數(shù)據(jù), 分布在大約 20 臺機器上.通過復(fù)制, 多增加了 100Tb 數(shù)據(jù), 分布在 200 臺機器上. 每天增長的數(shù)據(jù) 1TB. 通過 SOA 的運用, 物理與邏輯的訪問相隔離, 似乎消除了數(shù)據(jù)庫的瓶頸. 值得一提的是, 該擴展過程始終是利用普通的硬件與開源軟件來完成的. 畢竟 , Web 2.0 站點都不是燒錢的主. 從數(shù)據(jù)量來看,這絕對是一個相對比較大的 Web 2.0 應(yīng)用.
Tag 是 Technorati 最為重要的數(shù)據(jù)元素. 爆炸性的 Tag 增長給 Technorati 帶來了不小的挑戰(zhàn).
2005 年 1 月的時候, 只有兩臺數(shù)據(jù)庫服務(wù)器, 一主一從. 到了 06 年一月份, 已經(jīng)是一主一從, 6 臺 MyISAM 從數(shù)據(jù)庫用來對付查詢, 3 臺 MyISAM 用作異步計算.
一些核心的處理方法:
1) 根據(jù)實體(tags/posttags))進行分區(qū)
衡量數(shù)據(jù)訪問方法,讀和寫的平衡.然后通過不同的維度進行分區(qū).( Technorati 數(shù)據(jù)更新不會很多, 否則會成為數(shù)據(jù)庫災(zāi)難)
2) 合理利用 InnoDB與 MyISAM
InnoDB 用于數(shù)據(jù)完整性/寫性能要求比較高的應(yīng)用. MyISAM 適合進行 OLAP 運算. 物盡其用.
3) MySQL復(fù)制
復(fù)制數(shù)據(jù)到從主數(shù)據(jù)庫到輔數(shù)據(jù)庫上,平衡分布查詢與異步計算, 另外一個功能是提供冗余. 如圖:

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

三、從LiveJournal發(fā)展中學(xué)習(xí)
LiveJournal從1臺服務(wù)器發(fā)展到100臺服務(wù)器,這其中經(jīng)歷了無數(shù)的傷痛,但同時也摸索出了解決這些問題的方法,通過對LiveJournal的學(xué)習(xí),可以讓我們避免LJ曾經(jīng)犯過的錯誤,并且從一開始就對系統(tǒng)進行良好的設(shè)計,以避免后期的痛苦。
下面我們一步一步看LJ發(fā)展的腳步。
1、一臺服務(wù)器
一臺別人捐助的服務(wù)器(強烈ft),LJ最初就跑在上面,就像Google開始時候用的破服務(wù)器一樣,值得我們尊敬。這個階段,LJ的人以驚人的速度熟悉的 Unix的操作管理,服務(wù)器性能出現(xiàn)過問題,不過還好,可以通過一些小修小改應(yīng)付過去。在這個階段里L(fēng)J把CGI升級到了FastCGI。
最終問題出現(xiàn)了,網(wǎng)站越來越慢,已經(jīng)無法通過優(yōu)過化來解決的地步,需要更多的服務(wù)器,這時LJ開始提供付費服務(wù),可能是想通過這些錢來購買新的服務(wù)器,以解決當(dāng)時的困境。
毫無疑問,當(dāng)時LJ存在巨大的單點問題,所有的東西都在那臺服務(wù)器的鐵皮盒子里裝著。
2、兩臺服務(wù)器
用付費服務(wù)賺來的錢LJ買了兩臺服務(wù)器:一臺叫做Kenny的Dell 6U機器用于提供Web服務(wù),一臺叫做Cartman的Dell 6U服務(wù)器用于提供數(shù)據(jù)庫服務(wù)。

LJ有了更大的磁盤,更多的計算資源。但同時網(wǎng)絡(luò)結(jié)構(gòu)還是非常簡單,每臺機器兩塊網(wǎng)卡,Cartman通過內(nèi)網(wǎng)為Kenny提供MySQL數(shù)據(jù)庫服務(wù)。
暫時解決了負載的問題,新的問題又出現(xiàn)了:
原來的一個單點變成了兩個單點。
沒有冷備份或熱備份。
網(wǎng)站速度慢的問題又開始出現(xiàn)了,沒辦法,增長太快了。
Web服務(wù)器上CPU達到上限,需要更多的Web服務(wù)器。
3、四臺服務(wù)器
又買了兩臺,Kyle和Stan,這次都是1U的,都用于提供Web服務(wù)。目前LJ一共有3臺Web服務(wù)器和一臺數(shù)據(jù)庫服務(wù)器。這時需要在3臺Web服務(wù)器上進行負載均橫。

LJ把Kenny用于外部的網(wǎng)關(guān),使用mod_backhand進行負載均橫。
然后問題又出現(xiàn)了:
單點故障。數(shù)據(jù)庫和用于做網(wǎng)關(guān)的Web服務(wù)器都是單點,一旦任何一臺機器出現(xiàn)問題將導(dǎo)致所有服務(wù)不可用。雖然用于做網(wǎng)關(guān)的Web服務(wù)器可以通過保持心跳同步迅速切換,但還是無法解決數(shù)據(jù)庫的單點,LJ當(dāng)時也沒做這個。
網(wǎng)站又變慢了,這次是因為IO和數(shù)據(jù)庫的問題,問題是怎么往應(yīng)用里面添加數(shù)據(jù)庫呢?
4、五臺服務(wù)器
又買了一臺數(shù)據(jù)庫服務(wù)器。在兩臺數(shù)據(jù)庫服務(wù)器上使用了數(shù)據(jù)庫同步(Mysql支持的Master-Slave模式),寫操作全部針對主數(shù)據(jù)庫 (通過Binlog,主服務(wù)器上的寫操作可以迅速同步到從服務(wù)器上),讀操作在兩個數(shù)據(jù)庫上同時進行(也算是負載均橫的一種吧)。

實現(xiàn)同步時要注意幾個事項:
讀操作數(shù)據(jù)庫選擇算法處理,要選一個當(dāng)前負載輕一點的數(shù)據(jù)庫。
在從數(shù)據(jù)庫服務(wù)器上只能進行讀操作
準(zhǔn)備好應(yīng)對同步過程中的延遲,處理不好可能會導(dǎo)致數(shù)據(jù)庫同步的中斷。只需要對寫操作進行判斷即可,讀操作不存在同步問題。
5、更多服務(wù)器
有錢了,當(dāng)然要多買些服務(wù)器。部署后快了沒多久,又開始慢了。這次有更多的Web服務(wù)器,更多的數(shù)據(jù)庫服務(wù)器,存在 IO與CPU爭用。于是采用了BIG-IP作為負載均衡解決方案。

6、現(xiàn)在我們在哪里:

現(xiàn)在服務(wù)器基本上夠了,但性能還是有問題,原因出在架構(gòu)上。
數(shù)據(jù)庫的架構(gòu)是最大的問題。由于增加的數(shù)據(jù)庫都是以Slave模式添加到應(yīng)用內(nèi),這樣唯一的好處就是將讀操作分布到了多臺機器,但這樣帶來的后果就是寫操作被大量分發(fā),每臺機器都要執(zhí)行,服務(wù)器越多,浪費就越大,隨著寫操作的增加,用于服務(wù)讀操作的資源越來越少。
由一臺分布到兩臺

最終效果
現(xiàn)在我們發(fā)現(xiàn),我們并不需要把這些數(shù)據(jù)在如此多的服務(wù)器上都保留一份。服務(wù)器上已經(jīng)做了RAID,數(shù)據(jù)庫也進行了備份,這么多的備份完全是對資源的浪費,屬于冗余極端過度。那為什么不把數(shù)據(jù)分布存儲呢?
問題發(fā)現(xiàn)了,開始考慮如何解決。現(xiàn)在要做的就是把不同用戶的數(shù)據(jù)分布到不同的服務(wù)器上進行存儲,以實現(xiàn)數(shù)據(jù)的分布式存儲,讓每臺機器只為相對固定的用戶服務(wù),以實現(xiàn)平行的架構(gòu)和良好的可擴展性。
為了實現(xiàn)用戶分組,我們需要為每一個用戶分配一個組標(biāo)記,用于標(biāo)記此用戶的數(shù)據(jù)存放在哪一組數(shù)據(jù)庫服務(wù)器中。每組數(shù)據(jù)庫由一個master及幾 個slave組成,并且slave的數(shù)量在2-3臺,以實現(xiàn)系統(tǒng)資源的最合理分配,既保證數(shù)據(jù)讀操作分布,又避免數(shù)據(jù)過度冗余以及同步操作對系統(tǒng)資源的過 度消耗。

由一臺(一組)中心服務(wù)器提供用戶分組控制。所有用戶的分組信息都存儲在這臺機器上,所有針對用戶的操作需要先查詢這臺機器得到用戶的組號,然后再到相應(yīng)的數(shù)據(jù)庫組中獲取數(shù)據(jù)。
這樣的用戶架構(gòu)與目前LJ的架構(gòu)已經(jīng)很相像了。
在具體的實現(xiàn)時需要注意幾個問題:
在數(shù)據(jù)庫組內(nèi)不要使用自增ID,以便于以后在數(shù)據(jù)庫組之間遷移用戶,以實現(xiàn)更合理的I/O,磁盤空間及負載分布。
將userid,postid存儲在全局服務(wù)器上,可以使用自增,數(shù)據(jù)庫組中的相應(yīng)值必須以全局服務(wù)器上的值為準(zhǔn)。全局服務(wù)器上使用事務(wù)型數(shù)據(jù)庫InnoDB。
在數(shù)據(jù)庫組之間遷移用戶時要萬分小心,當(dāng)遷移時用戶不能有寫操作。
7、現(xiàn)在我們在哪里

問題:
一個全局主服務(wù)器,掛掉的話所有用戶注冊及寫操作就掛掉。
每個數(shù)據(jù)庫組一個主服務(wù)器,掛掉的話這組用戶的寫操作就掛掉。
數(shù)據(jù)庫組從服務(wù)器掛掉的話會導(dǎo)致其它服務(wù)器負載過大。
對于Master-Slave模式的單點問題,LJ采取了Master-Master模式來解決。所謂Master-Master實際上是人工實現(xiàn)的,并不是由MySQL直接提供的,實際上也就是兩臺機器同時是Master,也同時是Slave,互相同步。
Master-Master實現(xiàn)時需要注意:
一個Master出錯后恢復(fù)同步,最好由服務(wù)器自動完成。
數(shù)字分配,由于同時在兩臺機器上寫,有些ID可能會沖突。
解決方案:
奇偶數(shù)分配ID,一臺機器上寫奇數(shù),一臺機器上寫偶數(shù)
通過全局服務(wù)器進行分配(LJ采用的做法)。
Master-Master模式還有一種用法,這種方法與前一種相比,仍然保持兩臺機器的同步,但只有一臺機器提供服務(wù)(讀和寫),在每天晚上的時候進行輪換,或者出現(xiàn)問題的時候進行切換。
8、現(xiàn)在我們在哪里

現(xiàn)在插播一條廣告,MyISAM VS InnoDB。
使用InnoDB:
支持事務(wù)
需要做更多的配置,不過值得,可以更安全的存儲數(shù)據(jù),以及得到更快的速度。
使用MyISAM:
記錄日志(LJ用它來記網(wǎng)絡(luò)訪問日志)
存儲只讀靜態(tài)數(shù)據(jù),足夠快。
并發(fā)性很差,無法同時讀寫數(shù)據(jù)(添加數(shù)據(jù)可以)
MySQL非正常關(guān)閉或死機時會導(dǎo)致索引錯誤,需要使用myisamchk修復(fù),而且當(dāng)訪問量大時出現(xiàn)非常頻繁。
9、緩存
去年我寫過一篇文章介紹memcached,它就是由LJ的團隊開發(fā)的一款緩存工具,以key-value的方式將數(shù)據(jù)存儲到分布的內(nèi)存中。LJ緩存的數(shù)據(jù):
12臺獨立服務(wù)器(不是捐贈的)
28個實例
30GB總?cè)萘?
90-93%的命中率(用過squid的人可能知道,squid內(nèi)存加磁盤的命中率大概在70-80%)
如何建立緩存策略?
想緩存所有的東西?那是不可能的,我們只需要緩存已經(jīng)或者可能導(dǎo)致系統(tǒng)瓶頸的地方,最大程度的提交系統(tǒng)運行效率。通過對MySQL的日志的分析我們可以找到緩存的對象。
緩存的缺點?
沒有完美的事物,緩存也有缺點:
增大開發(fā)量,需要針對緩存處理編寫特殊的代碼。
管理難度增加,需要更多人參與系統(tǒng)維護。
當(dāng)然大內(nèi)存也需要錢。
10、Web訪問負載均衡
在數(shù)據(jù)包級別使用BIG-IP,但BIG-IP并不知道我們內(nèi)部的處理機制,無法判斷由哪臺服務(wù)器對這些請求進行處理。反向代理并不能很好的起到作用,不是已經(jīng)夠快了,就是達不到我們想要的效果。
所以,LJ又開發(fā)了Perlbal。特點:
快,小,可管理的http web 服務(wù)器/代理
可以在內(nèi)部進行轉(zhuǎn)發(fā)
使用Perl開發(fā)
單線程,異步,基于事件,使用epoll , kqueue
支持Console管理與http遠程管理,支持動態(tài)配置加載
多種模式:web服務(wù)器,反向代理,插件
支持插件:GIF/PNG互換?
11、MogileFS
LJ使用開源的MogileFS作為分布式文件存儲系統(tǒng)。MogileFS使用非常簡單,它的主要設(shè)計思想是:
文件屬于類(類是最小的復(fù)制單位)
跟蹤文件存儲位置
在不同主機上存儲
使用MySQL集群統(tǒng)一存儲分布信息
大容易廉價磁盤
到目前為止就這么多了,更多文檔可以在http://www.danga.com/words/找到。Danga.com和 LiveJournal.com的同學(xué)們拿這個文檔參加了兩次MySQL Con,兩次OS Con,以及眾多的其它會議,無私的把他們的經(jīng)驗分享出來,值得我們學(xué)習(xí)。在web2.0時代快速開發(fā)得到大家越來越多的重視,但良好的設(shè)計仍是每一個應(yīng) 用的基礎(chǔ),希望web2.0們在成長為Top500網(wǎng)站的路上,不要因為架構(gòu)阻礙了網(wǎng)站的發(fā)展。
八、說說大型高并發(fā)高負載網(wǎng)站的系統(tǒng)架構(gòu)
我在Cernet做過撥號接入平臺的搭建,而后在Yahoo3721負載搜索引擎前端平臺開發(fā),又在貓撲處理過大型社區(qū)貓撲大雜燴的架構(gòu)升級等 工作,同時自己接觸和開發(fā)過不少大中型網(wǎng)站的模塊,因此在大型網(wǎng)站應(yīng)對高負載和并發(fā)的解決方案上有一些積累和經(jīng)驗(HOHO..nb man ),可以和大家一起探討一下。
一個小型的網(wǎng)站,比如個人網(wǎng)站,可以使用最簡單的html靜態(tài)頁面就實現(xiàn)了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的 網(wǎng)站對系統(tǒng)架構(gòu)、性能的要求都很簡單,隨著互聯(lián)網(wǎng)業(yè)務(wù)的不斷豐富,網(wǎng)站相關(guān)的技術(shù)經(jīng)過這些年的發(fā)展,已經(jīng)細分到很細的方方面面,尤其對于大型網(wǎng)站來說,所 采用的技術(shù)更是涉及面非常廣,從硬件到軟件、編程語言、數(shù)據(jù)庫、WebServer、防火墻等各個領(lǐng)域都有了很高的要求,已經(jīng)不是原來簡單的html靜態(tài) 網(wǎng)站所能比擬的。
大型網(wǎng)站,比如門戶網(wǎng)站。在面對大量用戶訪問、高并發(fā)請求方面,基本的解決方案集中在這樣幾個環(huán)節(jié):使用高性能的服務(wù)器、高性能的數(shù)據(jù)庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網(wǎng)站面臨的高負載和高并發(fā)問題。
上面提供的幾個解決思路在一定程度上也意味著更大的投入,并且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經(jīng)驗。
1、HTML靜態(tài)化
其實大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁面,所以我們盡可能使我們的網(wǎng)站上的頁面采用靜態(tài)頁面來實現(xiàn),這個最簡單的方法 其實也是最有效的方法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動去挨個實現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個 門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實現(xiàn)的,信息發(fā)布系統(tǒng)可以實現(xiàn)最簡單的信息錄入自動生成靜態(tài)頁面,還能具備頻道管 理、權(quán)限管理、自動抓取等功能,對于一個大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。
除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進行實時的靜態(tài)化,有更新的時候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。
同時,html靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實現(xiàn), 比如論壇中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進行后臺管理并且存儲再數(shù)據(jù)庫中,這些信息其實大量被前臺程序調(diào)用,但是更新頻率很小,可以 考慮將這部分內(nèi)容進行后臺更新的時候進行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求。
2、圖片服務(wù)器分離
大家知道,對于Web服務(wù)器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進行分離,這是基 本上大型網(wǎng)站都會采用的策略,他們都有獨立的圖片服務(wù)器,甚至很多臺圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁面訪問請求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng) 不會因為圖片問題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進行不同的配置優(yōu)化,比如apache在配置ContentType的時候可以盡量少支持,盡 可能少的LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率。
3、數(shù)據(jù)庫集群和庫表散列
大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫,那么在面對大量訪問的時候,數(shù)據(jù)庫的瓶頸很快就能顯現(xiàn)出來,這時一臺數(shù)據(jù)庫將很快無法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫集群或者庫表散列。
在數(shù)據(jù)庫集群方面,很多數(shù)據(jù)庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來實施即可。
上面提到的數(shù)據(jù)庫集群由于在架構(gòu)、成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應(yīng)用程序的角度來考慮改善系統(tǒng)架構(gòu),庫表散列 是常用并且最有效的解決方案。我們在應(yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫進行分離,不同的模塊對應(yīng)不同的數(shù)據(jù)庫或者表,再按照一定的策略對某個 頁面或者功能進行更小的數(shù)據(jù)庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴展性。sohu的論壇就是采用 了這樣的架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進行數(shù)據(jù)庫分離,然后對帖子、用戶按照板塊和ID進行散列數(shù)據(jù)庫和表,最終可以在配置文件中進行簡單的配置 便能讓系統(tǒng)隨時增加一臺低成本的數(shù)據(jù)庫進來補充系統(tǒng)性能。
4、緩存
緩存一詞搞技術(shù)的都接觸過,很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。
架構(gòu)方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應(yīng)能力。
網(wǎng)站程序開發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發(fā)中使用,比如用Java開發(fā)的時候就可以調(diào)用MemoryCache對一些數(shù)據(jù)進行緩存和通訊共享,一些大 型社區(qū)使用了這樣的架構(gòu)。另外,在使用web語言開發(fā)的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多 了,.net不是很熟悉,相信也肯定有。
5、鏡像
鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和 EduNet之間的差異就促使了很多網(wǎng)站在教育網(wǎng)內(nèi)搭建鏡像站點,數(shù)據(jù)進行定時更新或者實時更新。在鏡像的細節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn) 成的解決架構(gòu)和產(chǎn)品可選。也有廉價的通過軟件實現(xiàn)的思路,比如Linux上的rsync等工具。
6、負載均衡
負載均衡將是大型網(wǎng)站解決高負荷訪問和大量并發(fā)請求采用的終極解決辦法。
負載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,我個人接觸過一些解決方法,其中有兩個架構(gòu)可以給大家做參考。
硬件四層交換
第四層交換使用第三層和第四層信息包的報頭信息,根據(jù)應(yīng)用區(qū)間識別業(yè)務(wù)流,將整個區(qū)間段的業(yè)務(wù)流分配到合適的應(yīng)用服務(wù)器進行處理。 第四層交換 功能就象是虛IP,指向物理服務(wù)器。它傳輸?shù)臉I(yè)務(wù)服從的協(xié)議多種多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這些業(yè)務(wù)在物理服務(wù)器基礎(chǔ) 上,需要復(fù)雜的載量平衡算法。在IP世界,業(yè)務(wù)類型由終端TCP或UDP端口地址來決定,在第四層交換中的應(yīng)用區(qū)間則由源端和終端IP地址、TCP和 UDP端口共同決定。
在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國當(dāng)初接近2000臺服務(wù)器使用了三四臺Alteon就搞定了。
軟件四層交換
大家知道了硬件四層交換機的原理后,基于OSI模型來實現(xiàn)的軟件四層交換也就應(yīng)運而生,這樣的解決方案實現(xiàn)的原理一致,不過性能稍差。但是滿足一定量的壓力還是游刃有余的,有人說軟件實現(xiàn)方式其實更靈活,處理能力完全看你配置的熟悉能力。
軟件四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server,他提供了基于心跳線heartbeat的實時災(zāi)難應(yīng)對解決方案,提高系統(tǒng)的魯棒性,同時可供了靈活的虛擬VIP配置和管理功能,可以同時滿 足多種應(yīng)用需求,這對于分布式的系統(tǒng)來說必不可少。
一個典型的使用負載均衡的策略就是,在軟件或者硬件四層交換的基礎(chǔ)上搭建squid集群,這種思路在很多大型網(wǎng)站包括搜索引擎上被采用,這樣的 架構(gòu)低成本、高性能還有很強的擴張性,隨時往架構(gòu)里面增減節(jié)點都非常容易。這樣的架構(gòu)我準(zhǔn)備空了專門詳細整理一下和大家探討。
對于大型網(wǎng)站來說,前面提到的每個方法可能都會被同時使用到,我這里介紹得比較淺顯,具體實現(xiàn)過程中很多細節(jié)還需要大家慢慢熟悉和體會,有時一個很小的squid參數(shù)或者apache參數(shù)設(shè)置,對于系統(tǒng)性能的影響就會很大,希望大家一起討論,達到拋磚引玉之效。
posted on 2007-11-02 11:02
老妖 閱讀(2405)
評論(2) 編輯 收藏