`
thinkgem
  • 浏览: 586022 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

大型视频网站YOUTUBE的技术架构

阅读更多

阅读提示:YouTube发展迅速,每天超过1亿的视频点击量,但只有很少人在维护站点和确保伸缩性。

YouTube发展迅速,每天超过1亿的视频点击量,但只有很少人在维护站点和确保伸缩性。

平台

Apache
Python
Linux(SuSe)
MySQL
psyco,一个动态的Python到C的编译器
lighttpd代替Apache做视频查看

状态

支持每天超过1亿的视频点击量
成立于2005年2月
于2006年3月达到每天3千万的视频点击量
于2006年7月达到每天1亿的视频点击量
2个系统管理员,2个伸缩性软件架构师
2个软件开发工程师,2个网络工程师,1个DBA

Web服务器

1,NetScaler用于负载均衡和静态内容缓存
2,使用mod_fast_cgi运行Apache
3,使用一个Python应用服务器来处理请求的路由
4,应用服务器与多个数据库和其他信息源交互来获取数据和格式化html页面
5,一般可以通过添加更多的机器来在Web层提高伸缩性
6,Python的Web层代码通常不是性能瓶颈,大部分时间阻塞在RPC
7,Python允许快速而灵活的开发和部署
8,通常每个页面服务少于100毫秒的时间
9,使用psyco(一个类似于JIT编译器的动态的Python到C的编译器)来优化内部循环
10,对于像加密等密集型CPU活动,使用C扩展
11,对于一些开销昂贵的块使用预先生成并缓存的html
12,数据库里使用行级缓存
13,缓存完整的Python对象
14,有些数据被计算出来并发送给各个程序,所以这些值缓存在本地内存中。这是个使用不当的策略。应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间。只需弄一个代理来监听更改,预计算,然后发送。

视频服务

1,花费包括带宽,硬件和能源消耗
2,每个视频由一个迷你集群来host,每个视频被超过一台机器持有
3,使用一个集群意味着:
-更多的硬盘来持有内容意味着更快的速度
-failover。如果一台机器出故障了,另外的机器可以继续服务
-在线备份
4,使用lighttpd作为Web服务器来提供视频服务:
-Apache开销太大
-使用epoll来等待多个fds
-从单进程配置转变为多进程配置来处理更多的连接
5,大部分流行的内容移到CDN:
-CDN在多个地方备份内容,这样内容离用户更近的机会就会更高
-CDN机器经常内存不足,因为内容太流行以致很少有内容进出内存的颠簸
6,不太流行的内容(每天1-20浏览次数)在许多colo站点使用YouTube服务器
-长尾效应。一个视频可以有多个播放,但是许多视频正在播放。随机硬盘块被访问
-在这种情况下缓存不会很好,所以花钱在更多的缓存上可能没太大意义。
-调节RAID控制并注意其他低级问题
-调节每台机器上的内存,不要太多也不要太少

视频服务关键点

1,保持简单和廉价
2,保持简单网络路径,在内容和用户间不要有太多设备
3,使用常用硬件,昂贵的硬件很难找到帮助文档
4,使用简单而常见的工具,使用构建在Linux里或之上的大部分工具
5,很好的处理随机查找(SATA,tweaks)

缩略图服务

1,做到高效令人惊奇的难
2,每个视频大概4张缩略图,所以缩略图比视频多很多
3,缩略图仅仅host在几个机器上
4,持有一些小东西所遇到的问题:


-OS级别的大量的硬盘查找和inode和页面缓存问题
-单目录文件限制,特别是Ext3,后来移到多分层的结构。内核2.6的最近改进可能让Ext3允许大目录,但在一个文件系统里存储大量文件不是个好主意
-每秒大量的请求,因为Web页面可能在页面上显示60个缩略图
-在这种高负载下Apache表现的非常糟糕
-在Apache前端使用squid,这种方式工作了一段时间,但是由于负载继续增加而以失败告终。它让每秒300个请求变为20个
-尝试使用lighttpd但是由于使用单线程它陷于困境。遇到多进程的问题,因为它们各自保持自己单独的缓存
-如此多的图片以致一台新机器只能接管24小时
-重启机器需要6-10小时来缓存

5,为了解决所有这些问题YouTube开始使用Google的BigTable,一个分布式数据存储:
-避免小文件问题,因为它将文件收集到一起
-快,错误容忍
-更低的延迟,因为它使用分布式多级缓存,该缓存与多个不同collocation站点工作
-更多信息参考Google Architecture,GoogleTalk Architecture和BigTable

数据库

1,早期

-使用MySQL来存储元数据,如用户,tags和描述
-使用一整个10硬盘的RAID 10来存储数据
-依赖于信用卡所以YouTube租用硬件
-YouTube经过一个常见的革命:单服务器,然后单master和多read slaves,然后数据库分区,然后sharding方式
-痛苦与备份延迟。master数据库是多线程的并且运行在一个大机器上所以它可以处理许多工作,slaves是单线程的并且通常运行在小一些的服务器上并且备份是异步的,所以slaves会远远落后于master
-更新引起缓存失效,硬盘的慢I/O导致慢备份
-使用备份架构需要花费大量的money来获得增加的写性能
-YouTube的一个解决方案是通过把数据分成两个集群来将传输分出优先次序:一个视频查看池和一个一般的集群

2,后期

-数据库分区
-分成shards,不同的用户指定到不同的shards
-扩散读写
-更好的缓存位置意味着更少的IO
-导致硬件减少30%
-备份延迟降低到0
-现在可以任意提升数据库的伸缩性

数据中心策略

1,依赖于信用卡,所以最初只能使用受管主机提供商
2,受管主机提供商不能提供伸缩性,不能控制硬件或使用良好的网络协议
3,YouTube改为使用colocation arrangement。现在YouTube可以自定义所有东西并且协定自己的契约
4,使用5到6个数据中心加CDN
5,视频来自任意的数据中心,不是最近的匹配或其他什么。如果一个视频足够流行则移到CDN
6,依赖于视频带宽而不是真正的延迟。可以来自任何colo
7,图片延迟很严重,特别是当一个页面有60张图片时
8,使用BigTable将图片备份到不同的数据中心,代码查看谁是最近的

学到的东西

1,Stall for time。创造性和风险性的技巧让你在短期内解决问题而同时你会发现长期的解决方案
2,Proioritize。找出你的服务中核心的东西并对你的资源分出优先级别
3,Pick your battles。别怕将你的核心服务分出去。YouTube使用CDN来分布它们最流行的内容。创建自己的网络将花费太多时间和太多money
4,Keep it simple!简单允许你更快的重新架构来回应问题
5,Shard。Sharding帮助隔离存储,CPU,内存和IO,不仅仅是获得更多的写性能
6,Constant iteration on bottlenecks:
-软件:DB,缓存
-OS:硬盘I/O
-硬件:内存,RAID
7,You succeed as a team。拥有一个跨越条律的了解整个系统并知道系统内部是什么样的团队,如安装打印机,安装机器,安装网络等等的人。With a good team all things are possible。

 

 

在西雅图扩展性的技术研讨会上,YouTube 的 Cuong Do 做了关于 YouTube Scalability的报告。
视频内容在 Google Video 上有(地址),可惜国内用户看不到。
Kyle Cordes 对这个视频中的内容做了介绍。
里面有不少技术性的内容。值得分享一下。

(Kyle Cordes 的介绍是本文的主要来源)
简单的说YouTube 的数据流量, "一天的YouTube流量相当于发送750亿封电子邮件.",2006 年中就有消息说每日 PV 超过 1 亿,现在? 更夸张了,"每天有10亿次下载以及6,5000次上传", 真假姑且不论, 的确是超乎寻常的海量.

国内的互联网应用,但从数据量来看,怕是只有 51.com 有这个规模. 但技术上和YouTube 就没法子比了.

1. Web 服务器YouTube 出于开发速度的考虑,大部分代码都是 Python 开发的。Web 服务器有部分是Apache, 用 FastCGI 模式。

对于视频内容则用 Lighttpd 。据我所知,MySpace 也有部分服务器用 Lighttpd ,但量不大。
YouTube 是 Lighttpd 最成功的案例。
(国内用Lighttpd 站点不多,豆瓣用的比较舒服。by Fenng)

2. 视频的缩略图(Thumbnails)给服务器带来了很大的挑战。
每个视频平均有4个缩略图,而每个 Web 页面上更是有多个,每秒钟因为这个带来的磁盘 IO 请求太大。
YouTube 技术人员启用了单独的服务器群组来承担这个压力,并且针对 Cache 和 OS 做了部分优化。
另一方面,缩略图请求的压力导致 Lighttpd 性能下降。通过 Hack Lighttpd 增加更多的 worker 线程很大程度解决了问题。
而最新的解决方案是起用了 Google 的BigTable,这下子从性能、容错、缓存上都有更好表现。
看人家这收购的,好钢用在了刀刃上。

出于冗余的考虑,每个视频文件放在一组迷你 Cluster 上,所谓 "迷你 Cluster" 就是一组具有相同内容的服务器。最火的视频放在 CDN 上,这样自己的服务器只需要承担一些"漏网"的随即访问即可。
YouTube 使用简单、廉价、通用的硬件,这一点和 Google 风格倒是一致。

至于维护手段,也都是常见的工具,如 rsync, SSH 等,只不过人家更手熟罢了。

3. 数据库 YouTube 用 MySQL 存储元数据--用户信息、视频信息什么的。

数据库服务器曾经一度遇到 SWAP 颠簸的问题,解决办法是删掉了 SWAP 分区! 管用。
最初的 DB 只有 10 块硬盘,RAID 10 ,后来追加了一组 RAID 1。够省的。
这一波 Web2.0 公司很少有用 Oracle 的(我知道的只有 Bebo,参见这里).

在扩展性方面,路线也是和其他站点类似,复制,分散 IO。最终的解决之道是"分区",这个不是数据库层面的表分区,而是业务层面的分区(在用户名字或者 ID 上做文章,应用程序控制查找机制)

YouTube 也用 Memcached.

 

 

分享到:
评论

相关推荐

    大型网站架构技术方案集锦.doc

    【大型网站架构技术方案集锦】 PlentyOfFish是一个典型的Web 2.0网站,它选择了Windows .NET技术路线,不同于常见的LAMP架构。创始人Markus Frind仅凭一人之力便构建并维护了这个价值10亿美元的在线约会平台,每天...

    大型网站技术架构:核心原理与案例分析_

    《大型网站技术架构:核心原理与案例分析》这本书深入探讨了构建和运维大规模网站所需的关键技术和策略。在当今互联网行业中,随着用户数量的急剧增长,如何设计和优化高可用、高性能、可扩展的网站架构成为了至关...

    大型美食视频网站

    2. **视频播放技术**:为了确保高清视频的流畅播放,网站可能采用了HLS(HTTP Live Streaming)或者DASH(Dynamic Adaptive Streaming over HTTP)等流媒体协议,以及如Vimeo Player、YouTube Player或自建的视频...

    ebay,youku,facebook等架构文档

    - YouTube的架构着重于视频上传、存储、编码、分发和播放的技术挑战。 - 使用CDN(Content Delivery Network)优化视频流媒体的性能。 - 分布式数据库和NoSQL解决方案用于处理大量用户生成的数据。 - 介绍了如何...

    高性能高并发服务架构.doc

    #### 大型网站的架构设计问题 - 数据库分片:将数据库按一定规则分割到多个物理服务器上,如Mysql切分,采用InnoDB存储引擎。 - 动态缓存服务器:如Memcached,用于缓存热点数据,减少数据库访问。 - 图片缓存:...

    PHP实例开发源码—A17CMS php视频类网站源码.zip

    5. **视频流处理**:视频上传、编码、分发和播放涉及复杂的流媒体技术,可能使用了如FFmpeg这样的工具,或者集成第三方服务如YouTube API。 6. **模板引擎**:为了快速构建动态页面,A17CMS可能使用了模板引擎(如...

    网络游戏-用于针对网络中至少一个视频服务提供方的用户自动概括视频内容的过程.zip

    标题中的“网络游戏-用于针对网络中至少一个视频服务提供方的用户自动概括视频内容的过程”表明,这个压缩包文件的内容可能涉及网络游戏与视频服务的结合,特别是自动化技术在视频内容概括上的应用。这一主题涵盖了...

    ASP.NET视频点播系统的设计与实现(源代码+论文)_new.rar

    首先,ASP.NET视频点播系统的核心是实现用户能够按需观看视频,类似于Netflix或YouTube等在线流媒体平台。这种系统通常涉及以下几个关键组件: 1. **前端界面**:用户交互的界面,包括视频浏览、搜索、播放控制等...

    Python库 | decord-0.4.1-py2.py3-none-win_amd64.whl

    1. **视频分类**: 在大量视频数据上进行分类任务,例如YouTube-8M、Sports-1M等大型视频数据集。 2. **物体检测**: 在视频中检测和追踪特定物体,如行人检测、车辆识别等。 3. **行为识别**: 分析视频中的动作,...

    wetube:使用Vanilla和NodeJS克隆Youtube

    【标题解析】 “Wetube: 使用Vanilla和NodeJS克隆Youtube”是指一...通过这个项目,开发者可以深入学习和实践全栈JavaScript开发,了解如何构建大型的Web应用,并且掌握从零开始创建一个视频分享平台的关键技术和挑战。

    youtube_react_bootstrap_front

    这些架构模式帮助保持数据流的一致性,使大型应用的代码更加可维护。 4. **状态管理** - 在React应用中,状态管理是关键。项目可能使用了如Redux这样的状态容器,它提供了一种集中式的状态管理方式,让多个组件可以...

    Wetube:通过SWS用Vanilla和NodeJS克隆Youtube

    "Wetube:通过SWS用Vanilla和NodeJS克隆Youtube" 这个标题揭示了这是一个项目,其目标是模仿YouTube的功能,使用了两种主要的技术——Vanilla JavaScript(原生JavaScript)和Node.js。SWS可能是"Server-side ...

    kinetics700_2020.tar.gz

    这些视频来源于YouTube,覆盖了广泛的日常生活、体育、娱乐等场景,旨在推动视频理解技术的发展。 二、数据集结构 Kinetics700_2020数据集的压缩包文件名为"kinetics700_2020.tar.gz",这表明其采用的是gzip压缩...

    2020绿都新春盛典“萌鼠传奇”沟通案【地产】【年会策划】.zip

    4. **视频直播技术**:如果活动包含线上直播环节,需要了解流媒体服务如Zoom、YouTube Live或Twitch,以及相关的视频编码和网络传输知识。 5. **数据分析**:通过Google Analytics或其他工具分析活动前后的用户行为...

    表演节目范本精选.doc

    3. **多媒体技术**:演出中包括了歌曲、舞蹈、小品、配音等多元化的艺术形式,这些都需要与音频、视频处理技术紧密相连。例如,音乐的混音、剪辑(可能使用Adobe Audition或Audacity)、视频的剪辑和后期制作(可能...

    现场活动网络直播方案

    本方案详细探讨了实施现场活动网络直播所需的关键设备、网络架构以及相关的技术策略。 首先,我们要理解的是网络直播的核心设备。这些设备通常包括高清摄像机、音频设备、编码器、切换台、流媒体服务器以及用于传输...

    《程序员》杂志2012年第5期

    - **可伸缩性的10年探索**:以知名网站为例,剖析其技术发展历程,强调了可伸缩性在大规模网站运营中的关键作用。 - **YouTube成功秘诀**:分享了YouTube七年来积累的可扩展经验,展示了视频流媒体服务如何应对海量...

    seo教程-SEO入门到提高全攻略-九头鸟经典班实战教程之一

    - **视频SEO**:随着YouTube等平台的增长,视频内容的SEO变得越来越重要。 - **社交媒体优化**:利用社交媒体平台提升品牌知名度和流量。 - **内容营销**:创建高质量的内容吸引并保持用户的兴趣。 - **电子商务...

    基于PHP的YYCMS影视v2.3源码.zip

    10. **性能优化**:对于大型的影视网站,性能优化是必要的。这包括数据库查询优化、缓存策略(如Redis或Memcached)、CDN服务、GZIP压缩等。 通过学习和理解以上知识点,开发者不仅能有效地使用YYCMS搭建影视网站,...

Global site tag (gtag.js) - Google Analytics