作者 | NK
策劃 | 言征
2005 年 2 月, 美國加利福尼亞州。全球知名的在線支付服務公司PayPal已經走過 6 年零 2 個月的時間,3 名早期員工就像發現了互聯網世界的流量密碼一樣,開始尋找屬于他們的機會。
最后,他們希望建立一個分享視頻的平臺。后來這個在車庫里誕生的平臺,就是大名鼎鼎的YouTube。
最初,他們的財力有限,只能通過信用卡債務和基礎設施借款為 YouTube 籌集資金。但財務上的緊張,也倒逼著他們打造出一套出色的可擴展性技術。
第二年,他們平臺的視頻日播放量就達到了 1 億。更令人出乎意料的是,他們只用了 9 名工程師就做到了這一點。
YouTube 是如何做到的?下面為大家一一揭開當年的設計要點。(Ps:乍看起來,樸實無華,大巧不工。)
1、神奇飛輪
他們采用一種“飛輪”的方法去收集和分析系統數據,以便于可擴展性的實現。他們的工作流程是一個不斷循環的過程:識別瓶頸→修復瓶頸→喝水→睡覺。這種方法好處在于避免了對高端硬件的需求(不用大規模部署),降低了硬件成本。
可擴展性循環(Scalability loop)
2、看似無聊、卻大巧不工的技術棧
他們讓技術堆棧保持簡單,并使用經過驗證的技術。他們的技術堆棧絕對讓你想象不到:
YouTube 技術棧
- MySQL 存儲元數據:視頻標題、標簽、描述和用戶數據。因為修復 MySQL 中的問題很容易。
- Lighttpd Web 服務器提供視頻服務。
- 使用linux作為操作系統。他們使用 Linux 工具來檢查下列系統行為:strace、ssh、rsync、vmstat 和 tcpdump。
- 應用程序服務器上的 Python/ target=_blank class=infotextkey>Python。因為它提供了許多可重用的庫,而且他們不想重新發明輪子。換句話說,Python 允許快速靈活的開發。根據他們的測量,Python 從來都不是瓶頸。值得注意的是,他們使用 Python 到 C 的編譯器和 C 語言擴展來運行 CPU 密集型任務。
3、保持簡單
他們認為軟件架構是可擴展性的根源。他們沒有盲目追求“流行語”去擴大規模。因此,他們保持架構簡單——使代碼審查更容易。這使他們能夠快速重新架構以滿足不斷變化的需求。例如,他們從約會網站轉向視頻共享網站。
此外,他們還保持網絡路徑簡單。因為網絡設備具有可擴展性限制。
硬件成本
他們還使用了商品硬件。它使他們能夠減少功耗和維護費用,并保持較低的成本。
此外,他們使規模感知代碼與應用程序開發相對獨立。
4、選擇你的主戰場
他們將許多不重要的問題給外包出去了。因為他們想專注于重要的事情。他們沒有時間或資源來構建自己的基礎設施來提供流行視頻。于是,他們把熱門視頻放到了第三方CDN上。好處:
- 低延遲。由于用戶的網絡跳數較少 ;
- 高性能。因為它提供的是內存中的視頻;
- 高可用性。因為自動復制。
他們從同地數據中心提供受歡迎度稍低些的視頻。并采用軟件RAID,通過多磁盤并行訪問來提高性能。還調整了他們的服務器以防止緩存抖動。
他們將基礎設施保留在同一地點的數據中心,有兩點原因。其一,可以輕松調整服務器以滿足其需求。其二,方便自己的合同談判。
選擇你的主戰場;外包問題以釋放資源
每個視頻有 4 個縮略圖。因此,他們在服務小對象時面臨著問題:大量磁盤查找和文件系統限制。因此,他們將縮略圖放入 BigTable 中 。它是一種分布式數據存儲,具有許多優點:通過對文件進行聚類來避免小文件問題、提高性能、多級緩存低延遲、易于配置。
他們還偽造數據以防止昂貴的交易費用。例如,他們偽造視頻觀看次數并異步更新計數器。當今近似正確性的一種流行技術是:布隆過濾器,它是一種概率數據結構。
5、可擴展性三大支柱
YouTube 依賴可擴展性的三大支柱:無狀態、復制和分區。
可擴展性的 3 個支柱
他們保持網絡服務器無狀態(stateless),并通過復制進行擴展。
他們復制replicated數據庫服務器以實現讀取可擴展性和高可用性。并對副本之間的流量進行負載平衡。但這種方法引起了問題:復制滯后和寫入可擴展性問題。
復制與分區
因此,他們對數據庫進行了分區,以提高寫入可擴展性、緩存局部性和性能。partitioned它還將硬件成本降低了 30%。
此外,他們還研究了數據訪問模式來確定分區級別。例如,他們研究了流行的查詢、連接和事務一致性,并選擇用戶作為分區級別。
6、扎實的工程團隊
知識豐富的團隊是可擴展性的重要資產。
跨學科團隊
他們保持較小的團隊規模t以改善溝通:僅 9 名工程師。他們的團隊非常擅長跨學科技能。
7、不要重復自己的話
他們使用緩存cache來防止重復昂貴的操作。它使他們能夠擴展瀏覽量。
多級緩存可擴展
他們還在多個級別實現了緩存 - 并且減少了延遲。
8、排序:重要的指標要優先
對重要流量進行排名;二八原則(帕累托原則)
他們將視頻觀看流量優先,排在其他所有流量之上。因此,他們為視頻觀看流量保留了專用資源集群。這一點提供了高可用性。
9、防止“雷群”
如果許多并發客戶端查詢服務器,就會出現雷群問題。它會降低性能。
雷群(The Thundering Herd)問題
他們使用抖動來防止雷群問題。例如,他們為流行視頻的緩存過期添加了抖動。
10、打持久戰
他們專注于宏觀層面的事物:算法和可擴展性。他們進行了快速的黑客攻擊,以贏得更多時間來構建長期解決方案。例如,使用 Python 消除不良 API 以防止短期問題。
冒險與回報
他們容忍組件中的缺陷。當遇到瓶頸時:他們要么重寫組件,要么刪除它。
他們用效率換取可擴展性。有四個例子:
- 他們選擇了 Python 而不是 C;
- 他們在組件之間保持清晰的界限以進行橫向擴展。和容忍的延遲;
- 他們優化了軟件,使其足夠快。但并不癡迷于機器效率;
- 他們根據帶寬可用性從服務器位置提供視頻。并且不基于延遲。
11、適應性進化
他們調整了系統以滿足他們的需求。例子:
- 關鍵組件使用RPC而不是 HTTP REST,這提高了性能;
- 自定義BSON作為數據序列化格式。它提供了高性能;
- 應用程序某些部分的最終一致性以實現可擴展性。例如,用戶評論中的“讀你所寫”的一致性模型 ;
- 學習 Python 是為了防止常見的陷阱。當然,還有分析需求的原因;
- 定制開源軟件;
- 優化數據庫查詢;
- 使非關鍵實時任務異步。
編碼原則
他們沒有浪費時間編寫代碼來限制人們。相反,采用了出色的工程實踐- 編碼約定來改進其代碼結構。
——后記——
2006 年 11 月,谷歌以 16.5 億美元的價格收購了 YouTube,并把它當做一個子公司來運營。時至今日,它依然是視頻分享市場的領導者,每天有 50 億次視頻瀏覽量。
據《福布斯》報道,YouTube 創始人的凈資產超過 1 億美元。YouTube創立僅 20 個月便成視頻搜尋界的龍頭,可謂是締造了一個硅谷奇跡。
參考鏈接:https://newsletter.systemdesign.one/p/youtube-scalability