zoukankan      html  css  js  c++  java
  • 《YouTube 网站的架构演进》读后感

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

    这个平台是基于Apache、Python、Linux(SuSe)、MySQL、psyco,一个动态的Python到C的编译器、ighttpd代替Apache做视频播放

    You TuBe 当前的状态可谓是超级强大。支持每天超过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,早期

    使用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、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

    文中部分内容摘自原文专业术语及其描述,如有不适,请联系15227013954

  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/zhaochunhui/p/10998519.html
Copyright © 2011-2022 走看看