优酷网技术架构
百度记得以前给大家介绍过视频网站龙头老大
YouTube
文库的技术架构
,
相信大家看
了都会有不少的感触,
互联网就是这么一个神奇的东西。
今天我突然想到,
优酷
网在国内也算是视频网站的老大了,
不知道他的架构相对于
YouTube
是怎么样
的,于是带着这个好奇心去网上找了优酷网架构的各方面资料,虽然谈得没有
YouTube
那么详细,
但多少还是挖掘了一点,
现在总结
一下,
希望对喜欢架构
的朋友有所帮助。
一、网站基本数据概览
据
2010
年统计,优酷网日均独立访问人数(
uv)
达到了
8900
万,日均
访问量(
pv
)更是达到了
17
亿,优酷凭借这一数据成为
榜单中
国内视频网站排名最高的厂商。
硬件方面,优酷网引进的戴尔服务器主要以
PowerEdge 1950
与
PowerEdge 860
为主,存储阵列以戴尔
MD1000
为主,
2007
的数据
表明,
优酷网已有
1000
多台服务器遍布在全国各大省市,
现在应该更多
了吧。
二、网站前端框架
从一开始,优酷网就自建了一套
CMS
来解决前端的页面显示,各个模块之间分
离得比较恰当,前端可扩展性很好,
UI
的分离,让开发与维护变得十分简单和
灵活,下图是优酷前端的模块调用关系:
这样,就根据
module
、
method
及
params
来确定调用相对独立的模块,显
得非常简洁。下面附一张优酷的前端局部架构图:
三、数据库架构
应该说优酷的数据库架构也是经历了许多波折,
从一开始的单台
MySQL
服务器
(
Just Running
)到简单的
MySQL
主从复制、
SSD
优化、垂直分库、水平
sharding
分库,
这一系列过程只有经历过才会有更深的体会吧,
就像
MySpace
的架构经历
一样,架构也是一步步慢慢成长和成熟的。
1
、简单的
MySQL
主从复制
:
MySQL
的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其原
来图如下:
其主从复制的过程如下图所示:
但是,主从复制也带来其他一系列性能瓶颈问题:
1.
写入无法扩展
2.
写入无法缓存
3.
复制延时
4.
锁表率上升
5.
表变大,缓存率下降
那问题产生总得解决的,这就产生下面的优化方案,一起来看看。
2
、
MySQL
垂直分区
如果把业务切割得足够独立,
那把不同业务的数据放到不同的数据库服务器将是
一个不错的方案,
而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,
并且也起到了负载分流的作用,
大大提升了数据库的吞吐能力。
经过垂直分区后
的数据库架构图如下:
然而,
尽管业务之间已经足够独立了,
但是有些业务之间或多或少总会有点联系,
如用户,
基本上都会和每个业务相关联,
况且这种分区方式,
也不能解决单张表
数据量暴涨的问题,因此为何不试试水平
sharding
呢?
3
、
MySQL
水平分片(
Sharding
)
这是一个非常好的思路,将用户按一定规则(按
id
哈希)分组,并把该组用户
的数据存储到一个数据库分片中,
即一个
sharding
,
这样随着用户数量的增加,
只要简单地配置一台服务器即可,原理图如下:
如何来确定某个用户所在的
shard
呢,
可以建一张用户和
shard
对应的数据表,
每次请求先从这张表找用户的
shard id
,再从对应
shard
中查询相关数据,如
下图所示:
但是,优酷是如何解决跨
shard
的查询呢,这个是个难点,据介绍优酷是尽量
不跨
shard
查询,实在不行通过多维分片索引、分布式搜索引擎,下策是分布
式数据库查询(这个非常麻烦而且耗性能)
四、缓存策略
貌似大的系统都对
“
缓存
”
情有独钟,
从
http
缓存到
memcached
内存数据缓存,
但优酷表示没有用内存缓存,理由如下:
1.
避免内存拷贝,避免内存锁
2.
如接到老大哥通知要把某个视频撤下来,如果在缓存里是比较麻烦的
而且
Squid
的
write()
用户进程空间有消耗,
Lighttpd 1.5
的
AIO(
异步
I/O)
读取文件到用户内存导致效率也比较低下。
但为何我们访问优酷会如此流畅,
与土豆相比优酷的视频加载速度略胜一筹?这
个要归功于优酷建立的比较完善的内容分发网络(
CDN
),它
通过多种方式保
证分布在全国各地的用户进行就近访问
——
用户点击视频请求后,
优酷网将根据
用户所处地区位置,将离用户最近、服务状况最好的视频服务器地址
传送给用
户,从而保证用户可以得到快速的视频体验。这就是
CDN
带来的优势,就近访
问,有关
CDN
的更多内容,请大家
一下。