YouTube 數據庫如何保存巨量視頻文件?

作者 | Shivang Sarawagi

譯者 | 張衛濱

策劃 | 辛曉亮  

YouTube 是僅次於谷歌的第二大熱門網站。在 2019 年 5 月,每分鐘會有超過 500 小時的視頻內容上傳到該平臺。

該視頻共享平臺有超過 20 億的用戶,每天有超過 10 億小時的視頻被播放,產生數十億的瀏覽量。這些都是令人難以置信的數字。

本文會對 YouTube 使用的數據庫和後端數據基礎設施進行深入講解,它們使得該視頻平臺能夠存儲如此巨量的數據,並能擴展至數十億的用戶。

那我們就開始吧。

  1. 引言

YouTube 的旅程開始於 2005 年。隨着這家由風險資本資助的技術初創公司不斷取得成功,它於 2006 年 11 月被谷歌以 16.5 億美元收購。

在被谷歌收購之前,它們的團隊由以下人員組成:

  1. 後端基礎設施

YouTube 的後端微服務是由 Python、C、C++、Java(使用了 Guice 框架)和 Go 編寫的。用戶界面是使用 JavaScript 編寫的。

主要的數據庫是由 Vitess 支撐的 MySQL,Vitess 是一個數據庫集羣系統,用於 MySQL 的水平擴展。另外,使用 Memcache 實現緩存並使用 Zookeeper 進行節點的協調。

流行的視頻通過 CDN 來提供,而一般的、較少播放的視頻則從數據庫中獲取。

每個視頻在上傳的時候,都會賦予一個唯一的標識符並且會由一個批處理 job 進行處理,該 job 會運行多個自動化的過程,比如生成縮略圖、元數據、視頻腳本、編碼、設置貨幣化狀態等。

VP9 & H.264/MPEG-4 AVC 高級視頻編碼(Advanced Video Coding codecs)會用於視頻壓縮,它能夠使用其他編碼器一半的帶寬來編碼 HD 和 4K 質量的視頻。

視頻流則是使用基於 HTTP 協議的動態自適應流(Dynamic Adaptive Streaming),這是一種自適應比特率的流媒體技術,能夠從傳統的 HTTP Web 服務器上實現高質量的視頻流。通過這種技術,內容可以按照不同的比特率提供給觀衆。YouTube 客戶端會根據觀看者的互聯網連接速度自動適應視頻渲染,從而儘可能減少緩衝時間。

我曾經在一篇專門的文章中討論過 YouTube 的視頻轉碼過程,參見 “YouTube 是如何以低延遲提供高質量視頻的”

所以,這裏對平臺的後端技術有一個快速的介紹。YouTube 主要使用的數據庫是 MySQL。現在,我們瞭解一下 YouTube 的工程團隊爲什麼覺得有必要編寫 Vitess?他們在最初的 MySQL 環境中面臨的問題是什麼,使他們在此基礎上實現了一個額外的框架?

  1. 爲何需要 Vitess

網站最初只有一個數據庫實例。隨着網站的發展,爲了滿足日益增長的 QPS(每秒查詢次數)需求,開發人員不得不對數據庫進行水平擴展。

3.1 主 - 從副本

副本會添加到主數據庫實例中。讀取請求會被路由到主數據庫和副本上,以減少主數據庫的負載。添加副本有助於緩解瓶頸,增加讀取的吞吐量,並增加系統的持久性。

主節點處理寫入的流量,主節點和副本節點同時處理讀取流量。

但是,在這種場景中,有可能會從副本中讀取到陳舊的數據。如果在主節點將信息更新到副本之前,一個請求讀取了副本的數據,那麼觀看者就會得到陳舊的數據。

此時,主節點和副本節點的數據是不一致的。在這種情況下,不一致的數據是主節點和副本節點上特定視頻的觀看次數。

其實,這完全沒有問題。觀衆不會介意觀看次數上略微有點不一致,對吧?更重要的是,視頻能夠在他們的瀏覽器中渲染出來。

主節點和副本節點之間的數據最終會是一致的。

因此,工程師們覺得非常開心,觀衆們也非常開心。隨着副本的引入,事情進展順利。

網站繼續受到歡迎,QPS 繼續上升。主 - 從副本策略現在很難跟上網站流量的增長了。

那現在該怎麼辦?

3.2 分片

下一個策略就是對數據庫進行分片(shard)。分片是除了主 - 從副本、主 - 主副本、聯盟和反範式化(de-normalization) 之外,擴展關係型數據庫的方式之一。

數據庫分片並不是一個簡單的過程。它大大增加了系統的複雜性,並使得管理更加困難。

但是,數據庫必須要進行分片,以滿足 QPS 的增長。在開發人員將數據庫分片後,數據會被分散到多臺機器上。這增加了系統寫入的吞吐量。現在,不再是隻有一個主實例處理寫入,寫入操作可以在多臺分片的機器上進行。

同時,每臺機器都創建了單獨的副本,以實現冗餘和吞吐。

該平臺的受歡迎程度持續上升,大量的數據被內容創作者不斷添加到數據庫中。

爲了防止機器故障或者外部未知事件造成的數據丟失或服務不可用,此時需要在系統中添加災難管理的功能了。

3.3 災難管理

災難管理指的是在面臨停電和自然災害(如地震、火災)時的應急措施。它需要進行冗餘,並將用戶數據備份到世界不同地理區域的數據中心。丟失用戶數據或服務不可用是不允許的。

在世界範圍內擁有多個數據中心也有助於 YouTube 減少系統延遲,因爲用戶請求會被路由到最近的數據中心,而不是路由到位於不同大陸的原始服務器。

現在,你可以想象基礎設施會變得多複雜。

經常會有未經優化的全表掃描導致整個數據庫癱瘓。數據庫必須進行保護,防止受到不良查詢的影響。所有的服務器都需要被跟蹤以確保服務的高效性。

開發人員需要有一個系統來抽象系統的複雜性,能夠讓他們解決可擴展性的挑戰,並以最小的成本管理該系統。這一切促使 YouTube 開發了 Vitess。

4.Vitess:用於水平擴展 

MySQL 數據庫集羣的系統

Vitess 是一個運行於 MySQL 之上的數據庫集羣系統,能夠使 MySQL 進行水平擴展。它有內置的分片特性,能夠讓開發人員擴展數據庫,而不必在應用中添加任何的分片邏輯。這類似於 NoSQL 的做法。

Vitess 架構,圖片來源

Vitess 還會自動處理故障轉移和備份。它能夠管理服務器,通過智能重寫資源密集型的查詢和實現緩存來提高數據庫性能。除了 YouTube,該框架還被業界的其他知名廠商使用,如 GitHub、Slack、Square、New Relic 等。

當你需要 ACID 事務和強一致性的支持,同時又希望像 NoSQL 數據庫一樣快速擴展關係型數據庫時,Vitess 就會大顯身手。

在 YouTube,每個 MySQL 連接都有 2MB 的開銷。每一個連接都有可計算出來的成本,而且隨着連接數量的增加,還必須增加額外的 RAM。

通過基於 Go 編程語言併發支持構建的連接池,Vitess 能夠以很低的成本管理這些連接。它使用 Zookeeper 來管理集羣,並使其保持最新狀態。

  1. 部署到雲中

Vitess 是雲原生的,很適合雲中部署,因爲就像雲的模式一樣,容量是逐步添加到數據庫的。它可以作爲一個 Kubernetes 感知(Kubernetes-aware)的雲原生分佈式數據庫運行。

在 YouTube,Vitess 在容器化環境中運行,並使用 Kubernetes 作爲容器編排工具。

在如今的計算時代,每個大規模的服務都在分佈式環境的雲中運行。在雲中運行服務有許多好處。

Google Cloud Platform 是一套雲計算服務,它的基礎設施與谷歌內部的終端用戶產品(如谷歌搜索和 YouTube)所用的基礎設施是相同的。

每個大規模的在線服務都有一個多樣化(polyglot)的持久性架構,因爲某一種數據模型,無論是關係型還是 NoSQL,都無法處理服務的所有使用場景。

在爲本文展開的研究中,我無法找到 YouTube 所使用的具體谷歌雲數據庫的清單,但我非常肯定它會使用 GCP 的特有產品,如 Google Cloud Spanner、Cloud SQL、Cloud Datastore、Memorystore 等來運行服務的不同特性。

這篇文章詳細介紹了其他谷歌服務所使用的數據庫,如 Google Adwords、Google Finance、Google Trends 等。

6.CDN

YouTube 使用谷歌的全球網絡進行低延遲、低成本的內容傳輸。藉助全球分佈的 POP 邊緣點,它能夠使客戶能夠更快地獲取數據,而不必從原始服務器獲取。

所以,到此爲止,我已經談到了 YouTube 使用的數據庫、框架和技術。現在,該談一談存儲問題了。

YouTube 是如何存儲如此巨大的數據量的呢(每分鐘上傳 500 小時的視頻內容)?

  1. 數據存儲:YouTube 是

如何存儲如此巨大的數據量的呢?

視頻會存儲在谷歌數據中心的硬盤中。這些數據由 Google File System 和 BigTable 管理。

GFS Google File System 是谷歌開發的一個分佈式文件系統,用於管理分佈式環境中的大規模數據。

BigTable 是一個建立在 Google File System 上的低延遲分佈式數據存儲系統,用於處理分佈在成千上萬臺機器上的 PB 級別的數據。60 多個谷歌產品都使用了它。

因此,視頻被存儲在硬盤中。關係、元數據、用戶偏好、個人資料信息、賬戶設置、從存儲中獲取視頻所需的相關數據等都存儲在 MySQL 中。

7.1 即插即用的商用服務器

谷歌數據中心擁有同質化的硬件,軟件則是內部構建的,管理成千上萬的獨立服務器集羣。

谷歌部署的服務器,能夠增強數據中心的存儲能力,它們都是商用服務器(commodity server),也被稱爲商用現成的服務器(commercial off-the-shelf server)。這些服務器價格低廉,可廣泛使用和大量購買,並能以最小的成本和代價替換或配置數據中心的相同硬件。

隨着對額外存儲需求的增加,新的商用服務器會被插入到系統中。

出現問題後,商用服務器通常會被直接替換,而不是進行修理。它們不是定製的,與運行定製的服務器相比,使用它們能夠使企業在很大程度上減少基礎設施成本。

7.2 爲數據中心設計的存儲磁盤

YouTube 每天都需要超過一個 PB 的新存儲。旋轉硬盤驅動器是主要的存儲介質,因爲其成本低,可靠性高。

SSD 固態硬盤比旋轉磁盤具有更高的性能,因爲它們是基於半導體的,但大規模使用固態硬盤並不划算。它們相當昂貴,也容易隨着時間的推移逐漸丟失數據。這使得它們不適合用於歸檔數據的存儲。

另外,谷歌正在開發一個適用於大規模數據中心的新磁盤系列。

有五個關鍵指標可用來判斷爲數據存儲而構建的硬件的質量:

  1. 硬件應該有能力支持秒級的高速度輸入輸出操作。

  2. 它應該符合組織規定的安全標準。

  3. 與普通存儲硬件相比,它應該有更高的存儲容量。

  4. 硬件採購成本、電力成本和維護費用應該都是可以接受的。

  5. 磁盤應該是可靠的,並且延遲是穩定的

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/rEYIyCNyFogLH1btHeLDPw