[译]环球网如何使用NGINX技术成功直播了2014年国际足联世界杯?(二)

原文:Globo.com’s Live Video Platform for FIFA World Cup ’14- Part II – DVR and Microservices

作者: Floyd Smith       译者:杰微刊兼职翻译汪建 

下文改编自环球网的Leandro Moreira 和Juarez Bochi两位工程师 2015年九月份在San Francisco市举办的nginx会议的演讲。这篇博客是两部分的第二部分,这部分主要关注与使用nginx构建微服务。第一部分主要讲了传输及缓存方面的工作,可以在https://www.nginx.com/blog/globo-coms-live-video-platform-fifa-world-cup-14-part-delivery-caching/这里找到,同样你也可以从YouTube上观看完整的研究视频。

内容表

19:02 DVR

20:24 DVR的挑战——故障转移

21:06 DVR的挑战——存储

22:11 使用Redis作为数据存储

23:20 巴西大选

24:12 从Redis到Cassandra

25:11 等候区

27:40 等候区的架构

29:02 国际足联2014世界杯成绩

31:00 回顾和下一步

31:58 NGINX + Lua 表现惊人

33:17 开源软件开发

33:55 总结和未来

34:50 问答

19:02 DVR


Juarez:到2013年,我们对我们的基础设施和我们提供的用户体验感到很满意,于是我们开始思考我们还可以为2014年世界杯做些什么其他事情。

我们决定开发的其中一个功能就是DVR,DVR代表数字视频录像机,它可以提供暂停视频播放、回放和重新观看视频的功能。

要做到基于HLS协议的DVR,我们只需使用一个更大的播放列表,正如你之前见到过的那样,播放列表只是一个排列多个片段的文本文件。对于DVR,要将这些几分钟的视频替换成一个完整的比赛视频的片段。


重新回顾我们的解决方案,我们可以说主要有两大块:采集和前端。两者之间的接口就是存储,存储存放的都是被我们分割后的片段,分割后的文件通过NGINX提供给用户访问请求。

20:24 DVR的挑战——故障转移

因此存储是一个问题,因为我们没有故障转移能力,如果视频流停止了,那么我们不得不重新开始,我们正在使用的EvoStream服务器,只会删除播放列表并重新开始一个新的列表。

如果不提供数字视频录像机DVR功能的话,这个不算是一个问题,因为就算发生故障用户也只会看到缓冲提示并且很快就会重新连接,然后视频流又恢复正常。但是如果你丢失了旧的播放列表,那用户就不能找回原来的播放点,所以对于DVR,我们必须保持所有片段和播放列表的状态。

21:06 DVR的挑战——存储



我们也有点担心存储大小问题,因为对于单一流来说,一场比赛我们会按照比特率对其进行切分,这里会切分成6种比特率,每个比特率对应着不同的质量。用户根据自己带宽情况,可以观看符合条件的任一个资源,大约每5秒视频就有4.5兆字节,所以对于两小时的比赛,这将达到大约6G字节。

我们环球公司播放两个同时进行的比赛和其他播放的视频流,所以我们需要大约40G字节,这并不算很多,我们可以将他们全部都放到RAM中,所以我们决定使用Redis作为视频的存储。

Leandro:我们刚刚替换了我们旧的架构,旧的架构将数据保存到一个目录下,而现在我们将数据块和HLS文件保存到Redis中。

22:11 使用Redis作为数据存储


Juarez:我们用Python建立了一个守护程序,它只是一个简单的脚本,它可以监听文件,当文件被分割成片段后将它们移动到Redis数据库。然后我们使用NGINX配合Lua模块从Redis获取视频流列表,动态查看播放列表。这项工作紧紧花费了我们一两天的时间。

Leandro:使用Python感觉很好,但与此同时我们发现很难对其进行扩展,我不知道是不是因为我们没有足够的经验,对于我们来说,Python确实很难在将其扩展到多核,所以监听文件变化并保存为HLS协议文件的守护程序给我们带来很多痛苦。如果让我们重新做一遍,我们可能会选择另外一种语言,但在当时这是最简单的解决方案,现在它仍然在工作。

Juarez:是的,这个已经成为一个问题,尤其是在巴西大选直播期间。

23:20 巴西大选


所以,后来,当我们在直播巴西大选时,我们有超过30个同时播放的视频流,每个视频流有各自的状态。如Leandro所说,Python脚本成为了一个瓶颈,并且在使用Redis上我们也遇到了问题,因为我们无法把所有这些都放进内存,所以我们决定从Redis转向Cassandra。

需要澄清一下,世界杯直播时我们仍然使用Redis,巴西大选时发生在世界杯之后,我们认为这个比较有趣所以在这里分享。

24:12 从Redis到Cassandra


除了解决其扩展性问题,我们没有必要对守护程序做过多其他的改动。但在前端我们必需为Lua开发一个新的驱动程序。在那时候我们没有找到任何NGINX的Lua驱动模块,所以我们必须自己编写。从那时起,越来越多人使用这个模块,这让人看着很高兴。

25:11 等候室

我们必须做的另外一件事情是建立一个等候区,我们没有使用CDN,我们已经和巴西的几个互联网服务提供商合作,我们有两个数据中心。

有时用户可能通过一个低宽带的ISP连接我们观看视频,这样会导致在此ISP上的所有用户都体验很不好,所以我们决定创建一个等候区,如果太多用户从同一个连接观看视频,我们会将他们放进一个队列里。


Leandro:我们在后面将涉及更多等候区的相关细节,但首先,我们要讨论下我们多连接的解决方案,使得用户能根据IP选择走哪个线路。

选播的工作原理是这样的:你要有一个BGP协议,该协议用于决定路线,然后我们要有ISP,由于我们是一个互联网公司,我们属于一个自治系统,所以我们可以用公司的ISP进行数据交换。

所以由我们决定线路,然后我们的ISP将承认这条线路,现在,如果在圣保罗附近有很多用户,当他们试图访问给定的地址是,ISP会智能的将他们的请求路由到最近的PoP。

现在我们可以更加深入地讨论等待区了。


这里我们可以看到ISP Y只有非常低的带宽连接到我们,所以连接他们的用户在看直播时将会体验很差。但他们不会抱怨他们的ISP,他们会通过推特来抱怨我们,这显然是不理想的,所以我们想出了等候区方案。

27:40 等候区的架构


这里我们可以看到ISP Y只有非常低的带宽连接到我们,所以连接他们的用户在看直播时将会体验很差。但他们不会抱怨他们的ISP,他们会通过推特来抱怨我们,这显然是不理想的,所以我们想出了等候区方案。

27:40 等候区的架构


我不知道你们是否像我们一样喜欢足球,但我们对这个结果不满意,但这就是生活。

我非常兴奋我们有很多的带宽供我们使用,该图大致显示了我们对比赛进行直播时的几个峰值,这并不是所有比赛的情况,但我对这个结果非常满意。


我们有超过50万用户同时在线,并且我们可以很容易地支持更多的用户。我们本来预计有100万用户同时在线观看,但我们怀疑真实的在线用户可能比预期的要少,因为当巴西进行比赛时,人们可以从家里观看比赛,所以,很多人们更愿意通过电视观看,于是通过环球网观看的用户会少很多。

另一个很酷的数字是某场比赛达到640Gbps,我认真这是相当不错的。


既然我们有索伦仪表盘,我们可以通过监控软件Graphite进行估算,结果是所有观众观看的时间总和大致超过1600年,我们有超过四千万用户观看。


这里你可以看到我们的平均比特率,这里面也有我高兴的事情,就是我们每个节点使用了仅仅10%CPU就能达到20G每秒速度。

31:00 回顾和下一步

既然我们已经展示了我们的成绩,我觉得是时候回顾一下,并且讨论下我们下一步可以为我们的平台做什么事。


Juarez:我们在视频流方面使用了很多NGINX,我们用它来做传输、用来做缓存。我们开发了地理定位、授权、认证等多个模块。

我们也围绕它内置了很多微服务,我们使用NGINX和Lua用于播放列表的生成,也用于等候区。我们还有另外一个前面没有时间提及的系统,这个系统可以锁定一个用户可以拥有并发会话的数量,但这主要用于封闭播放,而不是用于像世界杯这样的直播。

31:58 NGINX + Lua 表现惊人


我们真的很喜欢NGINX和Lua,我们也很高兴尝试了nginScript,但到目前为止,我们更喜欢Lua,它也是在巴西被创造出来的。

Leandro:这个与目前的问题不相关。

Juarez:哈哈,是的,这个与目前的问题不相关。我认为我们应该看看技术方面的东西,我们一直在尝试并且非常喜爱的框架是Busted,它在测试驱动开发方面表现良好,使我们的生活更轻松。

Lua是一个小语言,所以很容易学习,与C语言比起来,我们在开发UGINX+Lua时体验更加好,使用Lua语言开发起来更快,然而你仍然可以获取接近C语言的性能,所以我们对此十分满意。

Leandro:Lua至少对我们来说更加容易,因为我们不是C语言专家。

33:17 开源软件开发


我们真的很喜欢NGINX和Lua,我们也很高兴尝试了nginScript,但到目前为止,我们更喜欢Lua,它也是在巴西被创造出来的。

Leandro:这个与目前的问题不相关。

Juarez:哈哈,是的,这个与目前的问题不相关。我认为我们应该看看技术方面的东西,我们一直在尝试并且非常喜爱的框架是Busted,它在测试驱动开发方面表现良好,使我们的生活更轻松。

Lua是一个小语言,所以很容易学习,与C语言比起来,我们在开发UGINX+Lua时体验更加好,使用Lua语言开发起来更快,然而你仍然可以获取接近C语言的性能,所以我们对此十分满意。

Leandro:Lua至少对我们来说更加容易,因为我们不是C语言专家。

33:17 开源软件开发


Leandro:综上所述,从2010年到2014年,我们从RTMP协议转移到HLS协议,然后我们推出这个叫DVR的功能。

现在,我们期待奥林匹克运动会的到来,我们正考虑提供不同类型的方式,例如Dynamic Adaptive Streaming over HTTP。我们可能会改变采集方面关于信号被摄入的方式,也许要让它支持4K。

Juarez:有一件事我们肯定知道的是,我们将继续使用NGINX。

Leandro:是的。

34:50 问答

1、有多少用户在看巴西队和德国队的比赛?详细情况你知道吗?

Juarez:我觉得在第三个进球之后,没有一个观众(笑)。不,只是开个玩笑。观看巴西队比赛的观众很少,因为几乎所有人都使用电视在看比赛,而不是通过互联网,大约有10万左右的用户使用播放器观看。

2、关于前端NGINX服务器,使用了NGINX Plus机器还是NGINX开源机器。

Leandro:使用了开源机器,我们使用了社区中的一款。

Juarez:是的,我们使用了默认的NGINX开源解决方案,我们也有我们的一些硬件负载均衡器,我们使用它们对跨NGINX多个实例的拆分负载。

3、你在讨论的irqbalance和CPU亲和力,你是怎么意识到这是一个问题的呢?

Juarez:我们注意到的第一件事是我们一直在丢失数据包,而且我们注意到的第二件事是机器只有一个CPU核在工作,我们发现使用最多CPU的进程是处理网卡软中断的那个进程,所以我们首先安装irqbalance将负载分到其他CPU核上,我们发现将中断指定到某个CPU核上性能会更好。

Leandro:所有这一切要归结到这一事实,那就是我们看到每个节点的极限是拥有20Gbps传输能力,但我们并没有达到20Gbps,所以我们就认为可能是NGINX存在问题,或者是其他问题导致的,因为它仅仅用于处理静态文件,这个不应该这么难,所以我们开始研究、故障排除,然后我们就能够理解和运用刚才前面讲到的优化方案。

Juarez:另外一个有趣的数字是,仅仅使用2台NGINX服务器,我们就可以处理10万用户的访问,这个等同于我们使用50台Flash媒体服务器处理的用户量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容