云上奈飞(三):隐藏在播放按钮下的奥秘(下)

作者丨Todd Hoff

译者丨Sammy Liu @ 世民谈云计算

“云上奈飞”系列文章目录:

  • 云中奈飞(一):Netflix的上云之旅
  • 云上奈飞(二):Netflix全球视频流服务的微服务架构设计
  • 云上奈飞(三):隐藏在播放按钮下的奥秘(上)

Open Connect:Netflix视频流CDN

Netflix尝试过三种不同的视频流CDN策略:自己的小CDN、第三方CDN,和Open Connect。CDN是内容分发网络(content distribution network)。Netflix CDN中保存的就是用于在上一节中讨论的视频文件。分发(Distribution )是指通过网络从中央位置复制视频文件,并将其存储在世界各地的计算机上。对于Netflix,存储视频的中央位置是AWS S3。

为什么要自己构建CDN呢?

使用CDN的目的很简单:通过将视频分到到全球各地的计算机上,使之尽可能接近用户。当用户想要观看某视频时,找到拥有该视频的最近计算机,然后从那里流式传输到用户设备上。CDN的最大好处是速度和可靠性。

想象一下,你正在伦敦观看一个视频,并且该视频是从俄勒冈州波特兰播放的。视频流必须通过许多网络,包括海底电缆,因此连接速度不仅慢而且不稳定。而通过将视频内容移动到尽可能靠近观看者,观看体验就将尽可能快且可靠。计算机存储视频内容的每个位置称为PoP(存在点,point of presence)。每个PoP都是具有Internet访问能力的物理位置。它容纳多台服务器、路由器和其他电信设备。稍后我们将详细讨论PoP。

第一个CDN太小了

2007年是Netflix推出视频流服务的第一年,在50个国家/地区拥有3600万会员,每月观看超过十亿小时的视频,每秒流式传输数TB的内容。为了支持这些用户,Netflix在美国五个不同的地方构建了自己的简单CDN。当时,Netflix视频目录足够小,每个位置都包含其所有内容。

第二个CDN又太大了

在2009年,Netflix决定使用第三方CDN。因为大约在这个时候,第三方CDN的价格下降了,因此使用第三方CDN对Netflix来说是非常合理的。当你可以使用现有CDN服务立即到达全球时,为什么还要花费时间和精力来构建自己的CDN呢?

Netflix与Akamai、Limelight和Level 3等公司签订了合约,为其提供CDN服务。使用第三方CDN没错。实际上,几乎每个公司都这样做。例如,NFL使用Akamai直播足球比赛。

不需构建自己的CDN时,Netflix有更多时间来从事其他更高优先级的事情。Netflix投入了大量时间和精力到开发更智能的客户端上。Netflix创建了适应不断变化的网络条件的算法。即使出现错误、网络过载和服务器过载,Netflix仍希望成员始终能观看最佳画面。Netflix开发的一种技术是切换到另一个视频源(例如另一个CDN或另一个服务器),以获得更好的效果。

同时,Netflix还为我们之前提到的AWS服务投入了大量精力。Netflix将AWS中的服务称为其控制平面(Control plane)。控制平面是一个电信术语,用于标识控制其他所有部分的系统部分。比如,在你的身体中,你的大脑就是控制平面。它控制着其他一切。后来,Netflix认为开发自己的CDN会更好。

Open Connect刚刚好

2011年,Netflix意识到需要大规模的CDN解决方案以最大化网络效率。视频分发是Netflix的核心竞争力,并且可能成为巨大的竞争优势。因此,Netflix开始开发自己的专用CDN Open Connect。Open Connect于2012年推出。Open Connect对于Netflix具有很多优势:

  • 价格比第三方CDN更加便宜,因此能省很多钱。
  • 更好的质量。通过控制整个视频路径(代码转换、CDN、设备上的客户端),Netflix可提供更出色的视频观看体验。
  • 更高扩展性。Netflix的目标是为世界各地提供服务。在提供高质量视频观看体验的同时,快速支持所有这些人需要构建自己的系统。

第三方CDN必须支持用户从世界任何地方访问所有类型的内容,而Netflix自己搞CDN则要简单得多。因为Netflix确切知道用户是谁,因为他们必须订阅Netflix。 Netflix确切知道它需要提供哪些视频。知道它只需要提供大量视频流,就可以让Netflix做出许多其他CDN无法做出的明智优化选择。Netflix也对其成员了解很多,知道他们喜欢观看哪些视频以及何时会看。有了这种数据,Netflix就构建了一个非常出色的CDN。让我们进一步了解Open Connect的工作原理。

Open Connect系统

还记得我们怎么说CDN的计算机遍布全球吗?Netflix开发了自己的视频存储计算机系统。 Netflix称它们为OCA(Open Connect Appliance)。这是在站点中早期安装的OCA的样子:

上图中其实有许多OCA。OCA被分为多个集群,每个集群包括多台服务器。每个OCA都是一台为传送大文件经过高度优化的高速服务器,带有大量用于存储视频的硬盘或闪存驱动器。

以下是一台OCA服务器的外观:

有多种类型的OCA用于不同目的。大型OCA可以存储Netflix的整个视频目录。小型OCA只能存储Netflix视频目录的一部分,它们每天都会在非高峰时段通过Netflix调用的主动缓存(proactive caching)过程填充视频。稍后,我们将详细讨论主动缓存的工作原理。

从硬件的角度来看,OCA没有什么特别的。它们以商品服务器部件为基础,并由多个供应商定制组装。如果需要,你也可以购买相同的计算机。

请注意,所有OCA机器都是红色的吗?Netflix专门根据徽标颜色制作了这些机器。从软件角度来看,OCA使用FreeBSD操作系统和NGINX作为Web服务器。是的,每个OCA都有一个Web服务器,视频流服务使用NGINX。

每个站点中的OCA数量取决于Netflix期望该站点达到的可靠性、从该站点传递的Netflix流量带宽以及站点允许流式传输的流量占比。按下播放键时,你正在观看来自附近某个位置的OCA的视频流。

为了获得理想的视频观看体验,最理想的条件是Netflix把视频缓存在你的房子里面,但这显然不切实际。Netflix尽量将OCA布置到尽可能靠近你的房子附近。他们是如何做到的?

OCA都放在哪里呢?

Netflix利用全球1000多个位置中的数千台服务器提供大容量视频流量。查看此视频投放位置的地图:

YouTube和Amazon等其他视频服务在其自己的骨干网络上交付视频。这些公司构建了自己的全球网络,用于向用户交付视频。这是非常复杂且非常昂贵的。Netflix采用了完全不同的方法来构建其CDN。

Netflix不运营自己的基础网络,也不运行自己的数据中心;相反,互联网服务提供商(ISP)同意将Netflix OCA放在其数据中心并接入到他们的网络中。 Netflix还将OCA放置在Internet交换位置(internet exchange location,IXP)中或附近。

使用这种策略,Netflix不需要运行自己的数据中心,但是它获得了最理想的效果。这真是个天才的做法!

利用ISP来构建CDN

ISP就是你的互联网提供商。你从它们那里获得互联网服务。比如Verizon,Comcast或数千种其他服务。ISP遍布世界各地,并且与客户紧密相连。通过将OCA放置在ISP数据中心中,Netflix的服务也能遍布世界各地,并且与客户离得很近。

利用IXP构建CDN

每个Internet交换中心都是ISP们和CDN们的网络之间交互流量的数据中心。就像你参加聚会与朋友们交换圣诞礼物一样,如果所有人都在同一个地方,则交换礼物非常方便。同理,如果网络都连接到同一个地方,则网络间流量交换会更加容易。IXP位于世界各地:

TeleGeography的IXP地图

下图是伦敦因特网交换中心的图:

London Internet Exchange (LINX)

图中这些黄色光缆放大了看是这样子:

来源:维基图片

上图中的每条线缆将一个网络连接到另一个网络,这就是不同网络相互交换流量的方式。IXP就像高速公路立交桥,但用的是电缆:

来源:维基图片

每天都会主动将视频缓存到OCA

Netflix的所有视频都保存在S3中,而提供视频服务的机器则遍布全球。那视频怎么达到这些机器中呢?Netflix使用其称为主动缓存(proactive caching)的过程将视频高效地复制到OCA。那什么是缓存呢?缓存就像仓库,藏有弹药、食物和宝藏,有时候位于地下。你知道冬天松鼠会储藏坚果吗?

他们储藏坚果的每个位置都是一个缓存。在冬季,松鼠会找到储藏坚果的地方,并依靠其中的坚果过冬。类似地,北极探险队派小队向前走,沿着他们走的路线储存食物、燃料和其他物资,后面的大部队在这些地方获取给养。松鼠和北极探险对都积极地提前做一些事情,为将来做准备。

Netflix的每个OCA都是你最有可能观看的视频的缓存。

OCA主动缓存你最可能观看的视频

在世界任何地方,Netflix都会准确地知道其会员喜欢观看什么视频以及何时会观看。还记得我们曾说过Netflix是一家数据驱动型公司吗?Netflix使用其受欢迎程度数据来预测在各个不同位置中的会员们明天会观看哪些视频。在这里,位置是指ISP或IXP中放置的OCA。Netflix将预测出的视频复制到每个位置的OCA中。这称为预置(prepositioning)。视频甚至可以在任何人想到之前就放在OCA上。这为会员提供了很棒的服务。他们想要观看的视频都已经在他们附近了,这样非常方便流式传输。Netflix运行分层缓存系统(tiered caching system)。

较小OCA位于ISP和IXP中。这些OCA不足以包含整个Netflix视频目录。其他位置的OCA包含Netflix大部分视频目录。尽管如此,其他位置仍具有包含整个Netflix目录的大型OCA。这些OCA都是从S3获得他们的视频。

每天晚上,每个OCA都会向AWS中的服务询问其应包含哪些视频。AWS中的服务根据我们之前提到的预测结果向OCA发送应包含视频的列表。每个OCA都要确保拥有该列表中的所有视频。如果位于同一位置的其它OCA拥有要获取的视频,则它将直接从这个OCA复制视频;否则,它将找到带有视频的附近OCA并复制视频。

由于Netflix预测明天哪些视频会被播放,因此通常有一天的时间将视频放到OCA上,这意味着可以在非高峰时段进行视频复制,这会大大减少ISP的带宽使用。

Open Connect系统中绝不会出现缓存未命中的情况。当向某OCA获取特定视频而它却不拥有该视频时,就会出现缓存未命中。这种情况在其他CDN上经常发生,因为你负担不起在任何地方复制内容的费用。由于Netflix知道必须缓存的所有视频,因此它始终准确知道每个视频的位置。如果较小的OCA没有这个视频,则始终可以保证其中一个较大的OCA具有视频。

Netflix为什么不将他们的所有视频复制到世界上每个OCA?其视频目录太大,无法在每个位置存储所有内容。2013年,Netflix的视频目录超过3 PB。我不知道今天有多大,但显然会大很多。

这就是为什么Netflix开发了一种方法,通过预测其会员希望观看的内容,来预判哪些视频需要保存到哪些OCA中。让我们举个例子。《纸牌屋》是一个非常受欢迎的节目。因为全世界的会员都想观看它,因此视频需要被复制到每个OCA。如果一个视频不像《纸牌屋》那么受欢迎呢? Netflix决定应将其复制到哪个位置,以最好地满足附近的会员请求。

在一个位置中,像《纸牌屋》这样的热门视频被复制到许多个OCA中。视频越受欢迎,它将被复制到更多的服务器。为什么?如果一个非常受欢迎的视频只有一个副本,则这台OCA服务器将会不堪重负。

将视频仅复制到一个OCA时,该视频不会被视为实时视频。 Netflix希望能够在世界各地同时播放相同的内容。仅当有足够数量的OCA,且具有足够的视频副本时,该视频才被视为实时的且可供成员观看。例如,2016年《决战恶魔2》是Netflix首次同时在所有国家/地区的所有设备上发布节目的所有剧集。

托管OCA:对ISP来说OCA意味着什么?

那ISP为什么会同意将OCA群集放入其网络中?乍一看,ISP们实在是太慷慨了。要了解原因,我们需要了解网络的工作原理。云服务是通过互联网访问的。实际上Netflix并非如此,至少在观看视频时。当使用Netflix App时,它才通过因特网与AWS通信。

互联网是网络的互连。你通过ISP获取提供因特网服务。我从Comcast获得互联网服务,这意味着我的房子使用光缆连接到Comcast的网络。Comcast的网络就是ISP的网络,这不是互联网,互联网是另一个东西。

现在我要进行Google搜索,然后在浏览器中输入查询,然后按Enter。我对Google的请求首先通过Comcast的网络传输。因为Google不在Comcast的网络上,因此我的请求必须转到Google的网络。这就是互联网的作用。互联网将Comcast的网络连接到Google的网络。这些称为路由协议的东西就像交通警察一样,指示网络流量的流向。当我的Google查询被路由到互联网上时,它不再位于Comcast的网络上,也不在位于Google的网络上,而位于互联网主干网上。互联网由许多要交互的多个私有网络组成。前面介绍的IXP是网络相互连接的一种方式。

这是美国远程光纤网络的地图:

InterTubes:美国远程光纤基础设施研究

Netflix Open Connect将其OCA群集放置在ISP网络内。这意味着,如果我观看Netflix视频,我将与Comcast网络中的OCA进行通信。我所有的视频流量都在Comcast的网络上,它不会走到互联网上。扩展视频传输的关键是尽可能地接近用户。此时,你不会使用Internet主干网络,而在ISP私有网络上。

为什么这是一件好事呢?前面我们说过Netflix已经消耗了美国超过37%的互联网带宽。如果ISP不合作,Netflix将使用更多的互联网带宽。但互联网无法处理所有视频流量,这就要求ISP必须增加更多的网络容量,而这需要ISP有更多投入。

目前,几乎100%的Netflix的视频流量由ISP网络提供。互联网拥塞减轻了,ISP的成本也就降低了,同时,Netflix会员还获得了高质量的观看体验。这是双赢。

Open Connect是可靠且具有弹性的

前面介绍了Netflix如何使用三个AWS区域来提高其系统的可靠性。Open Connect的体系结构也是如此。不那么显而易见的是OCA彼此独立。OCA是自给自足的视频服务集群。当其他OCA失败时,从一个OCA流式传输的成员不受影响。某个OCA故障时会发生什么呢?你使用的Netflix客户端会立即切换到另一个OCA,然后恢复流式传输。

如果一个地点有太多人使用一个OCA,该怎么办?Netflix客户端会去找到一个负载更轻的OCA去使用。如果用户使用的网络过载了怎么办?同样地,Netflix客户端将在性能更好的网络上找到另一个OCA。Open Connect是一个非常可靠且具有弹性的系统。

Netflix控制客户端

Netflix能优雅地处理故障,因为它控制了运行在每台设备上的Netflix客户端。Netflix自己开发Android和iOS应用程序,因此你能想到Netflix能控制它们。但是,即使在像智能电视这种没有采用Netflix客户端的设备上,Netflix仍然可以控制它,因为它可以控制软件开发套件(SDK)。SDK是一组用于创建应用程序的软件开发工具。每个Netflix应用程序都使用SDK向AWS发出请求并播放视频。通过控制SDK,Netflix可以一致且透明地适应慢速网络、故障的OCA以及可能出现的任何其他问题。

端到端:Netflix视频播放的完整流程

到目前为止,这是我们学到的东西:

  • Netflix视频服务系统包括分为三个部分:后端、客户端和CDN。
  • 来自Netflix客户端的所有请求均被在AWS上运行的服务处理。
  • 所有视频均从Open Connect CDN中在你位置附近的某个OCA设备上通过流传输过来。
  • Netflix在三个AWS区域中运行服务,可以在用户觉察不到的情况下处理任一区域的故障。
  • Netflix将新视频文件转换为多种不同的格式,使得可以根据用户的设备类型、网络质量、地理位置和会员订阅计划为其选择最佳格式进行观看。
  • 每天,Netflix会根据他们预测的每个地点的会员想要观看的内容,通过Open Connect上向全世界分发视频。

这是描述Netflix播放过程的示意图:

现在,我们终于可以看到整个流程了:

  • 你首先选择要在某个设备中的客户端上观看的视频,然后点击播放按钮。Netflix客户端向在AWS中运行的Playback Apps服务发送播放请求,指示你要播放哪个视频。
  • 有一点我们之前没提过,就是在你点击播放按钮之后发生的大部分事情都与许可有关。并非世界上每个地方都有观看每个视频的许可。Netflix必须确定你是否具有观看特定视频的有效许可。我们不会谈论它是如何工作的。Netflix开始开发自己的视频内容的原因之一就是避免许可问题。Netflix希望同时向全球所有人放映节目。创建自己的内容是Netflix避免许可问题的最简单方法。
  • 综合所有相关信息,Playback Apps服务返回最多十个不同OCA服务器的URL。它们和你在Web浏览器中使用的URL一样的。Netflix使用你的IP地址和ISP信息来确定最适合你使用的OCA列表。
  • 客户端通过测试与每个OCA的网络连接的质量,来智能地选择某个OCA去使用。它会首先连接到最快最可靠的那个OCA。客户端会在整个视频流传输过程中继续运行这些测试。
  • 客户端确定从OCA接收内容的最佳方式。
  • 客户端连接到OCA,然后开始将视频流式传输到你的设备。
  • 你曾经注意到观看视频时图像质量会有变化吗?有时看起来像是像素化,不久后图像又恢复为高清画质。那是因为客户端在不断适应网络质量。如果网络质量下降,客户端将降低视频质量以使其匹配。当质量下降太多时,客户端将切换到另一个OCA。

每当你在Netflix上点击播放按钮时,以上这些就会发生。谁会想到这么简单的事情,会有如此复杂的实现过程呢?!

本文是作者Todd Hoff在《Explain the Cloud Like I'm 10》书中的一章的上半部分,2017年发表在http://highscalability.com/blog/2017/12/11/netflix-what-happens-when-you-press-play.html。