YouTube 僅用9 名工程師就能支援每天1 億次影片觀看的11 個原因

YouTube 僅用9 名工程師就能支援每天1 億次影片觀看的11 個原因


最初,他們的財力有限,只能透過信用卡債務和基礎設施借款為YouTube 籌集資金。但財務上的緊張,也倒逼他們打造出一套出色的可擴展性技術。第二年,他們平台的影片日播放量就達到了1 億。更令人出乎意料的是,他們只用了9 名工程師就做到了這一點。

作者| NK

策劃| 言徵 

2005 年2 月, 美國加州。全球知名的線上支付服務公司PayPal已經走過6 年2 個月的時間,3 名早期員工就像發現了網路世界的流量密碼一樣,開始尋找屬於他們的機會。

最後,他們希望建立一個分享影片的平台。後來這個在車庫裡誕生的平台,就是大名鼎鼎的YouTube。

最初,他們的財力有限,只能透過信用卡債務和基礎設施借款為YouTube 籌集資金。但財務上的緊張,也倒逼他們打造出一套出色的可擴展性技術。

第二年,他們平台的影片日播放量就達到了1 億。更令人出乎意料的是,他們只用了9 名工程師就做到了這一點。 

YouTube 是如何做到的?以下為大家一一揭開當年的設計要點。(Ps:乍看起來,樸實無華,大巧不工。)

1.神奇飛輪

他們採用一種「飛輪」的方法去收集和分析系統數據,以便於可擴展性的實現。他們的工作流程是一個不斷循環的過程:辨識瓶頸→修復瓶頸→喝水→睡覺。這種方法好處在於避免了對高階硬體的需求(不用大規模部署),降低了硬體成本。

可擴展性循環(Scalability loop)可擴展性循環(Scalability loop)

2.看似無聊、卻大巧不工的技術棧

他們讓技術堆疊保持簡單,並使用經過驗證的技術。他們的技術堆疊絕對讓你想像不到:

YouTube 技術堆疊YouTube 技術堆疊

  • MySQL 儲存元資料:影片標題、標籤、描述和使用者資料。因為修復MySQL 中的問題很容易。 
  • Lighttpd Web 伺服器提供視訊服務。 
  • 使用Linux作為作業系統。他們使用Linux 工具來檢查下列系統行為:strace、ssh、rsync、vmstat 和tcpdump。 
  • 應用程式伺服器上的Python。因為它提供了許多可重複使用的函式庫,而且他們不想重新發明輪子。換句話說,Python 允許快速靈活的開發。根據他們的測量,Python 從來都不是瓶頸。值得注意的是,他們使用Python 到C 的編譯器和C 語言擴充來執行CPU 密集型任務。

3.保持簡單

他們認為軟體架構是可擴展性的根源。他們沒有盲目追求「流行語」去擴大規模。因此,他們保持架構簡單——使程式碼審查更容易。這使他們能夠快速重新架構以滿足不斷變化的需求。例如,他們從約會網站轉向影片分享網站。

此外,他們也保持網路路徑簡單。因為網路設備具有可擴充性限制。

硬體成本硬體成本

他們也使用了商品硬體。它使他們能夠減少功耗和維護費用,並保持較低的成本。

此外,他們使規模感知程式碼與應用程式開發相對獨立。

4、選擇你的主戰場

他們將許多不重要的問題給外包了。因為他們想專注於重要的事情。他們沒有時間或資源來建立自己的基礎設施來提供熱門影片。於是,他們把熱門影片放到了第三方CDN。好處:

  • 低延遲。由於使用者的網路跳數較少 ;
  • 高性能。因為它提供的是記憶體中的影片; 
  • 高可用性。因為自動複製。

他們從同地資料中心提供受歡迎度稍低的影片。並採用軟體RAID,透過多磁碟並行存取來提高效能。還調整了他們的伺服器以防止快取抖動。

他們將基礎設施保留在同一地點的資料中心,有兩點原因。其一,可以輕鬆調整伺服器以滿足其需求。其二,方便自己的合約談判。

選擇你的主戰場;外包問題以釋放資源選擇你的主戰場;外包問題以釋放資源

每個影片有4 個縮圖。因此,他們在服務小物件時面臨問題:大量磁碟查找和檔案系統限制。因此,他們將縮圖放入BigTable 中 。它是一種分散式資料存儲,具有許多優點:透過對檔案進行聚類來避免小檔案問題、提高效能、多層快取低延遲、易於配置。

他們還偽造數據以防止昂貴的交易費用。例如,他們偽造影片觀看次數並非同步更新計數器。當今近似正確性的一種流行技術是:布隆過濾器,它是一種機率資料結構。

5.可擴展性三大支柱

YouTube 依賴可擴展性的三大支柱:無狀態、複製和分割區。

可擴展性的3 支柱可擴展性的3 支柱

他們保持網路伺服器無狀態(stateless),並透過複製進行擴展。

他們複製replicated資料庫伺服器以實現讀取可擴展性和高可用性。並對副本之間的流量進行負載平衡。但這種方法引起了問題:複製滯後和寫入可擴展性問題。

複製與分區複製與分區

因此,他們對資料庫進行了分區,以提高寫入可擴展性、快取局部性和效能。partitioned它也將硬體成本降低了30%。

此外,他們還研究了資料存取模式來確定分區層級。例如,他們研究了流行的查詢、連接和事務一致性,並選擇使用者作為分區層級。

6、紮實的工程團隊

知識豐富的團隊是可擴展性的重要資產。

跨領域團隊跨領域團隊

他們保持較小的團隊規模t以改善溝通:只有9 名工程師。他們的團隊非常擅長跨領域技能。

7.不要重複自己的話

他們使用快取cache來防止重複昂貴的操作。它使他們能夠擴展瀏覽量。

多級快取可擴展多級快取可擴展

他們還在多個級別實現了緩存- 並且減少了延遲。

8、排序:重要的指標要優先

對重要流量進行排名;二八原則(帕累托原則)對重要流量進行排名;二八原則(帕累托原則)

他們將影片觀看流量優先,排在其他所有流量之上。因此,他們為影片觀看流量保留了專用資源群集。這一點提供了高可用性。

9、防止“雷群”

如果許多並發客戶端查詢伺服器,就會出現雷群問題。它會降低性能。

雷群(The Thundering Herd)問題雷群(The Thundering Herd)問題

他們使用抖動來防止雷群問題。例如,他們為流行影片的快取過期添加了抖動。

10.打持久戰

他們專注於宏觀層面的事物:演算法和可擴展性。他們進行了快速的駭客攻擊,以贏得更多時間來建立長期解決方案。例如,使用Python 消除不良API 以防止短期問題。

冒險與回報冒險與回報

他們容忍組件中的缺陷。當遇到瓶頸時:他們要么重寫組件,要么刪除它。

他們用效率換取可擴展性。有四個例子:

  • 他們選擇了Python 而不是C; 
  • 他們在組件之間保持清晰的界限以進行橫向擴展。和容忍的延遲;
  • 他們優化了軟體,使其足夠快。但並不沉迷於機器效率; 
  • 他們根據頻寬可用性從伺服器位置提供視訊。並且不基於延遲。

11、適應性演化

他們調整了系統以滿足他們的需求。例子:

  • 關鍵元件使用RPC而不是HTTP REST,這提高了效能; 
  • 自訂BSON作為資料序列化格式。它提供了高性能;
  • 應用程式某些部分的最終一致性以實現可擴展性。例如,使用者評論中的「讀你所寫」的一致性模型 ;
  • 學習Python 是為了防止常見的陷阱。當然,還有分析需求的原因;
  • 客製化開源軟體;
  • 優化資料庫查詢; 
  • 使非關鍵即時任務異步。

編碼原則編碼原則

他們沒有浪費時間編寫程式碼來限制人們。相反,採用了出色的工程實踐- 編碼約定來改進其代碼結構。

——後記—— 

2006 年11 月,Google以16.5 億美元的價格收購了YouTube,並把它當作一個子公司來運作。時至今日,它依然是影片分享市場的領導者,每天有50 億次影片瀏覽量。

根據《富比士》報道,YouTube 創辦人的淨資產超過1 億美元。YouTube創立僅20 個月便成影片搜尋界的龍頭,可謂是締造了一個矽谷奇蹟。

參考連結:https://newsletter.systemdesign.one/p/youtube-scalability