<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 在 30 分鐘內進行 7 年的 YouTube 可擴展性課程 > 原文: [http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html) ![](https://img.kancloud.cn/4e/bc/4ebc7ce1aebe536f313ed5d99d05d99a_177x74.png) 如果您開始建立約會網站,而最終建立了每天處理 40 億次觀看次數的視頻共享網站(YouTube),那么您可能會在此過程中學到一些東西。 確實,YouTube 的原始工程師之一 Mike Solomon 確實學到了很多東西,他在 [PyCon](https://us.pycon.org/2012/) : [在 YouTube 上的可擴展性上做了演講](http://www.youtube.com/watch?v=G-lGCC4KKok) 。 這不是架構驅動的討論,我們將通過介紹許多盒子相互連接的方式進行介紹。 邁克可以這樣講。 他致力于建立 YouTube 的 Servlet 基礎結構,視頻索引功能,視頻轉碼系統,全文搜索,CDN 等。 但是,相反,他退后了一步,仔細研究了工作時間,并分享了一些深刻的經驗教訓,這些經驗教訓顯然是來之不易的。 對我來說,要講的主要內容是使用非常簡單的工具完成了**。 盡管許多團隊都在轉向更復雜的生態系統,但 YouTube 確實做到了簡單。 他們主要使用 Python 進行編程,使用 MySQL 作為其數據庫,他們一直使用 Apache,甚至對于一個如此龐大的站點來說,新功能都始于非常簡單的 Python 程序。 這并不意味著 YouTube 不會做酷的事情,而是做的,但是使所有事情協同工作的更多的是哲學或做事方式,而不是技術專長。 是什么使 YouTube 成為世界上最大的網站之一? 繼續閱讀并查看...** ## 統計信息 * 每天 40 億次觀看 * 每分鐘上傳 60 個小時的視頻 * 350+百萬臺設備啟用了 YouTube * 2010 年收入翻了一番 * 視頻的數量增加了 9 個數量級,而開發人員的數量僅增加了 2 個數量級。 * 一百萬行 Python 代碼 ## 堆棧 * **Python-** YouTube 的大部分代碼行仍在 Python 中。 每次觀看 YouTube 視頻時,您都在執行一堆 Python 代碼。 * **Apache** -當您認為需要擺脫它時,則不需要。 Apache 是??YouTube 上真正的搖滾明星技術,因為它們保持了簡單。 每個請求都通過 Apache。 * **Linux** -Linux 的好處是總有一種方法可以進入并查看您的系統運行情況。 無論您的應用程序表現多么糟糕,您都可以使用 strace 和 tcpdump 之類的 Linux 工具對其進行查看。 * **MySQL** -使用很多。 觀看視頻時,您正在從 MySQL 獲取數據。 有時它使用關系數據庫或 Blob 存儲。 這是關于調整和選擇組織數據的方式。 * [**Vitess**](http://code.google.com/p/vitess/) -YouTube 發布的新項目,用 Go 編寫,它是 MySQL 的前端。 它動態地進行了很多優化,它重寫查詢并充當代理。 目前,它可以處理每個 YouTube 數據庫請求。 它基于 RPC。 * **Zookeeper** -分布式鎖定服務器。 用于配置。 真正有趣的技術。 難以正確使用,因此請閱讀手冊 * **Wiseguy** -一個 CGI Servlet 容器。 * **Spitfire** -一個模板系統。 它有一個抽象的語法樹,讓他們進行轉換以使處理更快。 * **序列化格式** -無論使用哪種格式,它們都非常昂貴。 測量。 不要用泡菜 不是一個好選擇。 找到的協議緩沖區很慢。 他們編寫了自己的 BSON 實現,比您可以下載的實現快 10-15 倍。 ## 一般課程 * YouTube 的 **Tao** :選擇最簡單的解決方案,并附帶最實際的保證。 您需要所有這些東西的原因是您需要靈活性來解決問題。 在您指定的那一刻,您就會把自己粉刷成一個角落。 您不會做出這些保證。 嘗試做出所有這些保證時,您的問題會自動變得更加復雜。 您不會離開自己。 * **整個過程就是**的可伸縮性。 可擴展的系統是您所無法企及的。 您沒有意識到。 這不是流行語。 這是解決精神問題的一般問題。 * **大型系統設計的標志**:每個系統都是根據其特定要求量身定制的。 一切都取決于構建的細節。 * **YouTube 不是異步的**,所有內容都處于阻塞狀態。 * **相信哲學勝于教義**。 簡單點。 那是什么意思? 當您看到它時,您就會知道。 如果執行代碼檢查會更改數千行代碼和許多文件,則可能是一種更簡單的方法。 您的第一個演示應該很簡單,然后進行迭代。 * **解決一個問題:一個字-簡單**。 尋找最簡單的方法來解決問題空間。 有很多復雜的問題,但是第一個解決方案并不需要復雜。 隨著時間的流逝,復雜性自然會到來。 * **許多 YouTube 系統都是從一個 Python 文件**開始的,并在許多年后變成了大型生態系統。 他們所有的原型都是用 Python 編寫的,并且存活了驚人的時間。 * **在設計審查**中: * 什么是第一個解決方案? * 您打算如何迭代? * 我們對該數據將如何使用了解多少? * **事情隨時間而變化**。 YouTube 如何起步與以后發生的事情無關。 YouTube 最初是一個約會網站。 如果他們為此設計,他們將有不同的對話。 保持靈活性。 * **YouTube CDN** 。 最初是外包出去的。 非常昂貴,所以他們自己做。 如果您有不錯的硬件伙計,則可以構建一個不錯的視頻 CDN。 您建立了一個非常大的機架,將機器插入其中,然后進行 lighttpd 處理,然后覆蓋 404 處理程序以查找未找到的視頻。 這花了兩個星期的時間,而且第一天的服務量為 60 吉比特。 使用非常簡單的工具,您可以做很多事情。 * **您必須測量**。 Vitess 換出了一個協議來進行 HTTP 實現。 即使在 C 語言中,它的速度也很慢。 因此,他們剝離了 HTTP 并使用 python 進行了直接套接字調用,這在全局 CPU 上便宜了 8%。 HTTP 的封裝確實非常昂貴。 ## 可擴展性技術 * 這些不是新主意,但令人驚訝的是,一些核心主意如何在許多不同的方面得到應用。 * **分而治之-可伸縮性技術** * 這是可伸縮性技術。 一切都是關于劃分工作。 確定如何執行它。 從 Web 層開始,適用于許多事物,您擁有許多 Web 服務器,這些 Web 服務器或多或少完全相同且獨立,并且可以水平擴展它們。 那是分而治之。 * 這是數據庫分片的關鍵。 您如何劃分內容,并在細分的部分之間進行交流。 這些是您想盡早解決的事情,因為它們會影響您的成長方式。 * 簡單而松散的連接確實很有價值。 * Python 的動態特性在這里是一個勝利。 不管您的 API 有多糟糕,您都可以存根或修改或修飾自己的方式來解決許多問題。 * **近似正確性-稍作弊** * 另一個喜歡的技術。 系統的狀態就是它所報告的狀態。 如果用戶不能告訴系統的一部分是歪斜和不一致的,那不是。 * 一個真實的例子。 如果您寫評論,但有人同時加載該頁面,則他們可能會在 300-400 毫秒內沒有收到該評論,正在閱讀的用戶將不在乎。 評論的作者會在意,因此您確保撰寫評論的用戶會看到它。 所以你有點作弊。 您的系統不必具有全局一致的交易記錄。 那將是非常昂貴和過度的。 并非每條評論都是金融交易。 所以知道什么時候可以作弊。 * **專家旋鈕切換** * 問,您對一致性模型了解多少? 對于評論的最終一致性是否足夠好? 租電影是不同的。 租房時有錢,所以我們會盡力做到永不丟失。 根據數據需要不同的一致性模型。 * **抖動-向系統中添加熵** * 始終是他們小組中的熱門詞。 如果您的系統沒有抖動,那么您會得到 [雷電群](http://highscalability.com/blog/2008/3/14/problem-mobbing-the-least-used-resource-error.html) 。 分布式應用程序實際上是天氣系統。 調試它們與確定天氣一樣具有確定性。 抖動引入了更多的隨機性,因為令人驚訝的是,事情趨于堆積。 * 例如,緩存過期。 對于流行視頻,他們會盡其所能地緩存內容。 他們可能會緩存 24 小時的最受歡迎的視頻。 如果所有內容一次到期,則每臺計算機將同時計算到期時間。 這產生了一個雷電群。 * 抖動表示您在 18-30 小時之間隨機失效。 這樣可以防止事情堆積。 他們在各處使用它。 當操作排隊并試圖破壞自身時,系統傾向于自我同步。 令人著迷的觀看。 一臺計算機上的磁盤系統運行緩慢,每個人都在等待一個請求,因此所有其他計算機上的所有其他請求突然之間完全同步。 當您有很多機器并且有很多事件時,就會發生這種情況。 每個人實際上都從系統中刪除了熵,因此您必須重新添加一些熵。 * **作弊-知道如何偽造數據** * 很棒的技術。 最快的函數調用是不會發生的。 當您擁有一個單調遞增的計數器(例如電影觀看次數或個人資料觀看次數)時,您可以在每次更新時進行一次交易。 或者,您可以不時進行一次交易,并隨機更新一次,只要交易從奇數變為偶數,人們可能會認為這是真實的。 知道如何偽造數據。 * **可擴展組件-自己創造運氣** * **您可以查看一個 API 并獲得良好的感覺**。 輸入是否定義明確? 你知道你要出去嗎? 其中很多最終都與數據有關。 嚴格說明每個函數將輸出什么數據以及它如何流動,實際上可以幫助您在沒有文檔的情況下理解應用程序。 您可以分辨出在調用函數之前和之后發生的情況。 * **在 Python 中,事情傾向于向 RPC** 發展。 代碼的結構基于程序員的紀律。 因此要建立良好的約定,當所有其他方法都失敗時,就會出現 RPC 隔離墻,以便您了解其中的內容和結果。 * **您的組件將不完美**。 知道,一個組件可能會持續一個月或六個月。 通過畫出這些線條,您正在自己賺一些錢。 當事情發展到南方時,您可以將其換成其他東西。 有時用 python 和 C 重寫某些內容,有時則意味著完全擺脫它。 直到您能夠觀察到,您才知道。 * **團隊中有這么多人,沒人知道整個系統**,因此您需要定義組件。 這是視頻轉碼,與視頻搜索不同。 您需要定義明確的子組件。 好的軟件設計。 這些事情最終導致彼此交談,因此擁有一個良好的數據規范將很有幫助。 他最大的罪過是 Servlet 層和模板層之間的通信,使之成為字典。 好主意。 應該添加一個 WatchPage 并說一個觀看頁面有一個視頻,一些評論和一些相關視頻。 這引起了很多問題,因為字典可以具有數百個屬性。 他們并不總是做出正確的選擇。 * **效率-以可擴展性為代價** * **效率是以可伸縮性** 為代價的。 最有效的方法是用 C 編寫并將其塞入一個進程,但這是不可擴展的。 * **關注宏級別** **,您的組件以及它們如何分解**。 將此做為 RPC 還是以內聯方式有意義? 將其分成一個子包,就可能有一天可能會有所不同。 * **關注算法** 。 在 Python 中,實現良好算法的工作量很低。 例如,有 bisect 模塊,您可以在其中獲取列表,做一些有意義的事情,并將其序列化到磁盤上,然后再次讀回。 對 C 有罰款,但這很容易。 * **測量** 。 在 Python 中,測量就像閱讀茶葉一樣。 Python 中有很多與直覺相反的東西,例如抓斗成本。 他們的大多數應用程序都花時間進行序列化。 對序列化進行概要分析非常取決于您要插入的內容。對 int 進行序列化與對大 blob 進行序列化有很大不同。 * **Python 的效率-知道不該做什么** * **有關了解不要做什么的更多信息** 。 您制作事物的動態程度與運行 Python 應用程序的昂貴程度相關。 * **Dummer 代碼更易于 grep 且易于維護** 。 代碼越神奇,就越難弄清楚其工作原理。 * **他們并沒有做很多 OO** 。 他們使用很多命名空間。 使用類來組織數據,但很少用于 OO。 * **您的代碼樹是什么樣的?** 他希望用以下詞語來形容它:簡單,實用,優雅,正交,可組合。 這是一個理想,現實有點不同。 ## 相關文章 * [使用 Python 調整 YouTube 大小](http://www.slideshare.net/didip/super-sizing-youtube-with-python) * [擴展 Web 的 MySQL 數據庫](http://www.percona.com/live/mysql-conference-2012/sessions/scaling-mysql-databases-web) * [YouTube 架構](http://highscalability.com/youtube-architecture) * [關于 HackerNews](http://news.ycombinator.com/item?id=3757456) 不錯。 可以使用一些校對方法,因為我不得不在某些語言被弄亂的地方放慢腳步,例如“那些東西你想早點弄清楚,因為它們會影響你的成長方式。” 否則,有趣的閱讀使我想給 python 多一點關注。 嗯,但公平地說,YouTube 使用 lighttpd 嗎? 通過螢火蟲:http://i.imgur.com/ClSH4.png “ Apache 是??YouTube 上真正的搖滾明星技術,因為它們使它保持簡單。每個請求都通過 Apache 進行。” “您建立了一個非常大的機架,將機器插入其中,然后進行 lighttpd” 如果 Apache 很棒,為什么他們選擇 lighttpd 代替呢? 這是否還意味著“每個請求都通過 Apache”的語句不正確? 好文章。 還有一些 UX 良好做法。 @ Michal,@ Andy:這些語句是在 CDN 的上下文中的,因此您可以假定它們意味著 CDN 將 lighttpd 用于靜態內容,而將 Apache 用于其余內容。 前 YouTuber 在這里... Apache 是??他們處理動態 Web 請求的方式。 主頁,觀看頁面,用戶頁面等。在早期,視頻流媒體,視頻上傳者和圖像上傳者在 Lighthttpd 上運行,因為它能夠更好地處理非交互式數據流。 當我兩年多前離開時,他們正處于將大多數視頻流切換到基于 Google 的基礎架構的過程中,因為 Google 基礎架構具有對等協議和更高的帶寬成本。 在此過程中,他們似乎決定保留舊的視頻流,并將其用于靜態內容服務(Lighthttpd 做得很好)。 順便提及,隨機更新事物最近已獲得專利。 @michal @andy,聽起來好像 apache 是??他們的 Web 服務器,而 lighttpd 驅動了 CDN,因此在外部您會收到 lighttpd 標頭,但 apache 確實在做這項工作。 作為對 YouTube 的致敬,您可以將其制作成 30 分鐘的視頻嗎? 大聲笑 您可以同時使用 apache 和 lighttpd 來實現目標。 如果這篇文章更詳細地解釋每一個 YouTube 服務的內容,那將是很好的。 看起來.ligspd 至少提供了.css 文件,這是其靜態內容。 “ YouTube 不是異步的,一切都在阻塞。” 為什么? 我以為大家都同意,最好的辦法就是去醫院。 也許它可以防止出現錯誤: “所有形式的異步 I / O 都會打開應用程序,直至出現潛在的資源沖突和相關的故障。需要仔細的編程(通常使用互斥,信號量等)來防止這種情況。” 資料來源:http://en.wikipedia.org/wiki/Asynchronous_I/O 談到簡單而可靠的工具:Youtube 什么時候切換到 PostgreSQL? 感謝您的出色總結! 哇,什么是“夏季代號”?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看