從一開始,優酷網就自建了一套CMS來解決前端的頁面顯示,各個模塊之間分離得比較恰當,前端可擴展性很好,UI的分離,讓開發與維護變得十分簡單和靈活,下圖是優酷前端的模塊調用關系:
這樣,就根據module、method及params來確定調用相對獨立的模塊,顯得非常簡潔。下圖是優酷的前端局部架構圖:
優酷的數據庫架構也是經歷了許多波折,從一開始的單台MySQL服務器(Just Running)到簡單的MySQL主從復制、SSD優化、垂直分庫、水平sharding分庫。
1.簡單的MySQL主從復制。
MySQL的主從復制解決了數據庫的讀寫分離,並很好的提升了讀的性能,其原來圖如下:
其主從復制的過程如下圖所示:
但是,主從復制也帶來其他一系列性能瓶頸問題:
寫入無法擴展
寫入無法緩存
復制延時
鎖表率上升
表變大,緩存率下降
那問題產生總得解決的,這就產生下面的優化方案。
2. MySQL垂直分區
如果把業務切割得足夠獨立,那把不同業務的數據放到不同的數據庫服務器將是一個不錯的方案,而且萬一其中一個業務崩潰了也不會影響其他業務的正常進行,並且也起到了負載分流的作用,大大提升了數據庫的吞吐能力。經過垂直分區后的數據庫架構圖如下:
然而,盡管業務之間已經足夠獨立了,但是有些業務之間或多或少總會有點聯系,如用戶,基本上都會和每個業務相關聯,況且這種分區方式,也不能解決單張表數據量暴漲的問題,因此為何不試試水平sharding呢?
3. MySQL水平分片(Sharding)
這是一個非常好的思路,將用戶按一定規則(按id哈希)分組,並把該組用戶的數據存儲到一個數據庫分片中,即一個sharding,這樣隨着用戶數量的增加,只要簡單地配置一台服務器即可,原理圖如下:
如何來確定某個用戶所在的shard呢,可以建一張用戶和shard對應的數據表,每次請求先從這張表找用戶的shard id,再從對應shard中查詢相關數據,如下圖所示:
、分布式搜索引擎,下策是分布式數據庫查詢(這個非常麻煩而且耗性能)。
緩存策略
貌似大的系統都對“緩存”情有獨鍾,從http緩存到memcached內存數據緩存,但優酷表示沒有用內存緩存,理由如下:
避免內存拷貝,避免內存鎖
如接到老大哥通知要把某個視頻撤下來,如果在緩存里是比較麻煩的
而且Squid 的 write() 用戶進程空間有消耗,Lighttpd 1.5 的 AIO(異步I/O) 讀取文件到用戶內存導致效率也比較低下。
但為何我們訪問優酷會如此流暢,與土豆相比優酷的視頻加載速度略勝一籌?這個要歸功於優酷建立的比較完善的內容分發網絡(CDN),它通過多種方式保證分布在全國各地的用戶進行就近訪問——用戶點擊視頻請求后,優酷網將根據用戶所處地區位置,將離用戶最近、服務狀況最好的視頻服務器地址傳送給用戶,從而保證用戶可以得到快速的視頻體驗。這就是CDN帶來的優勢,就近訪問。
文章很詳細,配圖也很確切!
轉載地址:http://www.tuicool.com/articles/eUNRziV