大型網站的架構設計圖分享-轉

 

近段時間以來,經過接觸有關海量數據處理和搜索引擎的諸多技術,經常見識到很多精妙絕 倫的架構圖。除了往往感嘆於每幅圖表面上的繪製的精細以外,更爲架構圖背後所隱藏的設計思想所歎服。我的這兩天一直在蒐集各大型網站的架構設計圖,一爲了 一飽眼福,領略各種大型網站架構設計的精彩以外,二來也可供閒時反覆琢磨體會,何樂而不爲呢?特此,總結整理了諸如國外wikipedia,Facebook,Yahoo!,YouTube,MySpace,Twitter,國內如優酷網等大型網站的技術架構(本文重點分析優酷網的技術架構),以饗讀者。前端

    本文着重凸顯每一幅圖的精彩之處與其背後含義,而圖的說明性文字則從簡從略。ok,好好享受此番架構盛宴吧。固然,如有任何建議或問題,歡迎不吝指正。謝謝。node

 

一、WikiPedia 技術架構

 

 

  1. 來自wikipedia的數據:峯值每秒鐘3萬個 HTTP 請求 每秒鐘 3G bit流量, 近乎 375MB 350 臺 PC 服務器。
  2. GeoDNSA :40-line patch for BIND to add geographical filters support to the existent views in BIND", 把用戶帶到最近的服務器。GeoDNS 在 WikiPedia 架構中擔當重任固然是由 WikiPedia 的內容性質決定的--面向各個國家,各個地域。
  3. 負載均衡:LVS,請看下圖:

二、Facebook 架構

Facebook 搜索功能的架構示意圖web

    細心的讀者必定能發現,上副架構圖以前出如今此文之中:從幾幅架構圖中偷得半點海里數據處理經驗。本文與前文最大的不一樣是,前文只有幾幅,此文系列將有上百幅架構圖,任您盡情觀賞。算法

  • 四、twitter技術架構

                                                     twitter的總體架構設計圖數據庫

    twitter平臺大體由twitter.com、手機以及第三方應用構成,以下圖所示(其中流量主要以手機和第三方爲主要來源):緩存

    緩存在大型web項目中起到了舉足輕重的做用,畢竟數據越靠近CPU存取速度越快。下圖是twitter的緩存架構圖:服務器

    關於緩存系統,還能夠看看下幅圖:網絡

 

  • 六、Amazon技術架構

                                    Amazon的Dynamo Key-Value存儲架構圖架構

    可能有讀者並不熟悉Amazon,它如今已是全球商品品種最多的網上零售商和全球第2大互聯網公司。而以前它僅僅是一個小小的網上書店。ok,下面,我們來見識下它的架構。負載均衡

    Dynamo是亞馬遜的key-value模式的存儲平臺,可用性和擴展性都很好,性能也不錯:讀寫訪問中99.9%的響應時間都在300ms內。按分佈 式系統經常使用的哈希算法切分數據,分放在不一樣的node上。Read操做時,也是根據key的哈希值尋找對應的node。Dynamo使用了 Consistent Hashing算法,node對應的再也不是一個肯定的hash值,而是一個hash值範圍,key的hash值落在這個範圍內,則順時針沿ring找,碰 到的第一個node即爲所需。

    Dynamo對Consistent Hashing算法的改進在於:它放在環上做爲一個node的是一組機器(而不是memcached把一臺機器做爲node),這一組機器是經過同步機制保證數據一致的。

    下圖是分佈式存儲系統的示意圖,讀者可觀摩之:

    Amazon的雲架構圖以下:

                                           Amazon的雲架構圖

  • 七、優酷網的技術架構

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

    這樣,就根據module、method及params來肯定調用相對獨立的模塊,顯得很是簡潔。下圖是優酷的前端局部架構圖:

    優酷的數據庫架構也是經歷了許多波折,從一開始的單臺MySQL服務器(Just Running)到簡單的MySQL主從複製、SSD優化、垂直分庫、水平sharding分庫。

      1. 簡單的MySQL主從複製。
        MySQL的主從複製解決了數據庫的讀寫分離,並很好的提高了讀的性能,其原來圖以下:
      2. 可是,主從複製也帶來其餘一系列性能瓶頸問題:

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

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

      3.  MySQL垂直分區

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

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

      4.  MySQL水平分片(Sharding)

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

          如何來肯定某個用戶所在的shard呢,能夠建一張用戶和shard對應的數據表,每次請求先從這張表找用戶的shard id,再從對應shard中查詢相關數據,以下圖所示:    可是,優酷是如何解決跨shard的查詢呢,這個是個難點,據介紹優酷是儘可能不跨shard查詢,實在不行經過多維分片索引、分佈式搜索引擎,下策是分佈式數據庫查詢(這個很是麻煩並且耗性能)。

      5.  緩存策略

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

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

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

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

相關文章
相關標籤/搜索