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