大家好,我是不才陳某~
YouTube 是僅次於Google的第二大熱門網站。在 2019 年 5 月,每分鐘會有超過 500 小時的影片內容上傳到該平台。
這個影片分享平台有超過 20 億的用戶,每天有超過10億小時的影片被播放,產生數十億的瀏覽量。這些都是令人難以置信的數字。
本文將對 YouTube 使用的資料庫和後端資料基礎設施進行深入講解,它們使得該影片平台能夠儲存如此巨量的數據,並能擴展至數十億的用戶。
那我們就開始吧。
1.引言
YouTube 的旅程開始於 2005 年。隨著這家由風險資本資助的技術新創公司不斷取得成功,它於 2006 年 11 月被谷歌以 16.5 億美元收購。
在被Google收購之前,它們的團隊由以下人員組成:
- 兩名系統管理員
- 兩名可擴展性軟體架構師
- 兩名特性開發人員
- 兩名網路工程師
- 一名DBA
#2.後端基礎設施
YouTube的後端微服務是由Python、資料庫、硬體、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 環境中面臨的問題是什麼,使他們在此基礎上實現了一個額外的框架?
3.為何需要 Vitess
網站最初只有一個資料庫實例。隨著網站的發展,為了滿足日益增長的 QPS(每秒查詢次數)需求,開發人員不得不對資料庫進行水平擴展。
3.1 主-從副本
副本會加入到主資料庫實例。讀取請求會被路由到主資料庫和副本上,以減少主資料庫的負載。新增副本有助於緩解瓶頸,增加讀取的吞吐量,並增加系統的持久性。
主節點處理寫入的流量,主節點和副本節點同時處理讀取流量。
但是,在這種場景中,有可能會從副本中讀取到陳舊的資料。如果在主節點將資訊更新到副本之前,一個請求讀取了副本的數據,那麼觀看者就會得到陳舊的數據。
此時,主節點和副本節點的資料是不一致的。在這種情況下,不一致的資料是主節點和副本節點上特定影片的觀看次數。
其實,這完全沒有問題。觀眾不會介意觀看次數上略微有點不一致,對吧?更重要的是,影片能夠在他們的瀏覽器中渲染出來。
主節點和副本節點之間的資料最終會是一致的。
因此,工程師們覺得非常開心,觀眾們也非常開心。隨著副本的引入,事情進展順利。
網站繼續受到歡迎,QPS 繼續上升。主-從副本策略現在很難跟上網站流量的增長了。
那現在該怎麼辦?
3.2 分片
下一個策略就是對資料庫進行分片(shard)。分片是除了主-從副本、主-主副本、聯盟和反範式化(de-normalization) 之外,擴展關係型資料庫的方式之一。
資料庫分片並不是一個簡單的過程。它大大增加了系統的複雜性,並使得管理更加困難。
但是,資料庫必須要進行分片,以滿足 QPS 的成長。在開發人員將資料庫分片後,資料會被分散到多台機器上。這增加了系統寫入的吞吐量。現在,不再是只有一個主實例處理寫入,寫入操作可以在多台分片的機器上進行。
同時,每台機器都創建了單獨的副本,以實現冗餘和吞吐。
該平台的受歡迎程度持續上升,大量的數據被內容創作者不斷添加到資料庫中。
為了防止機器故障或外部未知事件造成的資料遺失或服務不可用,此時需要在系統中新增災難管理的功能了。
3.3 災難管理
災難管理指的是面臨停電和自然災害(如地震、火災)時的緊急措施。它需要進行冗餘,並將用戶資料備份到世界不同地理區域的資料中心。遺失使用者資料或服務不可用是不允許的。
在世界範圍內擁有多個資料中心也有助於 YouTube 減少系統延遲,因為使用者請求會被路由到最近的資料中心,而不是路由到位於不同大陸的原始伺服器。
現在,你可以想像基礎架構會變得多複雜。
經常會有未經最佳化的全表掃描導致整個資料庫癱瘓。資料庫必須進行保護,防止受到不良查詢的影響。所有的伺服器都需要被追蹤以確保服務的高效性。
開發人員需要有一個系統來抽象系統的複雜性,能夠讓他們解決可擴展性的挑戰,並以最小的成本管理該系統。這一切促使 YouTube 開發了 Vitess。
4.Vitess:用於水平擴展 MySQL 資料庫叢集的系統
Vitess是一個運行於 MySQL 之上的資料庫叢集系統,能夠使 MySQL 進行水平擴展。它有內建的分片特性,能夠讓開發人員擴展資料庫,而不必在應用中添加任何的分片邏輯。這類似於 NoSQL 的做法。
Vitess 也會自動處理故障轉移和備份。它能夠管理伺服器,透過智慧重寫資源密集的查詢和實現快取來提高資料庫效能。除了 YouTube,該框架也被其他業界的知名廠商使用,如 GitHub、Slack、Square、New Relic 等。
當你需要 ACID 事務和強一致性的支持,同時又希望像 NoSQL 資料庫一樣快速擴展關係型資料庫時,Vitess 就會大顯身手。
在 YouTube,每個 MySQL 連線都有 2MB 的開銷。每一個連線都有可計算出來的成本,而且隨著連線數量的增加,還必須增加額外的 RAM。
透過基於 Go 程式語言並發支援建置的連接池,Vitess 能夠以很低的成本管理這些連接。它使用 Zookeeper 來管理叢集,並使其保持最新狀態。
5.部署到雲端
Vitess 是雲端原生的,很適合雲端中部署,因為就像雲端的模式一樣,容量是逐步新增到資料庫的。它可以作為一個 Kubernetes 感知(Kubernetes-aware)的雲端原生分散式資料庫運作。
在 YouTube,Vitess 在容器化環境中運行,並使用 Kubernetes 作為容器編排工具。
在現今的運算時代,每個大規模的服務都在分散式環境的雲端中運作。在雲端運行服務有許多好處。
Google Cloud Platform是一套雲端運算服務,它的基礎設施與Google內部的終端用戶產品(如Google搜尋和 YouTube)所使用的基礎設施是相同的。
每個大規模的線上服務都有一個多樣化(polyglot)的持久性架構,因為某一種資料模型,無論是關係型或 NoSQL,都無法處理服務的所有使用情境。
在為本文展開的研究中,我無法找到YouTube 所使用的具體谷歌雲端資料庫的清單,但我非常肯定它會使用GCP 的特有產品,如穀歌 Cloud Spanner、Cloud SQL、Cloud Datastore 、Memorystore 等來運作服務的不同特性。
這篇文章詳細介紹了其他Google服務所使用的資料庫,如Google Adwords、Google Finance、Google Trends等。
6.CDN
YouTube 使用Google的全球網路進行低延遲、低成本的內容傳輸。借助全球分佈的 POP 邊緣點,它能夠使客戶能夠更快地獲取數據,而不必從原始伺服器獲取。
所以,到此為止,我已經談到了 YouTube 使用的資料庫、框架和技術。現在,該談一談儲存問題了。
YouTube 是如何儲存如此龐大的資料量的呢(每分鐘上傳 500 小時的影片內容)?
7.資料儲存:YouTube 是如何儲存如此龐大的資料量的呢?
影片會儲存在Google資料中心的硬碟中。這些資料由 Google File System 和 BigTable 管理。
GFS Google File System是Google開發的分散式檔案系統,用於管理分散式環境中的大規模資料。
BigTable是一個建立在 Google File System 上的低延遲分散式資料儲存系統,用於處理分佈在成千上萬台機器上的 PB 層級的資料。 60 多個谷歌產品都使用了它。
因此,影片被儲存在硬碟中。關係、元資料、使用者偏好、個人資料資訊、帳戶設定、從儲存中取得影片所需的相關資料等都儲存在 MySQL 中。
7.1 即插即用的商用伺服器
Google資料中心擁有同質化的硬件,軟體則是內部構建的,管理成千上萬的獨立伺服器叢集。
Google部署的伺服器,能夠增強資料中心的儲存能力,它們都是商用伺服器(commodity server),也被稱為商用現成的伺服器(commercial off-the-shelf server)。這些伺服器價格低廉,可廣泛使用和大量購買,並能以最小的成本和代價替換或配置資料中心的相同硬體。
隨著對額外儲存需求的增加,新的商用伺服器會被插入到系統中。
出現問題後,商用伺服器通常會直接被替換,而不是進行修理。它們不是客製化的,與運行客製化的伺服器相比,使用它們能夠使企業在很大程度上減少基礎設施成本。
7.2 為資料中心設計的儲存磁碟
YouTube 每天需要超過一個 PB 的新儲存空間。旋轉硬碟驅動器是主要的儲存介質,因為其成本低,可靠性高。
SSD 固態硬碟比旋轉磁碟具有更高的效能,因為它們是基於半導體的,但大規模使用固態硬碟並不划算。
它們相當昂貴,也容易隨著時間的推移逐漸失去資料。這使得它們不適合用於歸檔資料的儲存。
另外,Google正在開發一個適用於大規模資料中心的新磁碟系列。
有五個關鍵指標可用來判斷為資料儲存而建構的硬體的品質:
- 硬體應該有能力支援秒級的高速度輸入輸出操作。
- 它應該符合組織規定的安全標準。
- 與普通儲存硬體相比,它應該有更高的儲存容量。
- 硬體採購成本、電力成本和維護費用應該都是可以接受的。
- 磁碟應該是可靠的,並且延遲是穩定的。
以上是YouTube 是如何保存巨量影片檔案的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本站3月7日消息,华为数据存储产品线总裁周跃峰博士日前出席MWC2024大会,专门展示了为温数据(WarmData)和冷数据(ColdData)设计的新一代OceanStorArctic磁电存储解决方案。华为数据存储产品线总裁周跃峰发布系列创新解决方案图源:华为本站附上华为官方新闻稿内容如下:该方案的成本比磁带低20%,功耗比硬盘低90%。根据国外科技媒体blocksandfiles报道,华为发言人还透露了关于该磁电存储解决方案的信息:华为的磁电磁盘(MED)是对磁存储介质的重大创新。第一代ME

Vue3+TS+Vite开发技巧:如何进行数据加密和存储随着互联网技术的快速发展,数据的安全性和隐私保护变得越来越重要。在Vue3+TS+Vite开发环境下,如何进行数据加密和存储,是每个开发人员都需要面对的问题。本文将介绍一些常用的数据加密和存储的技巧,帮助开发人员提升应用的安全性和用户体验。一、数据加密前端数据加密前端加密是保护数据安全性的重要一环。常用

什么是缓存?缓存(发音为ka·shay)是一种专门的高速硬件或软件组件,用于存储经常请求的数据和指令,这些数据和指令又可用于更快地加载网站、应用程序、服务和系统的其他部分。缓存使最常访问的数据随时可用。缓存文件与缓存内存不同。缓存文件是指经常需要的文件,如PNG、图标、徽标、着色器等,多个程序可能需要这些文件。这些文件存储在您的物理驱动器空间中,通常是隐藏的。另一方面,高速缓存内存是一种比主内存和/或RAM更快的内存类型。它极大地减少了数据访问时间,因为与RAM相比,它更靠近CPU并且速度

如何正确使用sessionStorage存储敏感信息,需要具体代码示例无论是在Web开发还是移动应用开发中,我们常常需要存储和处理敏感信息,如用户登录凭证、身份证号码等。在前端开发中,使用sessionStorage是一种常见的存储方案。然而,由于sessionStorage是基于浏览器的存储,需要注意一些安全性的问题,以确保存储的敏感信息不被恶意访问和利用

Java集合框架概述Java集合框架是Java编程语言的重要组成部分,它提供了一系列可以存储和管理数据的容器类库。这些容器类库具有不同的数据结构,可以满足不同场景下的数据存储和处理需求。集合框架的优势在于它提供了统一的接口,使得开发人员可以使用相同的方式来操作不同的容器类库,从而降低了开发难度。Java集合框架的数据结构Java集合框架中包含多种数据结构,每种数据结构都有其独特的特性和适用场景。下面是几种常见的Java集合框架数据结构:1.List:List是一个有序的集合,它允许元素重复。Li

PHP和swoole如何实现高效的数据缓存和存储?概述:在Web应用开发中,数据的缓存和存储是非常重要的一部分。而PHP和swoole提供了一种高效的方法来实现数据的缓存与存储。本文将介绍如何使用PHP和swoole来实现高效的数据缓存和存储,并给出相应的代码示例。一、swoole简介:swoole是一个针对PHP语言开发的,高性能的异步网络通信引擎,它可以

使用PHP数组实现数据缓存和存储的方法和技巧随着互联网的发展和数据量的急剧增长,数据缓存和存储成为了我们在开发过程中必须要考虑的问题之一。PHP作为一门广泛应用的编程语言,也提供了丰富的方法和技巧来实现数据缓存和存储。其中,使用PHP数组进行数据缓存和存储是一种简单而高效的方法。一、数据缓存数据缓存的目的是为了减少对数据库或其他外部数据源的访问次数,从而提高

本文转载自微信公众号「活在信息时代」,作者活在信息时代。转载本文请联系活在信息时代公众号。对于熟悉数据库操作的同学来说,编写优美的SQL语句,从数据库中想方设法找出自己需要的数据,是常规操作了。而对于熟悉机器学习的同学来说,获取数据,对数据进行预处理,建立模型,确定训练集和测试集,用训练好的模型对未来进行一系列的预测,也是一种常规操作了。那么,我们能否将两种技术结合起来呢?我们看到数据库里存储了数据,而进行预测需要基于以往的数据。如果我们通过数据库里现有的数据,对于未来的数据进行查询的话,那么是


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境