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

  • 相关阅读:
    java常用配置文件头部声明
    Error while launching application Error: spawn ENOMEM 解决
    Maven添加依赖后如何在IDEA中引用
    2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017)部分题解
    最小一乘法的一种数值算法?
    LOJ 6409. 「ICPC World Finals 2018」熊猫保护区
    min-max容斥复习
    BMCH
    大象
    关于高维卷积的一些不成熟的想法
  • 原文地址:https://www.cnblogs.com/zhaochunhui/p/10998519.html
Copyright © 2011-2022 走看看