在線視頻王者YouTube的技術哲學

http://cloud.csdn.net/a/20120409/2804327.html


導讀:許多團隊都使得他們的基礎架構越來越複雜,YouTube團隊卻儘量保持簡單的風格。正是憑藉簡單的技術哲學,才成就了YouTube在線視頻王者的盛名。

如果你想構建一個可以承載日訪問量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數據。
  • VitessVitess是由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腳本。這正是應了我們的一句老話,不積跬步,無以至千里;不積小流,無以成江海。(張志平/編譯)

原文鏈接:7 Years of YouTube Scalability Lessons in 30 Minutes


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章