Web网站架构案例分析从优酷网浅谈大型网站的架构和优化    邱丹 qiudan@gmail.com          QCon 2009 北京
议   程 架构和环境 Web架构的8个特性 优酷网案例 网络优化
Part I   架构和环境 适应天上飞翔:鸟拥有翅膀 适应水里呼吸:鱼拥有鳃
通用架构的梦想 愿景:让拥有鳃和翅膀的人, 能够适应  各种环境
结果:被具体环境退化或替换
架构的进化和退化 进化原理 - 寻找最适合的 退化原理 - 简化不必要的
架构师的职责初始环境while(true){   寻找适应环境的结构; /*进化*/   简化结构; /*退化*/   环境改变;}
Part II Web环境下架构8个特性 可扩展 (Scalability) 在线升级 效率 可靠性 可理解 简单核心 独立性 模块化
Part III 网站架构案例关于优酷网(youku.com)- 中国大陆领先的在线视频网站
网站规模(08年9月)                      VV: 1.6亿+  万20000                                    日上传视频: 6万+15000100005000   0      ...
网站核心业务带来的架构特性可扩展(Scalability)在线升级效率可靠性可理解             √简单核心            √独立性模块化
创世纪:网站的初始环境 2006年下半年 500家视频网站存在,但规模都不大 部分互联网用户关注 巨大的用户潜力
拥抱开源世界
前端框架Browser : http://www..com/<module>/<method>/[params]Front Framework:hook(request){   module, method, params <-- reques...
简单前端框架满足的特性                 可扩展             √ 模块分离,多人开发      (Scalability) 无状态:前端可扩展      在线升级            √ 分层,UI分离    ...
CMS前端架构(局部)
从最简单开始 能run就行 时间:1个月 功能:核心功能                apache                            php   MySQL : 1   单点   搜索引擎:无   中间层:无
架构进化 访问量迅速增加,如何进化? 改进策略:增加缓存
缓存黄金原则:local, local ,local                            如何让数据更靠近CPU?                              让少部分常用数据就近存起来         CP...
HTTP缓存 – Squid/VarnishBrowser    Browser    Cache                    Cache                                     apache     ...
分布式内存key-value缓存                                         Cache                                          MemcachedBrowser  ...
大文件缓存(内部项目) Squid问题    write(),用户进程空间消耗 lighttpd1.5/AIO问题    AIO读取文件到用户内存导致效率低下 Sendfile()    ZeroCopy直接发送文件到网卡接口 不...
缓存满足的特性                可扩展             √√ 如果数据可缓存,效率增   (Scalability)  长明显           在线升级            √ 扩展性           效率 ...
新的问题?   数据库成为性能瓶颈                                    Cache                                     MemcachedBrowser          ...
扩展中间层 or 扩展数据库   VS
MySQL Replicationapacheapache apache    php    php           write     php                                  主/从复制   read c...
MySQL 主/从复制过程     UPDATE t1 ...     INSERT t2...     ALTER t1 ...                     binary log                          ...
数据复制带来的特性 读扩展 –         可扩展             √√√                (Scalability)  适合读多写少的业务                在线升级            √ 可靠性...
MySQL 复制问题 – 无法写扩展                                         写入无法扩展apacheapache                                   写入无法缓存 a...
现在该如何进化? MySQL Proxy/HSCALE ?  lighttpd同一作者,进度受限。  lua中间层,性能/可维护性/成熟度? MySQL 分区技术 ?  无法进行跨服务器分区。 MySQL集群(MySQL NDB Clus...
SSD优化MySQL   某单台MySQL服务器(intel-4core,16G, ssd)   单表8000万rows   1000+连接/秒   iowait < 1%
DB写入拆分               apache               apache                apache                   php                   php        ...
DB垂直分区     Part 1    Part 2   Part 3      其他        用户       消息其他              用户               消息        join            ...
DB水平分片(Sharding)                       Shard 1   其他                                 用户其他   用户       消息                 消息 ...
分片定位(1) 获取user 103的messages                                            Shard 1                   apache                   ...
Shard群的分组管理Server1                        Server2 shard_db1                      shard_db3  shard1     shard2   shard3    ...
如何处理跨shard的查询? 上策:不面对 中策:多维分片索引、分布式搜索引擎 下策:分布式数据库查询
良好的扩展性                                 Cache                                  MemcachedBrowser                          pr...
分区带来的特性 分区并非必要     可扩展             √√√√ 增加管理复杂度    (Scalability)             在线升级            √             效率           ...
Part IV 网络吞吐量优化 吞吐量同响应速度的不同 进程切换开销    保持当前cpu寄存器(eax,ebx,esi,edi,...)    恢复新进程cpu寄存器(eax,ebx,esi,edi,...)    jmp new_...
事件驱动 select()问题    1024限制    位扫描 poll()问题    从内核到用户进程拷贝描述符数组 epoll(kernel 2.6+)    采用mmap()避免内核到用户进程的拷贝    libeven...
案例:Memcached 连接问题 PHP对memcached的tcp连  接开销 静态Hash扩展不方便
本地Memcached agent(内部项目)   基于libevent(封装epoll)   memcached兼容接口   本地unix domain socket   对Memcached长连接   Memcached动态任意扩...
Q&A
谢谢!
Upcoming SlideShare
Loading in...5
×

Youku arch qcon2009_beijing

462

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
462
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Youku arch qcon2009_beijing

  1. 1. Web网站架构案例分析从优酷网浅谈大型网站的架构和优化 邱丹 qiudan@gmail.com QCon 2009 北京
  2. 2. 议 程 架构和环境 Web架构的8个特性 优酷网案例 网络优化
  3. 3. Part I 架构和环境 适应天上飞翔:鸟拥有翅膀 适应水里呼吸:鱼拥有鳃
  4. 4. 通用架构的梦想 愿景:让拥有鳃和翅膀的人, 能够适应 各种环境
  5. 5. 结果:被具体环境退化或替换
  6. 6. 架构的进化和退化 进化原理 - 寻找最适合的 退化原理 - 简化不必要的
  7. 7. 架构师的职责初始环境while(true){ 寻找适应环境的结构; /*进化*/ 简化结构; /*退化*/ 环境改变;}
  8. 8. Part II Web环境下架构8个特性 可扩展 (Scalability) 在线升级 效率 可靠性 可理解 简单核心 独立性 模块化
  9. 9. Part III 网站架构案例关于优酷网(youku.com)- 中国大陆领先的在线视频网站
  10. 10. 网站规模(08年9月)  VV: 1.6亿+ 万20000  日上传视频: 6万+15000100005000 0 VV(播放数)/日 PV/日 Source: iUserTracker 2008年9月
  11. 11. 网站核心业务带来的架构特性可扩展(Scalability)在线升级效率可靠性可理解 √简单核心 √独立性模块化
  12. 12. 创世纪:网站的初始环境 2006年下半年 500家视频网站存在,但规模都不大 部分互联网用户关注 巨大的用户潜力
  13. 13. 拥抱开源世界
  14. 14. 前端框架Browser : http://www..com/<module>/<method>/[params]Front Framework:hook(request){ module, method, params <-- request.url response = module.php->method(params) echo reponse}module1.php:method1(params){ return “<p>hello, world!</p>”}
  15. 15. 简单前端框架满足的特性 可扩展 √ 模块分离,多人开发 (Scalability) 无状态:前端可扩展 在线升级 √ 分层,UI分离 效率 可靠性 √ 没有采用第三方Web框架 可理解 √√ 自建CMS解决掉大部分页 简单核心 √√ 面显示 独立性 √ 模块化 √
  16. 16. CMS前端架构(局部)
  17. 17. 从最简单开始 能run就行 时间:1个月 功能:核心功能 apache php MySQL : 1 单点 搜索引擎:无 中间层:无
  18. 18. 架构进化 访问量迅速增加,如何进化? 改进策略:增加缓存
  19. 19. 缓存黄金原则:local, local ,local  如何让数据更靠近CPU?  让少部分常用数据就近存起来 CPU一级缓存 CPU二级缓存 内存 缓存数据 空闲槽 硬盘 LAN WAN数据仅供参考
  20. 20. HTTP缓存 – Squid/VarnishBrowser Browser Cache Cache apache apache HTTP apache proxy Reverse php php php Proxy HTTP Response: Cache-Control: max-age=3600, must-revalidate Expires: Fri, 28 Oct 2007 14:19:41 GMT Last-Modified: Mon, 27 Jun 2007 05:21:17 GMT
  21. 21. 分布式内存key-value缓存 Cache MemcachedBrowser proxy Browser Cache apache apache Cache Cache apache proxy php php proxy php Memcached 协议: 存:set key1 0 0 3rnfoorn --> STOREDrn 取:get key1rn --> VALUE key1 0 3rnfoornENDrn
  22. 22. 大文件缓存(内部项目) Squid问题  write(),用户进程空间消耗 lighttpd1.5/AIO问题  AIO读取文件到用户内存导致效率低下 Sendfile()  ZeroCopy直接发送文件到网卡接口 不用内存做缓存  避免内存拷贝  避免锁
  23. 23. 缓存满足的特性 可扩展 √√ 如果数据可缓存,效率增 (Scalability) 长明显 在线升级 √ 扩展性 效率 √ 缓存命中率直接影响效率 可靠性 √√ 缓存技术容易被滥用 可理解 √√ 简单核心 √√√ 独立性 √ 模块化 √
  24. 24. 新的问题?  数据库成为性能瓶颈 Cache MemcachedBrowser proxy Browser Cache Cache apache apache Cache apache proxy proxy php php php
  25. 25. 扩展中间层 or 扩展数据库 VS
  26. 26. MySQL Replicationapacheapache apache php php write php 主/从复制 read cluster
  27. 27. MySQL 主/从复制过程 UPDATE t1 ... INSERT t2... ALTER t1 ... binary log 100 ... 101 UPDATE t1... 102 INSERT t2...主库 103 ALTER t1... 104 ... tcp 长连接 relay log 100 ... I/O thread 101 UPDATE t1... UPDATE t1 ... 102 INSERT t2...丛库 INSERT t2... ALTER t1 ... 103 ALTER t1... SQL thread 104 ...
  28. 28. 数据复制带来的特性 读扩展 – 可扩展 √√√ (Scalability) 适合读多写少的业务 在线升级 √ 可靠性 效率 √ 简单 可靠性 √√√ 复制延时 < 0.1s 可理解 √√ 简单核心 √√√√ 并非万灵金丹 独立性 √ 复制延时恶化 模块化 √
  29. 29. MySQL 复制问题 – 无法写扩展  写入无法扩展apacheapache  写入无法缓存 apache php  复制延时 php php 100 write 100w  锁表率上升  表变大,缓存率下降 1000 read read cluster 100w 100w 100w 100w 250r 250r 250r 250r
  30. 30. 现在该如何进化? MySQL Proxy/HSCALE ? lighttpd同一作者,进度受限。 lua中间层,性能/可维护性/成熟度? MySQL 分区技术 ? 无法进行跨服务器分区。 MySQL集群(MySQL NDB Cluster) ? 厚重的瑞士军刀,层面过多,性能/复杂度? 没有银弹方案。 ?
  31. 31. SSD优化MySQL 某单台MySQL服务器(intel-4core,16G, ssd) 单表8000万rows 1000+连接/秒 iowait < 1%
  32. 32. DB写入拆分 apache apache apache php php phpread cluster read cluster
  33. 33. DB垂直分区 Part 1 Part 2 Part 3 其他 用户 消息其他 用户 消息 join join
  34. 34. DB水平分片(Sharding) Shard 1 其他 用户其他 用户 消息 消息 Shard 2 其他 用户 按user_id分片 消息
  35. 35. 分片定位(1) 获取user 103的messages Shard 1 apache apache apache php php php (2) user 103在哪? (3) shard 2 Sharding Manager Shard 2 目录 User_ID Shard_ID 101 1 102 1 103 2
  36. 36. Shard群的分组管理Server1 Server2 shard_db1 shard_db3 shard1 shard2 shard3 shard7 shard8 shard9 shard_db2 shard_db4 shard4 shard5 shard6 shard10 shard11 shard12
  37. 37. 如何处理跨shard的查询? 上策:不面对 中策:多维分片索引、分布式搜索引擎 下策:分布式数据库查询
  38. 38. 良好的扩展性 Cache MemcachedBrowser proxy Browser Cache Cache apache apache Cache apache proxy proxy php php php
  39. 39. 分区带来的特性 分区并非必要 可扩展 √√√√ 增加管理复杂度 (Scalability) 在线升级 √ 效率 √ 可靠性 √√√√ 可理解 √√√ 简单核心 √√√√ 独立性 √ 模块化 √
  40. 40. Part IV 网络吞吐量优化 吞吐量同响应速度的不同 进程切换开销  保持当前cpu寄存器(eax,ebx,esi,edi,...)  恢复新进程cpu寄存器(eax,ebx,esi,edi,...)  jmp new_eip fork/pthread问题  大量进程切换开销  寄存器越多效率越低  用vmstat查看cs Apache prefork和MySQL的pthread  大量进程切换开销过大
  41. 41. 事件驱动 select()问题  1024限制  位扫描 poll()问题  从内核到用户进程拷贝描述符数组 epoll(kernel 2.6+)  采用mmap()避免内核到用户进程的拷贝  libevent封装epoll/kqueue  epoll推动当今Web  memcached/lighttpd/nginx/squid/haproxy
  42. 42. 案例:Memcached 连接问题 PHP对memcached的tcp连 接开销 静态Hash扩展不方便
  43. 43. 本地Memcached agent(内部项目) 基于libevent(封装epoll) memcached兼容接口 本地unix domain socket 对Memcached长连接 Memcached动态任意扩展(Consistent hashing) php php memcached unix domain socket agent memcached tcp连接池
  44. 44. Q&A
  45. 45. 谢谢!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×