如果你想構建一個可以承載日訪問量40億次的網站,YouTube有許多值得借鑒的地方。本文是YouTube的工程師Mike Solomon在PyCon(PyCon是Python開源社區的開發者年度盛會)上關于YouTube擴展性演講的摘要,相信會對大家有所啟發。
許多團隊都使得他們的基礎架構越來越復雜,YouTube團隊卻盡量保持簡單的風格。他們使用Python作為主要開發語言,使用MySQL開源數據庫,并一直使用Apache作為Web服務器。對一個如此龐大的站點而言,許多重要特性都源于點點滴滴的Python代碼。
這并不意味著YouTube不追求創新,他們更追求一種技術哲學,而非炒作。究竟是什么成就了世界上的視頻網站?敬請閱讀。
驚人的數字
•日訪問量40億次
•每分鐘上傳60小時的視頻
•超過3.5億終端訪問
•利潤是2010年收入的雙倍
•視頻的數量上升了9個數量級,開發人員卻只上升了2個數量級
•一百萬行Python代碼
軟件架構
•Python:Python是YouTube的主要編程語言。
•Apache:YouTube一直使用Apache,每次HTTP請求都經由Apache。
•Linux:Linux是構建YouTube的基石,它有許多強大的工具,如strace何tcpdump。
•MySQL:MySQL有龐大的用戶群。YouTube使用它的關系數據庫特性,也使用它存儲BLOB數據。
•Vitess:Vitess是由YouTube發起的一個開源項目,旨在打造高性能的MySQL前端。
•Zookeeper:分布式的鎖服務器。
•Wiseguy:一個CGI Servlet容器。
•Spitfire:一個模板系統。
•Serialization formats:YouTube重寫了BSON實現,速度提升了10-15倍。
關于擴展性的思考
以下雖然都不是什么新思想,但希望對你有所助益。
•分而治之是擴展性技術的靈魂。考慮以層次化的方式完成所有的工作。這也是數據分片的癥結所在。要知道如何將數據分區,以及如何將已分區的數據進行關聯。總而言之,保持簡單與松散的耦合非常必要。
•充分利用Python的動態特性,構建易于擴展的軟件架構。
•近似的正確性。要相信監控系統所報告的系統運行狀態。如果問題沒有出現,就認為一切良好。
•不一致的數據模型。例如,閱讀評論的人和寫評論的人對你刷新頁面的動作會有不同的反應,但也不必完全基于事務處理進行系統設計,這會顯得矯枉過正。我們依然需要不一致的數據模型。
•分布式系統的隨機性。分布式系統就如同氣象系統一樣,對分布式系統進行調試會存在更多的隨機性。例如,緩存過期。一般情況下,服務器會將流行的視頻緩存24小時。如果一旦出現緩存同時過期的情況,服務器將同時開始緩存,荷載如聞驚雷!
•快的函數調用就是不做任何調用。合理設計事務處理發生的間隔和次數。
•仔細觀察API,并做到心中有數。如何定義輸入、輸出?所有的函數調用本質上都是圍繞數據發生的,那在函數調用之后,又會發生什么?
•在Python中運用RPC重定向。程序員是代碼的構建者,因此要做好約定。如果代碼不幸失敗了,還可以從RPC輸出中追查原因。
•沒有完美的組件。一個組件的運行周期可能持續1-6個月,具體多久,誰也說不清。隨著時間的推移,我們會用Python和C重寫一些東西,這證明你正在淘汰舊的組件,當你觀察到一個新組件出現的時候,它誕生了。
•沒有人了解整個系統的運作機制。因此,我們需要定義組件。視頻轉碼和視頻搜索截然不同,建立良好的數據規范非常重要。
•效率與擴展性并重。有效率的是用C實現進程,但這樣的方式缺乏擴展性。
•著眼于宏觀層面、組件及其失敗的原因。使用RPC是否明智?內聯如何?進行分解研究,也許會發現不同之處。
•重視算法。與其絞盡腦汁用Python來實現高效的算法,不如用它做些更有實用價值的事。在這方面,C語言有它的優勢。
•我們很少從事面向對象設計。我們使用了大量的名稱空間,使用類來組織數據,但極少面向對象。
•我樂意用下面的詞匯來形容我們的代碼樹:簡單、實用、優雅、正交、可組合,這是我們的追求。
總結
YouTube解決問題的哲學只有一個詞:簡單。許多YouTube的產品初只是源于一個簡單的Python腳本。這正是應了我們的一句老話,不積跬步,無以至千里;不積小流,無以成江海。