概述

YouTube 在国内是个404网站,需要翻墙得见,这是有用的废话,先铺垫一下。

从全球网站来看,它仅次于母公司 Google,全球排名位列第2。每天超过5亿以上视频播放量,平均每个用户点击10-15个视频。

就是这样一个巨大型网站,却只有很少的人在维护网站,保证其可用性和可伸缩性。

是什么原因呢?肯定不是Google舍不得花钱建团队,也不能只靠人品,但也不能靠寂寞。

那么到底是什么呢?接下来我们就来了解 YouTube的基础技术架构。

基础平台

  • Apache

  • Python

  • Linux(SuSe)

  • MySQL

  • psyco,一个动态的Python到C的编译器

  • lighttpd代替Apache做视频播放

状态

 

  • 支持每天超过5亿的视频点击量

  • 由美籍华人陈士骏(生于1978年)创立于2005年2月

  • 于2006年3月达到每天3千万的视频点击量

  • 于2006年7月达到每天1亿的视频点击量

  • 于2016年3月达到每天5亿+的视频点击量

  • 2个系统管理员,2个伸缩性软件架构师

  • 2个软件开发工程师,2个网络工程师,1个DBA以(在2010年左右的人数)。

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对象(类似于php中的OpCode或Java的ByteCode)
14、有些数据被计算出来并发送给各个程序,所以这些值缓存在本地内存中—注:这个策略有些使用不当。

应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间,使用一个代理来监听更改,预计算,然后再发送。

视频服务

1,花费包括带宽,硬件和电力消耗
2,每个视频由一个小的服务器集群来处理,每个视频都是多机机器提供数据
3,使用一个集群意味着:

  • 更多的硬盘来保存视频内容,提高更快的速度

  • 高可用与灾难恢复。或一台机器出现故障,其它机器可以继续服务

  • 在线备份

4,使用lighttpd作为Web服务器来提供视频服务:

  • Apache开销太大

  • 使用epoll来等待多个FDS

  • 从单进程配置转变为多进程配置来处理更多的连接

  • 后来从lighthttpd之后换为Nginx,显示为YouTubeFrontEnd,具体是什么未知

5,大部分流行的内容转移至CDN:

  • CDN在多个地方缓存内容,这样内容离用户更近的机会就会更高

  • CDN机器经常内存不足,因为内容读取频繁,会出现内存与外存的交换瓶颈,即内存颠簸

6,一些较冷的内容(每天1-20浏览量),外部链接使用YouTube服务

  • 长尾效应。一个视频可以有多个播放,但是许多视频正在播放。随机硬盘块被访问

  • 在这种情况下缓存不会很好,所以花钱在更多的缓存上可能没太大意义。

  • 调节RAID控制并注意其他低级问题

  • 调节每台机器上的内存,不要太多也不要太少

视频服务架构关键点

1、保持简单和低成本
2、保持简单网络拓扑,内容和用户之间不要有太多路由
3、使用常用硬件,使用昂贵的硬件找到帮助文档也不易
4、使用简单常见的工具,构建在Linux平台,以及其上的工具
5、很好的处理随机查找(SATA,tweaks)

缩略图服务

1,做到处理最高效
2,每个视频要生成4张缩略图,所以缩略图比视频多很多
3,缩略图只保存在几台机器上
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)和视频文字介绍、评论信息

  • 使用一个RAID 10的磁盘阵列来存储数据

  • YouTube经过一个常见系统的架构演进:

    从单服务器开始,然后单master和多read slave,接着做数据库partition分区,然后再hash sharding方式

  • 备份慢的痛苦。master数据库是多线程的并且运行在一个大型机上,可以处理许多工作;slave是单线程的且运行在小一些的服务器上,备份是异步的,所以slave会远远慢于master主机

  • 更新引起缓存失效,硬盘的I/O缓慢导致备份迟延

  • 使用备份架构花费不少钱来增加写的性能

  • YouTube解决方案把数据分成两个集群来将传输分出优先次序:一个视频查看的数据库集群,另一个是处理其它业务的集群。

2,后期

  • 数据库分区

    分成shardings,不同的用户被分发到不同的sharding

  • 扩散读写

  • 更好的缓存位置意味着更少的I/O

    硬件设备减少30%

  • 备份延迟降低到0

  • 到现在,可以任意提升数据库的伸缩性

数据中心策略

1、信用卡与支付处理,受控于支付方的主机提供商
受管主机提供商不能提供可伸缩性,亦不能控制硬件,使用更好的协议。后改为托管安置(colocation arrangement)。现在YouTube可以自定义所有模块并且制定自己的协议
2、扩展到十几个自有IDC数据中心,以及CDN服务器
3、视频内容由任意的IDC提供,没有经过最近地址匹配。如果一个视频很流行则会被分发到CDN来承载。
4、视频速度依赖于带宽而非真正的延迟
5、遇图片加载延迟严重,场景是是当一个页面有60几张图片时
6、使用BigTable将图片备份到不同的数据中心,由代码逻辑定位哪张离用户最近

小结:

1、Stall for time。创新和敢为让你在短期内解决问题,需要找到长期的解决方案
2、Proioritize。找出你的服务中核心的东西,并对资源拆分,划分优先级
3、Pick your battles。无需担心将核心服务分出去。

Youtube使用CDN来分布最流行的内容。如果都多地自建IDC机房,将需要很长时间和较高的花费
4、Keep it simple。保持简单,以此原则迭代架构,来响应出现的问题
5,ShardIng。分布式架构帮助我们隔离存储,CPU,内存和IO设备的负载,不仅仅是获得更多写的性能。
6,系统瓶颈的持续迭代:

    • 软件:DB,缓存

    • OS:硬盘I/O

    • 硬件:内存,RAID

《YouTube 网站的架构演进》阅读笔记的更多相关文章

  1. 阅读《RobHess的SIFT源码分析:综述》笔记

    今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...

  2. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

    SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...

  3. RobHess的SIFT源码分析:综述

    最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...

  4. 阅读《RobHess的SIFT源码分析:综述》笔记2

    今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...

  5. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  6. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  7. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  8. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  9. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  10. element-ui switch组件源码分析整理笔记(二)

    源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...

随机推荐

  1. 丰田开放混动专利后,真能PK赢纯电动汽车吗?

    特斯拉已成为美国汽车市场增速最快的厂商,且在中国建设工厂后又巩固了自身的地位:蔚来.小鹏等互联网造车企业迅速崛起,吸引着风投的强烈关注:全球范围内,纯电动汽车的销量节节攀升--从多个维度看,纯电动汽车 ...

  2. 重構電影網源碼 1905.com - 數據庫結構表

    最近閒來無事,想著克隆一個電影網站. WWW.ROAK.COM 技術語言:JAVA EE  * j2ee核心组件:jsp.servlet.jdbc.ejb.jndi * 数据通信:xml标记语言 * ...

  3. 「Luogu4556」Vani有约会-雨天的尾巴

    「Luogu4556」Vani有约会-雨天的尾巴 传送门 很显然可以考虑树上差分+桶,每次更新一条链就是把这条链上的点在桶对应位置打上 \(1\) 的标记, 最后对每个点取桶中非零值的位置作为答案即可 ...

  4. SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

    目录 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返 ...

  5. STP 指定端口 根端口 区别和理解

    不多说,先上图,A为指定端口,B为非指定端口. 看本文的网友应该知道根端口和指定端口的选举,但是对指定端口和根端口的理解不清楚.这里我就略过选举过程,直接描述这两者的区别和存在的意义. 指定端口:转发 ...

  6. MyBatis模糊查询异常: '%${}''读取jdbc属性

    '%${}''总是传root, 后来发现${username}读取了jdbc里面的属性username,于是将jdbc属性名修改,成功

  7. easyui 加载本地json 文件的方法

    easyui 加载本地json 文件的方法 2017年12月15日 17:18:07 vivian_hnd 阅读数 2155 https://blog.csdn.net/vivian_wang07/a ...

  8. GoJS简单示例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. VScode禁用alt+key触发菜单栏快捷键

    因为用惯了Mac,突然改回Windows,但是已经习惯了按Command键.所以在Windows下把vscode的快捷键全改成alt+key了.但是Windows的alt+key快捷键就比较烦人了.所 ...

  10. WOFF格式

    WOFF格式WOFF文件格式是用WOFF (Web Open Font Format)创建的网页开放字体格式,Web开放字体格式(Web Open Font Format,简称WOFF)是一种网页所采 ...