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