YouTube 是僅次于谷歌的第二大熱門網(wǎng)站。在 2019 年 5 月,每分鐘會有超過 500 小時的視頻內(nèi)容上傳到該平臺。
該視頻共享平臺有超過 20 億的用戶,每天有超過10億小時的視頻被播放,產(chǎn)生數(shù)十億的瀏覽量。這些都是令人難以置信的數(shù)字。
本文會對 YouTube 使用的數(shù)據(jù)庫和后端數(shù)據(jù)基礎(chǔ)設(shè)施進(jìn)行深入講解,它們使得該視頻平臺能夠存儲如此巨量的數(shù)據(jù),并能擴展至數(shù)十億的用戶。
那我們就開始吧。
1.引言
YouTube 的旅程開始于 2005 年。隨著這家由風(fēng)險資本資助的技術(shù)初創(chuàng)公司不斷取得成功,它于 2006 年 11 月被谷歌以 16.5 億美元收購。
在被谷歌收購之前,它們的團隊由以下人員組成:
兩名系統(tǒng)管理員
兩名可擴展性軟件架構(gòu)師
兩名特性開發(fā)人員
兩名網(wǎng)絡(luò)工程師
一名 DBA
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項目地址:https://github.com/YunaiV/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
2.后端基礎(chǔ)設(shè)施
YouTube 的后端微服務(wù)是由Python、數(shù)據(jù)庫、硬件、Java(使用了Guice框架)和 Go 編寫的。用戶界面是使用JavaScript編寫的。
主要的數(shù)據(jù)庫是由 Vitess 支撐的 MySQL,Vitess是一個數(shù)據(jù)庫集群系統(tǒng),用于 MySQL 的水平擴展。另外,使用 Memcache 實現(xiàn)緩存并使用 Zookeeper 進(jìn)行節(jié)點的協(xié)調(diào)。
流行的視頻通過 CDN 來提供,而一般的、較少播放的視頻則從數(shù)據(jù)庫中獲取。
每個視頻在上傳的時候,都會賦予一個唯一的標(biāo)識符并且會由一個批處理 job 進(jìn)行處理,該 job 會運行多個自動化的過程,比如生成縮略圖、元數(shù)據(jù)、視頻腳本、編碼、設(shè)置貨幣化狀態(tài)等。
VP9 & H.264/MPEG-4 AVC 高級視頻編碼(Advanced Video Coding codecs)會用于視頻壓縮,它能夠使用其他編碼器一半的帶寬來編碼 HD 和 4K 質(zhì)量的視頻。
視頻流則是使用基于HTTP協(xié)議的動態(tài)自適應(yīng)流(Dynamic Adaptive Streaming),這是一種自適應(yīng)比特率的流媒體技術(shù),能夠從傳統(tǒng)的 HTTP Web 服務(wù)器上實現(xiàn)高質(zhì)量的視頻流。通過這種技術(shù),內(nèi)容可以按照不同的比特率提供給觀眾。YouTube 客戶端會根據(jù)觀看者的互聯(lián)網(wǎng)連接速度自動適應(yīng)視頻渲染,從而盡可能減少緩沖時間。
我曾經(jīng)在一篇專門的文章中討論過 YouTube 的視頻轉(zhuǎn)碼過程,參見“YouTube是如何以低延遲提供高質(zhì)量視頻的”。
所以,這里對平臺的后端技術(shù)有一個快速的介紹。YouTube 主要使用的數(shù)據(jù)庫是 MySQL。現(xiàn)在,我們了解一下 YouTube 的工程團隊為什么覺得有必要編寫 Vitess?他們在最初的 MySQL 環(huán)境中面臨的問題是什么,使他們在此基礎(chǔ)上實現(xiàn)了一個額外的框架?
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項目地址:https://github.com/YunaiV/yudao-cloud
視頻教程:https://doc.iocoder.cn/video/
3.為何需要 Vitess
網(wǎng)站最初只有一個數(shù)據(jù)庫實例。隨著網(wǎng)站的發(fā)展,為了滿足日益增長的 QPS(每秒查詢次數(shù))需求,開發(fā)人員不得不對數(shù)據(jù)庫進(jìn)行水平擴展。
3.1 主-從副本
副本會添加到主數(shù)據(jù)庫實例中。讀取請求會被路由到主數(shù)據(jù)庫和副本上,以減少主數(shù)據(jù)庫的負(fù)載。添加副本有助于緩解瓶頸,增加讀取的吞吐量,并增加系統(tǒng)的持久性。
主節(jié)點處理寫入的流量,主節(jié)點和副本節(jié)點同時處理讀取流量。
但是,在這種場景中,有可能會從副本中讀取到陳舊的數(shù)據(jù)。如果在主節(jié)點將信息更新到副本之前,一個請求讀取了副本的數(shù)據(jù),那么觀看者就會得到陳舊的數(shù)據(jù)。
此時,主節(jié)點和副本節(jié)點的數(shù)據(jù)是不一致的。在這種情況下,不一致的數(shù)據(jù)是主節(jié)點和副本節(jié)點上特定視頻的觀看次數(shù)。
其實,這完全沒有問題。觀眾不會介意觀看次數(shù)上略微有點不一致,對吧?更重要的是,視頻能夠在他們的瀏覽器中渲染出來。
主節(jié)點和副本節(jié)點之間的數(shù)據(jù)最終會是一致的。
因此,工程師們覺得非常開心,觀眾們也非常開心。隨著副本的引入,事情進(jìn)展順利。
網(wǎng)站繼續(xù)受到歡迎,QPS 繼續(xù)上升。主-從副本策略現(xiàn)在很難跟上網(wǎng)站流量的增長了。
那現(xiàn)在該怎么辦?
3.2 分片
下一個策略就是對數(shù)據(jù)庫進(jìn)行分片(shard)。分片是除了主-從副本、主-主副本、聯(lián)盟和反范式化(de-normalization) 之外,擴展關(guān)系型數(shù)據(jù)庫的方式之一。
數(shù)據(jù)庫分片并不是一個簡單的過程。它大大增加了系統(tǒng)的復(fù)雜性,并使得管理更加困難。
但是,數(shù)據(jù)庫必須要進(jìn)行分片,以滿足 QPS 的增長。在開發(fā)人員將數(shù)據(jù)庫分片后,數(shù)據(jù)會被分散到多臺機器上。這增加了系統(tǒng)寫入的吞吐量。現(xiàn)在,不再是只有一個主實例處理寫入,寫入操作可以在多臺分片的機器上進(jìn)行。
同時,每臺機器都創(chuàng)建了單獨的副本,以實現(xiàn)冗余和吞吐。
該平臺的受歡迎程度持續(xù)上升,大量的數(shù)據(jù)被內(nèi)容創(chuàng)作者不斷添加到數(shù)據(jù)庫中。
為了防止機器故障或者外部未知事件造成的數(shù)據(jù)丟失或服務(wù)不可用,此時需要在系統(tǒng)中添加災(zāi)難管理的功能了。
3.3 災(zāi)難管理
災(zāi)難管理指的是在面臨停電和自然災(zāi)害(如地震、火災(zāi))時的應(yīng)急措施。它需要進(jìn)行冗余,并將用戶數(shù)據(jù)備份到世界不同地理區(qū)域的數(shù)據(jù)中心。丟失用戶數(shù)據(jù)或服務(wù)不可用是不允許的。
在世界范圍內(nèi)擁有多個數(shù)據(jù)中心也有助于 YouTube 減少系統(tǒng)延遲,因為用戶請求會被路由到最近的數(shù)據(jù)中心,而不是路由到位于不同大陸的原始服務(wù)器。
現(xiàn)在,你可以想象基礎(chǔ)設(shè)施會變得多復(fù)雜。
經(jīng)常會有未經(jīng)優(yōu)化的全表掃描導(dǎo)致整個數(shù)據(jù)庫癱瘓。數(shù)據(jù)庫必須進(jìn)行保護(hù),防止受到不良查詢的影響。所有的服務(wù)器都需要被跟蹤以確保服務(wù)的高效性。
開發(fā)人員需要有一個系統(tǒng)來抽象系統(tǒng)的復(fù)雜性,能夠讓他們解決可擴展性的挑戰(zhàn),并以最小的成本管理該系統(tǒng)。這一切促使 YouTube 開發(fā)了 Vitess。
4.Vitess:用于水平擴展 MySQL 數(shù)據(jù)庫集群的系統(tǒng)
Vitess是一個運行于 MySQL 之上的數(shù)據(jù)庫集群系統(tǒng),能夠使 MySQL 進(jìn)行水平擴展。它有內(nèi)置的分片特性,能夠讓開發(fā)人員擴展數(shù)據(jù)庫,而不必在應(yīng)用中添加任何的分片邏輯。這類似于 NoSQL 的做法。
Vitess 架構(gòu),圖片來源
Vitess 還會自動處理故障轉(zhuǎn)移和備份。它能夠管理服務(wù)器,通過智能重寫資源密集型的查詢和實現(xiàn)緩存來提高數(shù)據(jù)庫性能。除了 YouTube,該框架還被業(yè)界的其他知名廠商使用,如 GitHub、Slack、Square、New Relic 等。
當(dāng)你需要 ACID 事務(wù)和強一致性的支持,同時又希望像 NoSQL 數(shù)據(jù)庫一樣快速擴展關(guān)系型數(shù)據(jù)庫時,Vitess 就會大顯身手。
在 YouTube,每個 MySQL 連接都有 2MB 的開銷。每一個連接都有可計算出來的成本,而且隨著連接數(shù)量的增加,還必須增加額外的 RAM。
通過基于 Go 編程語言并發(fā)支持構(gòu)建的連接池,Vitess 能夠以很低的成本管理這些連接。它使用 Zookeeper 來管理集群,并使其保持最新狀態(tài)。
5.部署到云中
Vitess 是云原生的,很適合云中部署,因為就像云的模式一樣,容量是逐步添加到數(shù)據(jù)庫的。它可以作為一個 Kubernetes 感知(Kubernetes-aware)的云原生分布式數(shù)據(jù)庫運行。
在 YouTube,Vitess 在容器化環(huán)境中運行,并使用 Kubernetes 作為容器編排工具。
在如今的計算時代,每個大規(guī)模的服務(wù)都在分布式環(huán)境的云中運行。在云中運行服務(wù)有許多好處。
Google Cloud Platform是一套云計算服務(wù),它的基礎(chǔ)設(shè)施與谷歌內(nèi)部的終端用戶產(chǎn)品(如谷歌搜索和 YouTube)所用的基礎(chǔ)設(shè)施是相同的。
每個大規(guī)模的在線服務(wù)都有一個多樣化(polyglot)的持久性架構(gòu),因為某一種數(shù)據(jù)模型,無論是關(guān)系型還是 NoSQL,都無法處理服務(wù)的所有使用場景。
在為本文展開的研究中,我無法找到 YouTube 所使用的具體谷歌云數(shù)據(jù)庫的清單,但我非常肯定它會使用 GCP 的特有產(chǎn)品,如 Google Cloud Spanner、Cloud SQL、Cloud Datastore、Memorystore 等來運行服務(wù)的不同特性。
這篇文章詳細(xì)介紹了其他谷歌服務(wù)所使用的數(shù)據(jù)庫,如Google Adwords、Google Finance、Google Trends等。
6.CDN
YouTube 使用谷歌的全球網(wǎng)絡(luò)進(jìn)行低延遲、低成本的內(nèi)容傳輸。借助全球分布的 POP 邊緣點,它能夠使客戶能夠更快地獲取數(shù)據(jù),而不必從原始服務(wù)器獲取。
所以,到此為止,我已經(jīng)談到了 YouTube 使用的數(shù)據(jù)庫、框架和技術(shù)。現(xiàn)在,該談一談存儲問題了。
YouTube 是如何存儲如此巨大的數(shù)據(jù)量的呢(每分鐘上傳 500 小時的視頻內(nèi)容)?
7.數(shù)據(jù)存儲:YouTube 是如何存儲如此巨大的數(shù)據(jù)量的呢?
視頻會存儲在谷歌數(shù)據(jù)中心的硬盤中。這些數(shù)據(jù)由 Google File System 和 BigTable 管理。
GFS Google File System是谷歌開發(fā)的一個分布式文件系統(tǒng),用于管理分布式環(huán)境中的大規(guī)模數(shù)據(jù)。
BigTable是一個建立在 Google File System 上的低延遲分布式數(shù)據(jù)存儲系統(tǒng),用于處理分布在成千上萬臺機器上的 PB 級別的數(shù)據(jù)。60 多個谷歌產(chǎn)品都使用了它。
因此,視頻被存儲在硬盤中。關(guān)系、元數(shù)據(jù)、用戶偏好、個人資料信息、賬戶設(shè)置、從存儲中獲取視頻所需的相關(guān)數(shù)據(jù)等都存儲在 MySQL 中。
7.1 即插即用的商用服務(wù)器
谷歌數(shù)據(jù)中心擁有同質(zhì)化的硬件,軟件則是內(nèi)部構(gòu)建的,管理成千上萬的獨立服務(wù)器集群。
谷歌部署的服務(wù)器,能夠增強數(shù)據(jù)中心的存儲能力,它們都是商用服務(wù)器(commodity server),也被稱為商用現(xiàn)成的服務(wù)器(commercial off-the-shelf server)。這些服務(wù)器價格低廉,可廣泛使用和大量購買,并能以最小的成本和代價替換或配置數(shù)據(jù)中心的相同硬件。
隨著對額外存儲需求的增加,新的商用服務(wù)器會被插入到系統(tǒng)中。
出現(xiàn)問題后,商用服務(wù)器通常會被直接替換,而不是進(jìn)行修理。它們不是定制的,與運行定制的服務(wù)器相比,使用它們能夠使企業(yè)在很大程度上減少基礎(chǔ)設(shè)施成本。
7.2 為數(shù)據(jù)中心設(shè)計的存儲磁盤
YouTube 每天都需要超過一個 PB 的新存儲。旋轉(zhuǎn)硬盤驅(qū)動器是主要的存儲介質(zhì),因為其成本低,可靠性高。
SSD 固態(tài)硬盤比旋轉(zhuǎn)磁盤具有更高的性能,因為它們是基于半導(dǎo)體的,但大規(guī)模使用固態(tài)硬盤并不劃算。
它們相當(dāng)昂貴,也容易隨著時間的推移逐漸丟失數(shù)據(jù)。這使得它們不適合用于歸檔數(shù)據(jù)的存儲。
另外,谷歌正在開發(fā)一個適用于大規(guī)模數(shù)據(jù)中心的新磁盤系列。
有五個關(guān)鍵指標(biāo)可用來判斷為數(shù)據(jù)存儲而構(gòu)建的硬件的質(zhì)量:
硬件應(yīng)該有能力支持秒級的高速度輸入輸出操作。
它應(yīng)該符合組織規(guī)定的安全標(biāo)準(zhǔn)。
與普通存儲硬件相比,它應(yīng)該有更高的存儲容量。
硬件采購成本、電力成本和維護(hù)費用應(yīng)該都是可以接受的。
磁盤應(yīng)該是可靠的,并且延遲是穩(wěn)定的。
審核編輯 :李倩
-
數(shù)據(jù)存儲
+關(guān)注
關(guān)注
5文章
970瀏覽量
50904 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3798瀏覽量
64370 -
Youtube
+關(guān)注
關(guān)注
0文章
143瀏覽量
15546
原文標(biāo)題:YouTube 數(shù)據(jù)庫如何保存巨量視頻文件?
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論