優酷網架構學習筆記

記得以前給大家介紹過視頻網站龍頭老大YouTube的技術架構,相信大家看了都會有不少的感觸,互聯網就是這麼一個神奇的東西。今天我突然想到,優酷網在國內也算是視頻網站的老大了,不知道他的架構相對於YouTube是怎麼樣的,於是帶着這個好奇心去網上找了優酷網架構的各方面資料,雖然談得沒有YouTube那麼詳細,但多少還是挖掘了一點,現在總結一下,希望對喜歡架構的朋友有所幫助。

一、網站基本數據概覽

  • 據2010年統計,優酷網日均獨立訪問人數(uv)達到了8900萬,日均訪問量(pv)更是達到了17億,優酷憑藉這一數據成爲google榜單中國內視頻網站排名最高的廠商。
  • 硬件方面,優酷網引進的戴爾服務器主要以 PowerEdge 1950與PowerEdge 860爲主,存儲陣列以戴爾MD1000爲主,2007的數據表明,優酷網已有1000多臺服務器遍佈在全國各大省市,現在應該更多了吧。

二、網站前端框架

從一開始,優酷網就自建了一套CMS來解決前端的頁面顯示,各個模塊之間分離得比較恰當,前端可擴展性很好,UI的分離,讓開發與維護變得十分簡單和靈活,下圖是優酷前端的模塊調用關係:

這樣,就根據module、method及params來確定調用相對獨立的模塊,顯得非常簡潔。下面附一張優酷的前端局部架構圖:

 

三、數據庫架構

應該說優酷的數據庫架構也是經歷了許多波折,從一開始的單臺MySQL服務器(Just Running)到簡單的MySQL主從複製、SSD優化、垂直分庫、水平sharding分庫,這一系列過程只有經歷過纔會有更深的體會吧,就像MySpace的架構經歷一樣,架構也是一步步慢慢成長和成熟的。

1、簡單的MySQL主從複製:

MySQL的主從複製解決了數據庫的讀寫分離,並很好的提升了讀的性能,其原來圖如下:

其主從複製的過程如下圖所示:

但是,主從複製也帶來其他一系列性能瓶頸問題:

  1. 寫入無法擴展
  2. 寫入無法緩存
  3. 複製延時
  4. 鎖表率上升
  5. 表變大,緩存率下降

那問題產生總得解決的,這就產生下面的優化方案,一起來看看。

2、MySQL垂直分區

如果把業務切割得足夠獨立,那把不同業務的數據放到不同的數據庫服務器將是一個不錯的方案,而且萬一其中一個業務崩潰了也不會影響其他業務的正常進行,並且也起到了負載分流的作用,大大提升了數據庫的吞吐能力。經過垂直分區後的數據庫架構圖如下:

然而,儘管業務之間已經足夠獨立了,但是有些業務之間或多或少總會有點聯繫,如用戶,基本上都會和每個業務相關聯,況且這種分區方式,也不能解決單張表數據量暴漲的問題,因此爲何不試試水平sharding呢?

 

3、MySQL水平分片(Sharding)

這是一個非常好的思路,將用戶按一定規則(按id哈希)分組,並把該組用戶的數據存儲到一個數據庫分片中,即一個sharding,這樣隨着用戶數量的增加,只要簡單地配置一臺服務器即可,原理圖如下:

如何來確定某個用戶所在的shard呢,可以建一張用戶和shard對應的數據表,每次請求先從這張表找用戶的shard id,再從對應shard中查詢相關數據,如下圖所示:

但是,優酷是如何解決跨shard的查詢呢,這個是個難點,據介紹優酷是儘量不跨shard查詢,實在不行通過多維分片索引、分佈式搜索引擎,下策是分佈式數據庫查詢(這個非常麻煩而且耗性能)

 

四、緩存策略

貌似大的系統都對“緩存”情有獨鍾,從http緩存到memcached內存數據緩存,但優酷表示沒有用內存緩存,理由如下:

  1. 避免內存拷貝,避免內存鎖
  2. 如接到老大哥通知要把某個視頻撤下來,如果在緩存裏是比較麻煩的

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

但爲何我們訪問優酷會如此流暢,與土豆相比優酷的視頻加載速度略勝一籌?這個要歸功於優酷建立的比較完善的內容分發網絡(CDN),它通過多種方式保證分佈在全國各地的用戶進行就近訪問——用戶點擊視頻請求後,優酷網將根據用戶所處地區位置,將離用戶最近、服務狀況最好的視頻服務器地址傳送給用戶,從而保證用戶可以得到快速的視頻體驗。這就是CDN帶來的優勢,就近訪問,有關CDN的更多內容,請大家Google一下。

好了,就總結這麼多了,有興趣的同學接着補充,雖然很多資料圖片都來自網絡,但整理也不容易,歡迎轉載,轉載留個出處:青藤屋 原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章