优酷 YouTube Twitter及JustinTV视频网站架构设计笔记

2023-11-17

               

本文是整理的关于优酷、YouTube、Twitter及JustinTV几个视频网站的架构或笔记,对于不管是视频网站、门户网站或者其它的网站,在架构上都有一定的参考意义,毕竟成功者的背后总有值得学习的地方,虽然有些文章的发表时间有点久了,但是看看对开阔视野还是有帮助的。

优酷视频网站架构

一、网站基本数据概览
据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最高的厂商。
硬件方面,优酷网引进的戴尔服务器主要以 PowerEdge 1950与PowerEdge 860为主,存储阵列以戴尔MD1000为主,2007的数据表明,优酷网已有1000多台服务器遍布在全国各大省市,现在应该更多了吧。
二、网站前端框架
从一开始,优酷网就自建了一套CMS来解决前端的页面显示,各个模块之间分离得比较恰当,前端可扩展性很好,UI的分离,让开发与维护变得十分简单和灵活,下图是优酷前端的模块调用关系:
优酷前端的模块调用关系
这样,就根据module、method及params来确定调用相对独立的模块,显得非常简洁。下面附一张优酷的前端局部架构图:
优酷的前端局部架构图
 
三、数据库架构
应该说优酷的数据库架构也是经历了许多波折,从一开始的单台MySQL服务器(Just Running)到简单的MySQL主从复制、SSD优化、垂直分库、水平sharding分库,这一系列过程只有经历过才会有更深的体会吧,就像MySpace的架构经历一样,架构也是一步步慢慢成长和成熟的。
1、简单的MySQL主从复制:
MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其原来图如下:
MySQL主从复制
其主从复制的过程如下图所示:
主从复制的过程
但是,主从复制也带来其他一系列性能瓶颈问题:
-写入无法扩展
-写入无法缓存
-复制延时
-锁表率上升
-表变大,缓存率下降
那问题产生总得解决的,这就产生下面的优化方案,一起来看看。
2、MySQL垂直分区
如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。经过垂直分区后的数据库架构图如下:
MySQL垂直分区
然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题,因此为何不试试水平sharding呢?
 
3、MySQL水平分片(Sharding)
这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:
MySQL水平分片
如何来确定某个用户所在的shard呢,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,如下图所示:
用户所在的shard
但是,优酷是如何解决跨shard的查询呢,这个是个难点,据介绍优酷是尽量不跨shard查询,实在不行通过多维分片索引、分布式搜索引擎,下策是分布式数据库查询(这个非常麻烦而且耗性能)
 
四、缓存策略

貌似大的系统都对“缓存”情有独钟,从http缓存到memcached内存数据缓存,但优酷表示没有用内存缓存,理由如下:
避免内存拷贝,避免内存锁
如接到老大哥通知要把某个视频撤下来,如果在缓存里是比较麻烦的
而且Squid 的 write() 用户进程空间有消耗,Lighttpd 1.5 的 AIO(异步I/O) 读取文件到用户内存导致效率也比较低下。
但为何我们访问优酷会如此流畅,与土豆相比优酷的视频加载速度略胜一筹?这个要归功于优酷建立的比较完善的内容分发网络(CDN),它通过多种方式保证分布在全国各地的用户进行就近访问——用户点击视频请求后,优酷网将根据用户所处地区位置,将离用户最近、服务状况最好的视频服务器地址传送给用户,从而保证用户可以得到快速的视频体验。这就是CDN带来的优势,就近访问,有关CDN的更多内容,请大家Google一下。

这是一个完整的PDF:http://www.blogkid.net/qconppt/youkuqiudanqconbeijing-090423080809-phpapp01.pdf

转自:http://www

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优酷 YouTube Twitter及JustinTV视频网站架构设计笔记 的相关文章

  • 多线程经典案例(生产者--消费者)

    多线程开发中有一个经典的操作案例 就是 生产者 消费者 案例 生产者不的生产产品 消费者不断地取走产品 此案例涉及线程同步 线程休眠 线程等待 线程唤起等操作以及之间是如何搭配使用的方法 示例讲解 本示例模拟中生产者由 厨师 担任 消费者由
  • 如何利用 Selenium 对已打开的浏览器进行爬虫

    大家好 在对某些网站进行爬虫时 如果该网站做了限制 必须完成登录才能展示数据 而且只能通过短信验证码才能登录 这时候 我们可以通过一个已经开启的浏览器完成登录 然后利用程序继续操作这个浏览器 即可以完成数据的爬取了 具体操作步骤如下 1 1
  • QT循环队列实时处理数据(二)

    上一篇多线程介绍的是 QT多线程处理机制 这篇 将对接收数据 实时处理进行分析 QT通过socket通信 从接收缓冲区中读取数据 交给线程进行处理 那么问题来了 如果线程还没有处理完数据 则线程就没有办法继续从缓冲区中取数 那么当数据量过大
  • vue父子组件之间的传值(子传父,父传子)

    vue父子组件之间的传值 子传父 父传子 前提首先需要了解vue中组件之间的父子关系 主组件mainPage vue
  • 个性化定制界面和极简版原装界面,哪一个你用起来更加顺手呢

    个性化定制界面是根据用户的需求和喜好进行定制的 具有很高的灵活性和可定制性 用户可以自由选择界面的颜色 布局 字体等 以及添加或删除特定功能 这种界面能够根据用户的个人喜好和习惯进行定制 使得用户在使用过程中更加舒适和顺手 以下是一些可能的
  • 【数据结构】&&【C++】平衡搜索二叉树的模拟实现(AVL树)

    数据结构 C 平衡搜索二叉树的模拟实现 AVL树 一 AVL树的性质 二 AVL树的模拟实现 AVL树结点的定义 AVL树的插入 平衡因子的更新 左单旋 右单旋 双旋 左右旋 右左旋 AVL树的删除 检查是否是AVL树 三 完整代码 一 A
  • Tp5 left join 带条件 数据不返回

    背景 下面两种方式都是在查询吸毒人员的基本信息 pa account 表示该吸毒人员的评估小组 一般情况下 录入吸毒人员基础信息都会录入其关联的评估小组 但是部分也不录入 理论上 无论评估小组有没有录入 left join 都要返回左表ad
  • 微信小程序:日历模块页面

    文章目录 1 前言 2 功能需求 3 界面展示 4 部分代码展示 5 结语 完整项目下载 下载链接 1 前言 在制作背单词打卡小程序中 用户需要方便地查看历史学习信息 为了使页面美观并保持交互简洁 采用日历作为日期选择器是极为必要的 本指南
  • nginx中间件常见漏洞总结

    nginx中间件常见漏洞总结 1 中间件漏洞的概念 1 1 中间件 容器 服务器的基本概念辨析 2 Nginx 配置错误导致漏洞 2 1 uri 导致的CRLF注入漏洞 2 1 1 漏洞成因 2 1 2 利用方式 2 1 3 修改方案 2
  • 程序员必备技能-使用git把github的代码下载到本地使用

    在代码的学习过程中 难免需要看下github上的优秀项目 或者在参加某个培训班的时候 老师的示例代码存放在github中 想在本地的IDE中跑跑试试 这篇文章提供一个简单的获取github项目在自己的IDE中打开的方法 目录 一 获取git
  • STM32F103ZET6【HAL开发】STM32CUBEMX------3.2高级定时器输出带死区的互补PWM

    一 STM32F103只有高级定时器才能输出互补的PWM波形 定时器的对应IO如下表 二 下面以TIM1为例 演示三对带死区的PWM波形在STM32CUBEMX里面的配置 TIM1 CH1 TIM1 CH1N TIM1 CH2 TIM1 C
  • [matlab]10种经典的时间序列预测模型

    matlab 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法 它们是 自回归 AR 移动平均线 自回归移动平均线 自回归积分移动平均线 ARIMA 季节性自回归积分移动平均线 SARIMA 具有外生回归量的季节
  • R语言3.11 因子分析因子旋转

    因子旋转 目的 寻找每个主因子的实际意义 如果各主因子的典型代表变量不突出 就需要进行旋转 使因子载荷矩阵中载荷的绝对值向0和1两个方向分化 方法 正交旋转Varimax 最大方差正交旋转 斜交旋转Promax Fa2 factanal X
  • 集成学习-Adaboost

    Author 鲁力 Email jieyuhuayang foxmail com Datawhale Adaboost 算法简介 集成学习 ensemble learning 通过构建并结合多个学习器 learner 来完成学习任务 通常可
  • Keras和Tensorflow(CPU)安装、Pytorch(CPU和GPU)安装以及jupyter使用虚拟环境

    微信公众号 数学建模与人工智能 Keras和Tensorflow CPU 安装 Pytorch CPU和GPU 安装 Keras和Tensorflow CPU 安装 一 安装我用的是清华大学源 二 深度学习模型保存与加载 三 错误 Tens
  • matlab中的掩膜抠图

    改进版 矩阵中的循环操作非常耗时 so 用矩阵逻辑与操作替代for循环 one ones s img 1 s img 2 segM segM uint8 one for i 1 s img 1 for j 1 s img 2 if segM
  • 微信小程序16进制颜色码

    颜色码http www w3school com cn cssref css colornames asp
  • 时间序列算法理论及python实现(2-python实现)

    如果你在寻找时间序列是什么 如何实现时间序列 那么请看这篇博客 将以通俗易懂的语言 全面的阐述时间序列及其python实现 时间序列算法理论详见我的另一篇博客 时间序列算法理论及python实现 知 青 博客园 5 Python实现ARIM
  • ChatGPT 最好的替代品

    前两天我们邀请了微软工程师为我们揭秘 ChatGPT 直播期间有个读者问到 有了 ChatGPT BERT 未来还有发展前途吗 我想起来最近读过的一篇博客 最好的 ChatGPT 替代品 不过聊到这俩模型 就不得不提到 Transforme
  • 堆排序(Heapsort)-- 高级排序算法

    1 堆排序 Heapsort 堆排序 Heapsort 是指利用堆这种数据结构所设计的一种排序算法 二叉堆本质上是一种完全二叉树 它分为两个类型 最大堆和最小堆 最大堆任何一个父节点的值 都大于等于它左右孩子节点的值 最小堆任何一个父节点的

随机推荐

  • 同步(Synchronous)和异步(Asynchronous)

    概念性 同步和异步通常用来形容一次方法调用 同步方法调用一旦开始 调用者必须等到方法调用返回后 才能继续后续的行为 异步方法调用更像一个消息传递 一旦开始 方法调用就会立即返回 调用者就可以继续后续的操作 而 异步方法通常会在另外一个线程中
  • idea设置默认maven

    idea修改默认maven配置 方法一 不推荐 打开project default xml文件 在其中加入如下几行配置 代码如下 保存修改之后新建一个maven项目查看效果 方法二 新增Projects Settings 方法一 不推荐 需
  • 线性滤波器&非线性滤波器

    前言 采用线性滤波和非线性滤波是在空间域上处理图像最常用的滤波方法 matlab在处理图像滤波方面拥有可调用的函数 十分便利 我们可以根据自己的需要自行选择滤波方式对图像进行滤波 值得一提的是 图像锐化在某种程度上来说就是线性滤波 一 线性
  • emc re 整改 超标_EMC辐射骚扰超标如何整改?

    辐射骚扰是电脑 GPS导航等工作时向空间发射的一种电磁波干扰 这种干扰会影响其他电器特别是高灵敏度电器的正常工作 组成整机系统的主板 显示卡 开关电源 显示器 键盘 鼠标等都可能引起辐射骚扰超标 对于辐射骚扰通常用电磁场的大小来度量 其单位
  • 对泛型之不能协变(convariant)的理解,以及不能协变导致的问题

    1 何为协变 假设有一个接口 以及一个他的实现类 如下 接口为 public interface GenericsInterface void test 其实现类为 public class Type2 implements Generic
  • 6.ajax应用,ajax应用

    web tools ajax version 天气预报 value 北京 gt id disp weather gt ip地址查询 value 127 0 0 1 gt id disp iparea gt 手机归属查询 id disp mo
  • js利用google翻译接口把网页翻译成各国语言

    网页翻译为德语 Translate Page To German a href 网页翻译为德语 Translate Page To German a 网页翻译为西班牙语 Translate Page To Spanish a href a
  • [Mysql] 删除数据

    为了从一个数据表中删除 去掉 数据 可使用DELETE语句 语法 DELETE FROM表名 WHERE 条件 ORDER BY LIMIT row count DELETE FROM要求指定从中删除数据的表名 WHERE子句过滤要删除的行
  • 如何将li的前面那个圆点去掉

    只需要将 css样式 的 list style type 属性设置为none即可 代码如下 list style type none span style font size 18px span 下面的代码位于标签内 span style
  • 虚拟内存基本概念

    一 传统存储管理方式的特征 缺点 1 连续分配 单一连续分配 固定分区分配 动态分区分配 2 非连续分配 基本分页存储管理 基本分段存储管理 基本段页式存储管理 3 特点 很多暂时用不到的数据也会长期占用内存 导致内存利用率不高 一次性 作
  • JS基础_js一元运算符

    1 什么是一元运算符 只对一个操作数操作就能改变当前操作数的值的运算符号 2 一元运算符有哪些 2 1 正号 和负号 举例
  • CP4.矩阵的LU分解

    LU分解 将矩阵A分解成的形式 称作矩阵LU分解 L代指下三角矩阵 U代指上三角矩阵 首先用到的是前面讲过的消元法 以下为例子 通过消元操作 最后矩阵A变成了一个上三角矩阵U 那么只要上式左乘一个 就可以转化为 这里的就是L矩阵了 所以 也
  • javac编译时出现GBK报错(错误:编码GBK的不可映射字符)

    javac编译时出现GBK报错 错误 编码GBK的不可映射字符 一 这里列出我遇到的三种情况 代码格式分别为 ANSI UTF 8 无BOM的UTF 8 这里我用的是notepad 进行编写 ANSI格式 首先我们先创建一个 java源文件
  • 说说JUC三个类:CountDownLatch,CyclicBarrier和Semaphore

    目录 CountDownLatch CyclicBarrier Semaphore 总结 在JUC中 有三个工具类来辅助我们进行并发编程 分别是 CountDownLatch CyclicBarrier和Semaphore CountDow
  • 使用vue-cli来搭建vue项目

    使用vue cli来搭建vue项目 一 创建所需要的文件夹 二 安装vue cli 三 使用脚手架vue cli 2 X版 来构建项目 前提 搭建好NodeJS环境 一 创建所需要的文件夹 1 首先在Node js的文件夹里面建上 temp
  • S71200外围设备接线-输入接线

    S71200外围设备接线 输入端子接线 含NPN和PNP 传感器接线 作为一个PLC的初学者 我觉得第一件事请并不是学习什么TIA Portal软件或者编程指令 而是了解PLC的系统参数和外围设备接线 上面的一张文章 我通过图文的方式简单讲
  • 问题 E: 十进制整数转二进制

    十进制整数转二进制的方法是 除以2 取出余数 商继续除以2 直到得到0为止 将取出的余数逆序即可得到对应的二进制数的各位 例如 22转二进制的计算过程 22 2 11 余0 11 2 5 余 1 5 2 2 余 1 2 2 1 余 0 1
  • 小程序获取用户信息实现一键登录

    文章目录 旧版获取用户信息实现登录流程 login页面代码 个人中心页面代码 全局app vue代码 下面是小程序获取用户信息最新调整的方式 温馨提示 以下小程序登录方式只适用于2 27 1版本库以下使用 详情请看微信官方文档调整 旧版获取
  • python中的连续比较是什么_在python中提取连续行之间的差异

    你的例子表明你想要在一对线之间进行比较 这与将其定义为line n 1 line n 不同 后者将给出5个结果 而不是3个 在 结果也取决于你认为的差异 它是位置性的 还是仅仅基于奇数行中缺失的字母 还是两者的差异都适用 例如 boat t
  • 优酷 YouTube Twitter及JustinTV视频网站架构设计笔记

    本文是整理的关于优酷 YouTube Twitter及JustinTV几个视频网站的架构或笔记 对于不管是视频网站 门户网站或者其它的网站 在架构上都有一定的参考意义 毕竟成功者的背后总有值得学习的地方 虽然有些文章的发表时间有点久了 但是