当前位置: 首页 > 科技观察

YouTube如何存储庞大的视频文件?

时间:2023-03-14 12:41:30 科技观察

大家好,我是陈博才~YouTube是仅次于Google的第二大热门网站。2019年5月,每分钟有超过500小时的视频内容上传至平台。视频分享平台拥有超过20亿用户,每天播放视频超过10亿小时,产生数十亿次观看。这些都是令人难以置信的数字。本文深入介绍了YouTube使用的数据库和后端数据基础架构,这些基础架构允许视频平台存储如此大量的数据并扩展到数十亿用户。让我们开始吧。1.简介YouTube的旅程始于2005年。随着这家由风险资本资助的技术初创公司不断取得成功,它于2006年11月被谷歌以16.5亿美元收购。在被谷歌收购之前,他们的团队由以下人员组成:2名系统管理员2名可扩展性软件架构师2名功能开发人员2名网络工程师1名DBA2.后端基础设施\YouTube的后端微服务是用Python编写的,数据库、硬件、Java(使用Guice框架)和Go。用户界面是使用JavaScript编写的。主数据库为Vitess支持的MySQL,是MySQL水平扩展的数据库集群系统。此外,Memcache用于实现缓存,Zookeeper用于节点协调。热门视频通过CDN提供,而普通的、播放次数较少的视频则从数据库中获取。每个视频在上传时都有一个唯一的标识符,并由运行多个自动化过程的批处理作业处理,例如生成缩略图、元数据、视频脚本、编码、设置货币状态等。VP9&H.264/MPEG-4AVCAdvancedVideoCoding编解码器(AdvancedVideoCodingcodecs)用于视频压缩,可以使用其他编码器一半的带宽对高清和4K质量的视频进行编码。视频流采用基于HTTP协议的DynamicAdaptiveStreaming,这是一种自适应比特率的流媒体技术,可以从传统的HTTP网络服务器上获得高质量的视频流。使用这种技术,可以以不同的比特率向观众提供内容。YouTube客户端会根据观众的互联网连接速度自动调整视频渲染,最大限度地减少缓冲时间。我在一篇专门的文章中讨论了YouTube的视频转码过程,请参阅“YouTube如何以低延迟交付高质量视频”。因此,这里是对平台后端技术的快速介绍。YouTube使用的主要数据库是MySQL。现在,让我们看看为什么YouTube的工程团队觉得有必要编写Vitess?他们在原始MySQL环境中面临的问题是什么,导致他们在其之上实施了一个额外的框架?3.为什么需要Vitess网站最初只有一个数据库实例。随着网站的发展,为了满足越来越高的QPS(querypersecond)要求,开发者不得不对数据库进行横向扩展。3.1主从副本副本被添加到主数据库实例。读取请求被路由到主节点和副本以减少主节点上的负载。添加副本有助于缓解瓶颈、提高读取吞吐量并提高系统的耐用性。主节点处理写入流量,主节点和副本节点同时处理读取流量。但是,在这种情况下,可以从副本读取陈旧数据。如果请求在主节点将信息更新到副本之前读取副本的数据,则观察者将获得陈旧数据。此时主节点和副本节点的数据不一致。在这种情况下,不一致的数据是特定视频在主节点和副本节点上的观看次数。其实一点问题都没有。观众不介意观看次数有点不一致,对吗?更重要的是,视频可以在他们的浏览器中呈现。主节点和副本节点之间的数据最终会保持一致。所以工程师很开心,观众也很开心。随着地牢的引入,事情进展顺利。网站人气持续提升,QPS持续攀升。主从策略现在很难跟上网站流量的增长。那我们现在该怎么办呢?3.2分片下一个策略是对数据库进行分片。分片是除了主从副本、主从副本、联邦和反规范化之外的扩展关系数据库的方法之一。数据库分片不是一个简单的过程。大大增加了系统的复杂度,增加了管理难度。但是,必须对数据库进行分片以适应QPS增长。开发人员对数据库进行分片后,数据分布在多台机器上。这增加了系统写入的吞吐量。现在,写操作可以跨多个分片机器进行,而不是只有一个主实例处理写入。同时,在每台机器上创建单独的副本以实现冗余和吞吐量。该平台的受欢迎程度持续上升,内容创作者不断将大量数据添加到数据库中。为了防止由于机器故障或外部未知事件导致的数据丢失或服务不可用,需要在系统中加入灾难管理功能。3.3灾害管理灾害管理是指面对停电和自然灾害(如地震、火灾)时采取的应急措施。它需要冗余,将用户数据备份到世界不同地理区域的数据中心。不允许丢失用户数据或服务不可用。在世界各地拥有多个数据中心也有助于YouTube减少系统延迟,因为用户请求被路由到最近的数据中心,而不是位于不同大陆的原始服务器。现在,您可以想象基础设施会变得多么复杂。经常有未优化的全表扫描导致整个数据库瘫痪。必须保护数据库免受不需要的查询。需要跟踪所有服务器以确保高效的服务。开发人员需要有一个系统来抽象系统的复杂性,使他们能够解决可扩展性挑战,并以最小的成本管理系统。所有这些导致YouTube开发了Vitess。4.Vitess:MySQL数据库集群水平扩展系统Vitess是一个运行在MySQL上的数据库集群系统,使MySQL能够水平扩展。它具有内置的分片功能,允许开发人员在不向应用程序添加任何分片逻辑的情况下扩展数据库。这与NoSQL所做的类似。Vitess还自动处理故障转移和备份。它通过智能重写资源密集型查询和实施缓存来管理服务器以提高数据库性能。除了YouTube,该框架也被GitHub、Slack、Square、NewRelic等业内其他大牌使用。当你需要支持ACID事务和强一致性,同时又想扩展关系数据库时很快作为NoSQL数据库,Vitess便大显身手。在YouTube,每个MySQL连接都有2MB的开销。每个连接都有可计算的成本,并且随着连接数量的增加,必须添加额外的RAM。通过建立在Go编程语言的并发支持之上的连接池,Vitess能够以非常低的成本管理这些连接。它使用Zookeeper来管理集群并使其保持最新状态。5.部署到云端Vitess是云原生的,非常适合云部署,因为就像云模型一样,容量是逐渐添加到数据库中的。它可以作为Kubernetes感知的云原生分布式数据库运行。在YouTube,Vitess运行在容器化环境中,并使用Kubernetes作为容器编排工具。在当今的计算时代,每一个大规模的服务都运行在云端的分布式环境中。在云中运行服务有很多好处。GoogleCloudPlatform是一组云计算服务,其基础架构与Google内部最终用户产品(例如Google搜索和YouTube)所使用的基础架构相同。每个大型在线服务都有一个多语言持久化架构,因为一种数据模型,无论是关系型还是NoSQL,都无法处理服务的所有使用场景。在我对本文的研究中,我无法找到YouTube使用的特定GoogleCloud数据库的列表,但我很确定它使用GCP特定的产品,如GoogleCloudSpanner、CloudSQL、CloudDatastore、Memorystore等。运行服务的不同特性。本文详细介绍了GoogleAdwords、GoogleFinance、GoogleTrends等其他Google服务使用的数据库。6.CDNYouTube使用Google的全球网络进行低延迟、低成本的内容交付。凭借全球分布的POP边缘点,它使客户能够更快地获取数据,而无需从源站服务器获取数据。所以,在这一点上,我已经谈到了YouTube使用的数据库、框架和技术。现在,是时候谈谈存储了。YouTube如何存储如此庞大的数据量(每分钟上传500小时的视频内容)?7.数据存储:YouTube是如何存储如此庞大的数据量的?视频存储在Google数据中心的硬盘上。此数据由Google文件系统和BigTable管理。GFSGoogleFileSystem是谷歌开发的分布式文件系统,用于在分布式环境中管理大规模数据。Bigtable是一个基于GoogleFileSystem构建的低延迟分布式数据存储系统,用于处理分布在数千台机器上的PB级数据。超过60种Google产品使用它。因此,视频存储在硬盘中。关系、元数据、用户偏好、配置文件信息、帐户设置、从存储中获取视频所需的相关数据等都存储在MySQL中。7.1即插即用的商业服务器谷歌数据中心拥有内部构建的同质硬件和软件,管理着数以万计的独立服务器集群。谷歌部署的服务器可以增强数据中心的存储能力。它们是商用服务器(commodityservers),也称为商用现成服务器(commercialoff-the-shelfservers)。这些服务器价格低廉,可广泛获得并大量购买,并且可以以最少的成本和工作量更换或配置数据中心中的相同硬件。随着额外存储需求的增加,新的商品服务器被插入系统。当出现问题时,商品服务器通常只是简单地更换而不是修理。它们不是定制的,与运行定制服务器相比,使用它们可以让企业大大降低基础设施成本。7.2为数据中心设计的存储磁盘YouTube每天需要超过PB的新存储空间。由于其低成本和高可靠性,旋转硬盘驱动器是主要的存储介质。SSD的性能高于旋转磁盘,因为它们基于半导体,但大规模使用并不划算。它们非常昂贵,并且随着时间的推移容易逐渐丢失数据。这使得它们不适合存储档案数据。另外,谷歌正在为大型数据中心开发新的磁盘系列。有五个关键指标可用于判断为数据存储构建的硬件的质量:硬件应该能够支持秒级的高速输入和输出操作。它应该符合组织规定的安全标准。它应该具有比普通存储硬件更高的存储容量。硬件购置成本、电力成本和维护成本都应该是可以接受的。磁盘应该是可靠的,延迟应该是稳定的。