采访:视频 CDN 分发、调度与服务

阅读数:4650 2012 年 8 月 16 日

话题:架构设计模式DevOps语言 & 开发

吴岷是土豆网基础系统开发总监,在土豆长期负责视频上传、转码、CDN、点播、直播等系统的开发和维护。在全球架构师峰会期间,我们有幸采访了他,针对视频 CDN 分发、调度与服务方面的内容进行了交流。

InfoQ:与传统的网站相比,视频网站的架构需要应对哪些特定的非功能性需求,土豆网是如何应对的?

吴岷:用户观看视频需要一个高速且稳定的下载带宽,所以视频 CDN 节点要离用户更近。CDN 节点离用户近就意味着 CDN 节点会很多且相对比较小。另外从成本考虑,在二三级城市购买带宽单价往往会便宜些。小节点多就会引发很多问题,比如节点质量不稳定,机房不能提供高可靠性的服务,机房搬迁比较平凡,等等。所以视频 CDN 需要有足够的灵活性来应对这些变化。

土豆网的视频 CDN 的特点是视频文件纯分布式的,它不存在核心节点,并且所有视频文件在位置中心服务器都知道,这样做的好处是机房只要能服务好当地用户,不必考虑与核心节点间的链路质量;另外由于中心机房知道所有文件位置,所以硬件故障和机房搬迁都能非常容易的处理,只要在数据库中把相应的硬件或者机房置为不可用即可。

InfoQ:视频 CDN 需要关注哪些方面的问题?

吴岷:视频 CDN 需要关注用户服务质量,这和一般网站 CDN 是一样的。比较特殊的是视频 CDN 特别要关注成本。视频 CDN 在公司运营成本中占的比例相当大。为了节省成本,商务可能会随时把机房从贵的地方,搬迁到便宜的地方,视频 CDN 要有适应这种变化的能力。另外,从技术方面,降低单位服务成本永远是我们努力的方向。

InfoQ:您认为,在视频同步方面,架构的使命是什么,应该如何实现,存在哪些问题呢?

吴岷:整个视频 CDN 的使命是以较低的单位服务成本给用户较好的服务体验。当然架构在视频同步方面的使命也是一样。视频同步的目的是尽可能把视频放到离用户近的节点去,以提高用户的体验,但是视频同步也是要消耗带宽的,如何平衡这两者关系,找到一个最佳的平衡点,是视频同步一直要考虑的问题。

InfoQ:请您谈一下,视频同步的 Push 和 Pull 两种模式,各自的优缺点有哪些呢?

吴岷:pull 模式是 CDN 的经典模式比较成熟,直接用到视频上也比较容易。Push 模式需要实现很多东西。两者优缺点很明显,纯粹的 pull 模式实现比较简单,灵活差点;push 模式更灵活,但是非常复杂。也可以结合两者有点,采用混合的模型。

InfoQ:土豆在视频同步方面采用了哪些技术,效果如何?

吴岷:土豆的视频同步从策略上沿用了 cache 的思路,把最热的文件复制到边缘节点,淘汰最冷门的文件。在具体实现上我们做了几点优化,一个是采用类似 p2p 的技术, 可以同时从多个节点下载文件,当然这些节点也是离目标节点最近的。另外我们的 Web 服务器有下载文件的功能,这样做的好处是磁盘的读写都由一个进程调度,实现了磁盘吞吐最大化。效果不错,一般一个几十兆的新视频文件只需要几分钟就能同步到全网了。

InfoQ:您认为在访问调度方面,视频 CDN 有什么样的特点?

吴岷:土豆的视频 CDN 节点比较多,且每个比较小。小节点比较容易跑满,所以负载均衡要做得非常实时,否则用户观看视频就容易卡。另外我们视频 CDN 的服务器都没有做 raid,磁盘很容易损坏,服务器有时候也会当机,调度如果能够及时感知到服务器的健康状况的话就很容易屏蔽掉这些失效的硬件,用户就感知不到了。

InfoQ:土豆网采用了什么样的技术实现访问调度,有哪些优缺点,是否满足了需求?

吴岷:土豆的视频 CDN 的状态实时汇报到调度系统在中心服务器,加上中心服务器知道每个文件所在的位置,这相当于所有情报尽在掌握了,所以土豆的视频调度从策略上来讲相对不难做好。缺点时实现起来复杂,计算量大。因为复杂,所有总会碰到各种各样的问题,但是经过这几年的积累,现在已经可以满足需求了。

InfoQ:在 Web 服务方面,视频网站经常会出现的问题有哪些?

吴岷:多样性方面。互联网视频这几年发展的比较快,codec 从 h263 发展到 h264,容器有 flv, 3gp, mp4, ts 等,客户端从 flash player 到现在 ios,安卓等等。技术要随时跟上。在系统稳定和兼容中找到平衡。另外,和放图片的 CDN 一样,磁盘读写依然是 web 服务的瓶颈。

InfoQ:土豆网是如何解决 Web 服务方面的问题的,采用了哪些技术?

吴岷:土豆网视频 CDN 中使用的 Web 服务器是我们自己研发的。当时我们分析了用通用 http 服务器的实现原理,并针对视频的特点加以改善。

一般 http 服务器使用 sendfile api 把文件发到 socket 上。对于小文件,比如图片,一般一次读操作就能读取整个文件,这时由于不需要多余的内存复制,所以 sendfile 的效率很高。但是视频文件比较大,几乎不可能一次从磁盘上把文件读出来,要同时服务很多用户,这时哪个文件读第二次就是一个很大的问题。当时我们主要的改进是舍弃了调用 sendfile,改成用 read 读取磁盘,然后磁盘调度由应用程序实现,而不是交给操作系统,所以我们能把磁盘调度做到最优化。最近我们把视频同步也集成到我们的 Web 服务器中,这样,不光硬盘的读,连硬盘的写都由一个程序来负责调度,大大提高了磁盘的读写吞吐。另外,因为整个 Web 服务器都是自己开发的,所以在实现比如支持 HLS 等新功能时就比较方便了。

InfoQ:请您从总体上说明一下土豆网的视频 CDN 架构的特点。

吴岷:总的来讲,土豆视频 CDN 架构最显著的特点就是采用 push 模式实现文件同步。中心控制节点知道所有信息,所有行为都由中心控制节点发出。这样做从策略上非常灵活,几乎没有策略上不能实现的需求。但是从实现上讲就比较复杂。对于中心节点服务器可扩展性、稳定性、计算能力等都有相当的考验。