知名互聯(lián)網(wǎng)公司網(wǎng)站架構(gòu)圖

引言

近段時(shí)間以來(lái),通過(guò)接觸有關(guān)海量數(shù)據(jù)處理和搜索引擎的諸多技術(shù),常常見(jiàn)識(shí)到不少精妙絕倫的架構(gòu)圖。除了每每感嘆于每幅圖表面上的繪制的精細(xì)之外,更為架構(gòu)圖背后所隱藏的設(shè)計(jì)思想所嘆服。個(gè)人這兩天一直在搜集各大型網(wǎng)站的架構(gòu)設(shè)計(jì)圖,一為了一飽眼福,領(lǐng)略各類大型網(wǎng)站架構(gòu)設(shè)計(jì)的精彩之外,二來(lái)也可供閑時(shí)反復(fù)琢磨體會(huì),何樂(lè)而不為呢?特此,總結(jié)整理了諸如國(guó)外wikipedia,F(xiàn)acebook,Yahoo!,YouTube,MySpace,Twitter,國(guó)內(nèi)如優(yōu)酷網(wǎng)等大型網(wǎng)站的技術(shù)架構(gòu)(本文重點(diǎn)分析優(yōu)酷網(wǎng)的技術(shù)架構(gòu)),以饗讀者。

本文著重凸顯每一幅圖的精彩之處與其背后含義,而圖的說(shuō)明性文字則從簡(jiǎn)從略。ok,好好享受此番架構(gòu)盛宴吧。當(dāng)然,若有任何建議或問(wèn)題,歡迎不吝指正。謝謝。

1、WikiPedia 技術(shù)架構(gòu)

WikiPedia 技術(shù)架構(gòu)圖Copy @Mark Bergsma

來(lái)自wikipedia的數(shù)據(jù):峰值每秒鐘3萬(wàn)個(gè) HTTP 請(qǐng)求 每秒鐘 3Gbit 流量, 近乎375MB? ? ? ? ? ? ? ? ? ? ? ? ? ?

350 臺(tái) PC 服務(wù)器。

GeoDNSA :40-line patch for BIND to add geographical? ? ? ? ? ? ? ? ? ? ? ? ? filters support to the existent views in BIND",? ? ? ? ? ? ? ? ? ? ? ? ? ? 把用戶帶到最近的服務(wù)器。GeoDNS 在 WikiPedia 架構(gòu)中擔(dān)當(dāng)重任當(dāng)然是由 WikiPedia? ? ? ? ? ? ? ? ? ? ? ? ? ? 的內(nèi)容性質(zhì)決定的--面向各個(gè)國(guó)家,各個(gè)地域。

負(fù)載均衡:LVS,請(qǐng)看下圖:

2、Facebook 架構(gòu)

Facebook 搜索功能的架構(gòu)示意圖

細(xì)心的讀者一定能發(fā)現(xiàn),上副架構(gòu)圖之前出現(xiàn)在此文之中:從幾幅架構(gòu)圖中偷得半點(diǎn)海里數(shù)據(jù)處理經(jīng)驗(yàn)。本文與前文最大的不同是,前文只有幾幅,此文系列將有上百幅架構(gòu)圖,任您盡情觀賞。

3、Yahoo! Mail 架構(gòu)

Yahoo! Mail 架構(gòu)

Yahoo! Mail 架構(gòu)部署了 Oracle RAC,用來(lái)存儲(chǔ) Mail 服務(wù)相關(guān)的 Meta 數(shù)據(jù)。

4、twitter技術(shù)架構(gòu)

twitter的整體架構(gòu)設(shè)計(jì)圖

twitter平臺(tái)大致由twitter.com、手機(jī)以及第三方應(yīng)用構(gòu)成,如下圖所示(其中流量主要以手機(jī)和第三方為主要來(lái)源):

緩存在大型web項(xiàng)目中起到了舉足輕重的作用,畢竟數(shù)據(jù)越靠近CPU存取速度越快。下圖是twitter的緩存架構(gòu)圖:

關(guān)于緩存系統(tǒng),還可以看看下幅圖:

5、Google App Engine技術(shù)架構(gòu)

GAE的架構(gòu)圖

? 簡(jiǎn)單而言,上述GAE的架構(gòu)分為如圖所示的三個(gè)部分:前端,Datastore和服務(wù)群。

前端包括4個(gè)模塊:Front End,Static Files,App Server,App Master。

Datastore是基于BigTable技術(shù)的分布式數(shù)據(jù)庫(kù),雖然其也可以被理解成為一個(gè)服務(wù),但是由于其是整個(gè)App? ? ? ? ? ? ? ? ? ? ? ? ? Engine唯一存儲(chǔ)持久化數(shù)據(jù)的地方,所以其是App Engine中一個(gè)非常核心的模塊。其具體細(xì)節(jié)將在下篇和大家討論。

整個(gè)服務(wù)群包括很多服務(wù)供App Server調(diào)用,比如Memcache,圖形,用戶,URL抓取和任務(wù)隊(duì)列等。

6、Amazon技術(shù)架構(gòu)

Amazon的Dynamo Key-Value存儲(chǔ)架構(gòu)圖

可能有讀者并不熟悉Amazon,它現(xiàn)在已經(jīng)是全球商品品種最多的網(wǎng)上零售商和全球第2大互聯(lián)網(wǎng)公司。而之前它僅僅是一個(gè)小小的網(wǎng)上書(shū)店。ok,下面,咱們來(lái)見(jiàn)識(shí)下它的架構(gòu)。

Dynamo是亞馬遜的key-value模式的存儲(chǔ)平臺(tái),可用性和擴(kuò)展性都很好,性能也不錯(cuò):讀寫(xiě)訪問(wèn)中99.9%的響應(yīng)時(shí)間都在300ms內(nèi)。按分布式系統(tǒng)常用的哈希算法切分?jǐn)?shù)據(jù),分放在不同的node上。Read操作時(shí),也是根據(jù)key的哈希值尋找對(duì)應(yīng)的node。Dynamo使用了? ? ? ? ? ? ? ? ? ? ? ? ? ? Consistent Hashing算法,node對(duì)應(yīng)的不再是一個(gè)確定的hash值,而是一個(gè)hash值范圍,key的hash值落在這個(gè)范圍內(nèi),則順時(shí)針沿ring找,碰到的第一個(gè)node即為所需。

Dynamo對(duì)Consistent Hashing算法的改進(jìn)在于:它放在環(huán)上作為一個(gè)node的是一組機(jī)器(而不是memcached把一臺(tái)機(jī)器作為node),這一組機(jī)器是通過(guò)同步機(jī)制保證數(shù)據(jù)一致的。

下圖是分布式存儲(chǔ)系統(tǒng)的示意圖,讀者可觀摩之:

Amazon的云架構(gòu)圖如下:

Amazon的云架構(gòu)圖

7、優(yōu)酷網(wǎng)的技術(shù)架構(gòu)

從一開(kāi)始,優(yōu)酷網(wǎng)就自建了一套CMS來(lái)解決前端的頁(yè)面顯示,各個(gè)模塊之間分離得比較恰當(dāng),前端可擴(kuò)展性很好,UI的分離,讓開(kāi)發(fā)與維護(hù)變得十分簡(jiǎn)單和靈活,下圖是優(yōu)酷前端的模塊調(diào)用關(guān)系:

? 這樣,就根據(jù)module、method及params來(lái)確定調(diào)用相對(duì)獨(dú)立的模塊,顯得非常簡(jiǎn)潔。下圖是優(yōu)酷的前端局部架構(gòu)圖:

優(yōu)酷的數(shù)據(jù)庫(kù)架構(gòu)也是經(jīng)歷了許多波折,從一開(kāi)始的單臺(tái)MySQL服務(wù)器(Just Running)到簡(jiǎn)單的MySQL主從復(fù)制、SSD優(yōu)化、垂直分庫(kù)、水平sharding分庫(kù)。

1.簡(jiǎn)單的MySQL主從復(fù)制。

MySQL的主從復(fù)制解決了數(shù)據(jù)庫(kù)的讀寫(xiě)分離,并很好的提升了讀的性能,其原來(lái)圖如下:

其主從復(fù)制的過(guò)程如下圖所示:

但是,主從復(fù)制也帶來(lái)其他一系列性能瓶頸問(wèn)題:

寫(xiě)入無(wú)法擴(kuò)展

寫(xiě)入無(wú)法緩存

復(fù)制延時(shí)

鎖表率上升

表變大,緩存率下降

那問(wèn)題產(chǎn)生總得解決的,這就產(chǎn)生下面的優(yōu)化方案。

2. MySQL垂直分區(qū)

如果把業(yè)務(wù)切割得足夠獨(dú)立,那把不同業(yè)務(wù)的數(shù)據(jù)放到不同的數(shù)據(jù)庫(kù)服務(wù)器將是一個(gè)不錯(cuò)的方案,而且萬(wàn)一其中一個(gè)業(yè)務(wù)崩潰了也不會(huì)影響其他業(yè)務(wù)的正常進(jìn)行,并且也起到了負(fù)載分流的作用,大大提升了數(shù)據(jù)庫(kù)的吞吐能力。經(jīng)過(guò)垂直分區(qū)后的數(shù)據(jù)庫(kù)架構(gòu)圖如下:

然而,盡管業(yè)務(wù)之間已經(jīng)足夠獨(dú)立了,但是有些業(yè)務(wù)之間或多或少總會(huì)有點(diǎn)聯(lián)系,如用戶,基本上都會(huì)和每個(gè)業(yè)務(wù)相關(guān)聯(lián),況且這種分區(qū)方式,也不能解決單張表數(shù)據(jù)量暴漲的問(wèn)題,因此為何不試試水平sharding呢?

3. MySQL水平分片(Sharding)

? 這是一個(gè)非常好的思路,將用戶按一定規(guī)則(按id哈希)分組,并把該組用戶的數(shù)據(jù)存儲(chǔ)到一個(gè)數(shù)據(jù)庫(kù)分片中,即一個(gè)sharding,這樣隨著用戶數(shù)量的增加,只要簡(jiǎn)單地配置一臺(tái)服務(wù)器即可,原理圖如下:

如何來(lái)確定某個(gè)用戶所在的shard呢,可以建一張用戶和shard對(duì)應(yīng)的數(shù)據(jù)表,每次請(qǐng)求先從這張表找用戶的shard? ? ? ? ? ? ? ? ? ? ? ? ? id,再?gòu)膶?duì)應(yīng)shard中查詢相關(guān)數(shù)據(jù),如下圖所示:

是如何解決跨shard的查詢呢,這個(gè)是個(gè)難點(diǎn),據(jù)介紹優(yōu)酷是盡量不跨shard查詢,實(shí)在不行通過(guò)多維分片索引、分布式搜索引擎,下策是分布式數(shù)據(jù)庫(kù)查詢(這個(gè)非常麻煩而且耗性能)。

? 緩存策略

貌似大的系統(tǒng)都對(duì)“緩存”情有獨(dú)鐘,從http緩存到memcached內(nèi)存數(shù)據(jù)緩存,但優(yōu)酷表示沒(méi)有用內(nèi)存緩存,理由如下:

避免內(nèi)存拷貝,避免內(nèi)存鎖

如接到老大哥通知要把某個(gè)視頻撤下來(lái),如果在緩存里是比較麻煩的

而且Squid 的 write() 用戶進(jìn)程空間有消耗,Lighttpd 1.5 的 AIO(異步I/O)? ? ? ? ? ? ? ? ? ? ? ? ? ? 讀取文件到用戶內(nèi)存導(dǎo)致效率也比較低下。

但為何我們?cè)L問(wèn)優(yōu)酷會(huì)如此流暢,與土豆相比優(yōu)酷的視頻加載速度略勝一籌?這個(gè)要?dú)w功于優(yōu)酷建立的比較完善的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN),它通過(guò)多種方式保證分布在全國(guó)各地的用戶進(jìn)行就近訪問(wèn)——用戶點(diǎn)擊視頻請(qǐng)求后,優(yōu)酷網(wǎng)將根據(jù)用戶所處地區(qū)位置,將離用戶最近、服務(wù)狀況最好的視頻服務(wù)器地址傳送給用戶,從而保證用戶可以得到快速的視頻體驗(yàn)。這就是CDN帶來(lái)的優(yōu)勢(shì),就近訪問(wèn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容