如何搭建视频分享网站
2011-09-26
视频点播业务是近年发展势头最好的互联网业务。本文以从技术角度解析视频点播服务关键技术 视频内容是如何在互联网进行分发的 视频网站如youtube,优酷网,土豆网,新浪视频等视频分享网站通多CDN技术进行视频内容分发。CDN翻译成汉语就是“内容分发网络”。编辑,网友制作或上传视频到CDN网络,CDN网络将这些视频分发到分布于全国各地IDC机房中的点播服务上。用户则就近访问最近的点播服务进行视频体验。组成CDN网络的关键软件有“Squid” “Apache” 等基于HTTP协议的服务端软件 和域名服务器软件如 bind,域名服务器软件负责根据用户的ip地址将用户的http请求引导到离用户最近的IDC机房中的点播服务器。 CDN软件分析 流行的点播服务主要基于HTTP协议,mms协议,rmtp协议,其中http协议没有控制消息,所以此协议不支持对点播流媒体的控制操作,如进度拖动,play,pause,stop等。
squid apche,
这两种服务器支持基于http的点播服务,时下最流行,大部分视频分享网站都采用类似这样的方案。squid主要功能是反向代理的功能。一般作为点播前端服务器使用。什么是反向代理---说白了就是,当用户访问squid服务软件时,如果squid没有此视频文件,则它会根据配置文件里设置的参数,到上行的数据中心去抓取文件,之后再返回给用户进行观看。举例说,当西安的用户访问优库网时,优酷网发现访问来自西安的用户,则将此访问引导至优酷网在西安布置的squid服务器,当squid发现自己没有用户要的视频时,则它根据配置文件里设置的参数,到北京的数据中心的服务器抓取文件到自己本地。之后再返回视频文件给用户。当下次再有用户访问相同的视频时,本地已经存在了,就直接返回视频给用户了。
media service,flash server。这两种服务器支持控制协议,其中media service支持mms,rtsp,flash server支持rtmp。这两种协议服务的点播业务,当用户访问时,用户可以拖动滚动条,和进行暂停,终止等控制操作。56网的视频可以拖动进行观看,我觉得应该使用的是rtmp协议。新浪早期的视频服务都是mms协议的视频点播,也支持拖动。
点播技术方案和优略势 squid + apache 方案,
次方案的优势:
软件很成熟稳定。
视频分发采用拉模式。并且squid可以组群,所以分发简单,相对高效 技术开放。由于squid,apache都是linux上流行的软件,并且源码开放,所以用户可以进行二次开发 软件成本低、linux不需要授权费,squid,apache都免费,软件成本基本为0
劣势:
squid是一个古董软件,设计的目标是代理功能,那个时候还没有视频分享概念。所以做cdn服务有些强人所难。很多公司搭建cdn网络时都针对squid进行改造和二次开发工作 squid代理的单位是文件。当视频文件比较大时,如几百兆大小,反向代理抓取效率低。大家都有经验,传几百兆大小的文件需要花很长时间,并且大量占用带宽和cpu。
squid与系统的结合。作为服务器软件,支持并发量是一个很重要的参数,如果一台服务器支持并发用户量大,则可以为公司节省大量成本。影响并发量数量有以下一些因素:
带宽:我们都知道服务器网卡通常是千兆网卡。如果视频编码率为400K码流,1000M除以400K,理论跑满网卡可以支持2500个连接。但实际情况一般能跑到500M,支持并发1000个连接就很不错了。
内存:当并发连接数量很多时,服务器使用的内存往往出现瓶颈。想想,如果一个连接需要使用1M内存进行数据传输,那么1000个并发1G内存就没了。这就是事实。所以ngix这个软件在这方面比apache太有优势了。
cpu:网络io在很多系统上消耗致命的cpu。原因是有些平台没有提供高效的io模型方案。网络io分阻塞和非阻塞模式,异步和同步模式。 最差的方式是阻塞同步模式。但这个模式实际是最常用的。这就是bsd socket的接口,read,write,connect,bind,listen,打多数软件为了编程方便,让调用线程阻塞调用这些系统调用。当并发量大的时候,尤其是服务器软件,这种编程方式绝对不能接受。 非阻塞同步模式:这个模式在服务器编程中最流行,系统调用在unix和linux是 select, poll,windows也支持select,但提供了相对性能更好的waitforobject系统调用。但这些调用的基础都是查询句柄状态,而且是在用户态下,当并发量大时,这个轮询也会耗去大量的cpu。linux2.6之前的服务器,只能采用这个方案,而且是最优方案。但这对于网络服务大并发的要求此方案不可接受。此方案有些二次开发针对write,read系统调用次数进行改造,替换成writev,readv这种基于iovector的调用替换,在io时减少系统调用的次数。但个人认为效果有限。
最高效的方案非阻塞异步模式:
支持此模式的的操作系统有solaris ,windows,linux 2.6以上版本,freebsd solaris 和windows在aio基础上实现,是真正的内核态异步io。linux的epoll调用只是异步通知句柄状态的改变,但io的读写还是用户负责,所以算不上真正的异步io。freebsd的kqueue也类似。但这个方案是现有方案的中的最佳方案了。其中本人更看好windows的iocp,因为windows的iocp中的系统调用不仅是真正的异步io,而且还支持overlapped读写,可以说支持多线程并发读写同一个io句柄。windows平台应该是网络服务最优前途的方案。太牛了。solaris的aiowait系统调用不支持多线程。 cpu对io的影响好像用掉的笔墨太多,主要是这个对并发量影响巨大。
带宽限速:我们都知道,用户带宽越来越大,如果我们不限制用户下载速度,后果很严重。比如:如果用户使10M带宽,如果不限速,100个用户就把服务器带宽吃掉了。实际情况中,50个这样的,就不行了。所以服务器一定要限制用户下载速度。如果视频的码流是400K,最好限制用户500K,这样既不影响用户流畅的观看,又节省了服务器带宽。这样一台服务器并发就可以支持更多的用户了。
本地缓存:反向代理软件squid的主要的优势就是进行本地缓存。但如果缓存被大量的用户很少访问的文件占用,服务器磁盘空间毕竟有限,这时候会加剧对反向代理的次数。降低代理效果,所以对缓存要进行算法调整和设计。 cdn对p2p技术的应用。如果反向代理软件可以组成p2p网络,进行网络数据块交换,存储。这样会极大的减少数据中心访问次数,加速数据交换效率。squid因为是基于文件的代理,如果进行交换也是基于文件的交换,当问及大小巨大时,效果很差。