引言
這裡總結整理了諸如國外wikipedia,Facebook,Yahoo!,YouTube,MySpace,Twitter,國內如優酷網等大型網站的技術架構。
1、WikiPedia 技術架構
WikiPedia 技術架構圖Copy @Mark Bergsma
來自wikipedia的資料:峰值每秒鐘3萬個 HTTP 請求 每秒鐘 3Gbit 流量, 近乎375MB
350 臺 PC 伺服器。
GeoDNSA :40-line patch for BIND to add geographical filters support to the existent views in BIND", 把使用者帶到最近的伺服器。GeoDNS 在 WikiPedia 架構中擔當重任當然是由 WikiPedia 的內容性質決定的--面向各個國家,各個地域。
負載均衡:LVS,請看下圖:
2、Facebook 架構
Facebook 搜尋功能的架構示意圖
細心的讀者一定能發現,上副架構圖之前出現在此文之中:從幾幅架構圖中偷得半點海里資料處理經驗。本文與前文最大的不同是,前文只有幾幅,此文系列將有上百幅架構圖,任您盡情觀賞。
3、Yahoo! Mail 架構
Yahoo! Mail 架構
Yahoo! Mail 架構部署了 Oracle RAC,用來儲存 Mail 服務相關的 Meta 資料。
4、twitter技術架構
twitter的整體架構設計圖
快取在大型web專案中起到了舉足輕重的作用,畢竟資料越靠近CPU存取速度越快。下圖是twitter的快取架構圖:
關於快取系統,還可以看看下幅圖:
5、Google App Engine技術架構
GAE的架構圖
簡單而言,上述GAE的架構分為如圖所示的三個部分:前端,Datastore和服務群。
前端包括4個模組:Front End,Static Files,App Server,App Master。
Datastore是基於BigTable技術的分散式資料庫,雖然其也可以被理解成為一個服務,但是由於其是整個App Engine唯一儲存持久化資料的地方,所以其是App Engine中一個非常核心的模組。其具體細節將在下篇和大家討論。
整個服務群包括很多服務供App Server呼叫,比如Memcache,圖形,使用者,URL抓取和任務佇列等。
6、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的雲架構圖
7、優酷網的技術架構
從一開始,優酷網就自建了一套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中查詢相關資料,如下圖所示:
是如何解決跨shard的查詢呢,這個是個難點,據介紹優酷是儘量不跨shard查詢,實在不行通過多維分片索引、分散式搜尋引擎,下策是分散式資料庫查詢(這個非常麻煩而且耗效能)。
快取策略
貌似大的系統都對“快取”情有獨鍾,從http快取到memcached記憶體資料快取,但優酷表示沒有用記憶體快取,理由如下:
避免記憶體拷貝,避免記憶體鎖
如接到老大哥通知要把某個視訊撤下來,如果在快取裡是比較麻煩的
而且Squid 的 write() 使用者程序空間有消耗,Lighttpd 1.5 的 AIO(非同步I/O) 讀取檔案到使用者記憶體導致效率也比較低下。
但為何我們訪問優酷會如此流暢,與土豆相比優酷的視訊載入速度略勝一籌?這個要歸功於優酷建立的比較完善的內容分發網路(CDN),它通過多種方式保證分佈在全國各地的使用者進行就近訪問——使用者點選視訊請求後,優酷網將根據使用者所處地區位置,將離使用者最近、服務狀況最好的視訊伺服器地址傳送給使用者,從而保證使用者可以得到快速的視訊體驗。這就是CDN帶來的優勢,就近訪問。
原文: https://blog.csdn.net/weixin_42526793/article/details/80792413