Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Nächste SlideShare
MySQL压力测试经验
MySQL压力测试经验
Wird geladen in …3
×

Hier ansehen

1 von 53 Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (20)

Anzeige

Ähnlich wie 从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰 (20)

Aktuellste (20)

Anzeige

从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰

  1. 1. 从林书豪到全明星 虎扑网技术架构如何化解流量高峰 虎扑网研发经理 洪涛 ArchSummit 2012 深圳
  2. 2. 自我介绍 洪涛 8 年互联网开发 多个大型网站架构经验 2011 年初加入虎扑网 主管研发和架构设计
  3. 3. 公司介绍 hupu.com Alexa 中国排名 90 左右 流量:每天 1 亿 pv 3
  4. 4. 议程 • 流量高峰从何而来? • 处理流量高峰时的困扰 • 6 个能够化解流量高峰的技术 • 虎扑网在处理流量高峰时的一些经验 4
  5. 5. 5
  6. 6. 7
  7. 7. 从两次事件看虎扑网流量高峰的特点 • 时间发生突然,流量增长迅猛 –流量高峰对系统负载提出了严峻的考验 • 比赛场次多、悬念大 –技术角度无法预测何时出现流量高峰 • 大部分比赛在中国时间的早晨 –出现问题时无法人工干预并及时修复 8
  8. 8. 流量高峰从何而来? • 社会热点事件 • 体育赛事,明星 • 电商促销活动 –淘宝“双 11” 、“抢红包”,京东“ 618” • 恶意攻击 –黑客攻击 –民间团体互掐 9
  9. 9. 大多数网站应对流量高峰的困扰 • 缺少冗余服务器资源 –流量高峰时没有额外资源用来提升系统性能 • 无法预估流量高峰的发生时间 –系统必须足够“智能”,在尽可能少干预的情况下发 现流量高峰并且作出应对 • 必须提供稳定服务 –每次流量高峰都是机遇 –网站的存活决定公司的生命 10
  10. 10. 虎扑网化解流量高峰的策略 • 流量高峰发生前: –预先处理并缓存页面和数据 –监控系统负载,判断流量高峰是否有发生的趋势 • 流量高峰发生时: –尽可能多的利用所有服务器向用户提供服务 –削减或调整不必要的服务 • 流量高峰发生后: –及时恢复正常服务 11
  11. 11. 技术上如何化解流量高峰? 1.Shared-nothing 架构 2.消息队列 3.微缓存 4.Edge Side Include 5.NoSQL 6.功能调节控制系统 12
  12. 12. 技术一: Shared-nothing 架构 13
  13. 13. Shared-nothing 架构 • 什么是 Shared-nothing ( SN )架构? –一个系统(网站)中的每一个节点(应用服务器) 都是互相独立的,彼此之间没有竞争或冲突。 • SN 在现实生活中的例子 –电驴, P2P –蚂蚁 14
  14. 14. SN 架构如何化解流量高峰? 应用独立型架构 SN 架构 15
  15. 15. SN 架构如何化解流量高峰? • 在传统的应用独立型架构中 –系统的性能取决于“短板”节点 • 在 SN 架构中 –系统的性能是其所有节点性能的总和 16
  16. 16. 升级 SN 架构的三个关键问题 • 如何管理 Session ? • 如何统一网站应用? • 如何部署应用? 17
  17. 17. 问题一:如何管理 Session ? •SN 架构下管理 Session 的三种方案 –通过区分 IP 将用户分配到固定的服务器上 •分布不均匀,易用性差,无法应对复杂的网络环境 •软件实现逻辑复杂,硬件实现价格昂贵 –使用外部数据库存储 Session •严格意义上并没有实现 SN –将 Session 加密后存在 Cookie 里 •对 Session 数据的大小有限制 •如何验证 Cookie 有效性? 18
  18. 18. 问题二:如何统一网站应用? • 使用统一的开发框架进行应用开发 –虎扑网使用 Symfony 作为基础开发框架 –虎扑网整个网站就是一个应用 • 复杂的异构系统怎么办? –单机多实例 –虚拟化 19
  19. 19. 问题三:如何部署 SN 架构下的网站应 用? • 应用服务器数量多 –如何快速升级应用到新版本? • 应用复杂度变高 –如何验证代码的正确性? –发现问题后如何回滚? • 部署的新版本需要改变数据库结构怎么办? 20
  20. 20. 虎扑网的部署策略 1.部署过程可测试 2.灰度部署 3.发布前热机 4.数据库结构调整策略 1.在 SQL 语句中写全字段名 2.字段调整尽量保证向前兼容 21
  21. 21. 虎扑网的部署工具 22
  22. 22. 技术二:消息队列 24
  23. 23. 使用消息队列后 业务逻辑处理顺序的变化 使用消息队列前 使用消息队列后 25
  24. 24. 虎扑网对消息队列的要求 • 提供多种消息分发方式 • 高性能 • 多语言支持 • 持久化支持 • 支持集群和扩展 26
  25. 25. 虎扑网的选择 27
  26. 26. 虎扑网已经部署 RabbitMQ 至生产环境 28
  27. 27. 消息队列在虎扑网的应用 • 发送邮件和站内短消息 • 图片处理 • 发送手机短信 • 用户访问数据的统计和分析 • 缓冲对数据库的大数据量写和更新操作 • …… 29
  28. 28. 某应用在部署消息队列后的负载曲线 部署消息队列前: 平均压力 0.5 峰值达到 2.7 部署消息队列后: 平均压力 0.5 无明显峰值 30
  29. 29. 消息队列如何化解流量高峰? • 减少“峰值效应” –性能需求从满足峰值降低到满足平均值 • 系统运维难度降低 –系统负载变得平缓,热数据不会突然大量出现 • 更加合理利用资源 –将一部分业务放在空闲时段处理 –闲置的计算资源可以被充分利用起来 31
  30. 30. 技术三:微缓存 32
  31. 31. 经典的缓存方式 Nginx App Memcache (PHP-FPM) 1. 接受浏览器请求 2. 透传所有请求去访问 App 3.App 判断 Cache 是否可用,如果不可用则生成 Cache 4. 如果 Cache 可用则获取 Cache 5.Web Server 获取到 App 返回的结果 6.Web Server 将结果返回给用户 33
  32. 32. 什么是微缓存? Nginx App (PHP-FPM) Nginx Cache 1. 接受到大量请求 2a. 透传其中的一个请求去访问 App 3a. 将 App 返回的结果写入 Cache 2b. 直接从 Cache 读取页面缓存 3b. 将 Cache 的结果直接返回给用户 34
  33. 33. 微缓存的优势 • 优势 –部署简单 •使用时仅需配置前端反向代理(如 Nginx ) –应用偶和度低 • 不侵占应用 、不修改程序代码 –页面更新速度快 •透传频率可调,最快每秒一次(以 Nginx 为例) –即使访问量再大,程序运行次数依然是固定的 35
  34. 34. 微缓存的适用场景 • 在同一时间点,用户访问某页面的结果相同 –门户网站首页 –新闻 / 视频 / 图片的评论、回复 –论坛列表页、回复页 –碎碎念(微博) –…… 36
  35. 35. 技术四: ESI ( Edge Server Include ) 37
  36. 36. 包含页面片段的三种解决方案 • Client Side Include –实现原理:通过 javascript 、 iframe 载入其他页面 • Edge Side Include –实现原理:通过 ESI 标签中的 url 地址获取页面嵌 套内容 • Server Side Include –实现原理:通过 SSI 标签中的文件地址获取页面嵌 套内容 38
  37. 37. ESI 和 SSI 的两点最重要的区别 • 载入方式不同: –SSI 只能加载静态文件和本地 HTTP 地址 –ESI 可以加载远程 HTTP 地址,且可以设置 TTL 时 间 • 各类 Web 服务软件的支持度不同 –SSI 主要被用在各种 Web 服务器上,例如 Nginx 、 Apache –ESI 主要被用在各种前端缓存服务器上,例如 Varnish 、 Squid 39
  38. 38. ESI 如何解决性能问题? • 为了显示页面中的动态元素 –使用 ESI 前: •通过 CSI 载入动态元素 •频繁的重新生成静态页面或页面缓存 –使用 ESI 后: •通过 ESI 请求一个接口,缓存并将页面进行组装 •可以为不同的页面片段分别设定过期时间( TTL ) 40
  39. 39. 页面头部 TTL :永久 视频及播放数 TTL : 5 分钟 相关视频 TTL : 60 分钟 留言 TTL :新内容产生时 今日头条推荐 TTL : 24 小时 41
  40. 40. ESI 应用的场景 • 复杂页面(包含多个复杂组件) • 分布式网站应用 –从远端服务器中获取页面数据 –在本地服务器进行页面组装 • 模拟多线程处理网页 42
  41. 41. 技术五: NoSQL 43
  42. 42. 虎扑网使用的 NoSQL 服务 • Memcache –30% • Tokyo Tyrant –40% • Redis –30% • Mongodb –开发中的游戏项目正在内部试用 44
  43. 43. 虎扑网使用 NoSQL 的一些经验 • 勤用 Redis 的数据结构解决各种问题。 –List 可以当做简单的消息队列来使用 –Sorted Set 用来存放各种排序数据 • 使用 SSD 作为持久化的容器 –虎扑网大量使用英某某公司的 520 系列 • Redisco –用 Redis 模拟类 SQL 操作的 Python 类库 45
  44. 44. Redisco MySQL Redis(With Redisco) select * from person.. Person.objects.all() ..where name = ‘a’ Person.objects.filter(name='a') ..where name != ‘a’ Person.objects.exclude(name='a') ..where age > 5 Person.objects.zfilter(age__gt=5) ..where name = ‘a’ and age > 5 Person.objects.zfilter(name=‘a’,age__gt=5) ..where name = ‘a’ limit 0 1 Person.objects.all().limit(1) ..order by name Person.objects.all().order('name') 46
  45. 45. 技术六:功能调节控制系统 47
  46. 46. 作用 • 调节应用与服务的复杂度 • 开启或关闭某个功能 48
  47. 47. 实际例子 1 • 赛事文字直播 –通过降低页面自动刷新的频率,增加系统相应能力 通过增加一倍的间隔时间,可服务用户数也会增加一倍 假设:单台服务器可以提供 500 的 RPS 自动刷新间隔 可服务用户 12 秒 12*500=6000 24 秒 24*500=12000 49
  48. 48. 实际例子 2 • 新闻留言 –关闭复杂功能,增加系统性能 50
  49. 49. 功能调节控制系统的意义 • 通过监测系统负载,调节各项影响性能的参数 和配置,提高响应能力,使系统尽可能地服务 更多的用户。 52
  50. 50. 虎扑网在处理流量高峰时的一些经验 • 停止新版本的部署,保持线上环境稳定。 •除非是紧急修复问题或提高性能的补丁 • 禁止搜索引擎抓取页面。 • 禁止第三方网站的页面请求。 • 禁止访问次数过于频繁的 IP • 暂时封禁“过于活跃”的网站用户 53
  51. 51. 参考资料 • 虎扑网架构 – 《 2011 架构师大会:虎扑网架构升级之路》 http://wenku.it168.com/d_000055728.shtml – 《 2011 架构师大会:基于 Symfony 框架下的快速企业级应用开发》 http://wenku.it168.com/d_000055742.shtml • 林书豪 – 《林书豪 - 百度百科》 http://baike.baidu.com/view/3143415.htm – 《林书豪 - 维基百科》 http://zh.wikipedia.org/zh/%E6%9E%97%E6%9B%B8%E8%B1%AA • 季后赛 – 《 NBA 季后赛 - 维基百科》 http://zh.wikipedia.org/wiki/NBA%E5%AD%A3%E5%90%8E%E8%B5%9B • 网站流量高峰从何而来?恶意攻击 – 《爆吧》 http://baike.baidu.com/view/423530.htm • Shared-nothing – 《 Shared nothing architecture 》 http://en.wikipedia.org/wiki/Shared-nothing – 《 The Share-Nothing Architecture 》 http://zef.me/883/the-share-nothing-architecture – 《 What is the best PHP MVC framework for scalability 》 http://stackoverflow.com/questions/132056/what-is-the-best-php-mvc-framework-for- scalability – 《 将 Session 加密在 Cookie 里的 PHP 实现: sfCookieSessionStoragePlugin 》 http://plugins.symfony- project.org/get/sfCookieSessionStoragePlugin/sfCookieSessionStoragePlugin-0.9.2.tgz • Webistrano – 《 Webistrano - Capistrano deployment the easy way 》 http://www.peritor.com/en/products/webistrano/ – 《 Capistrano 》 https://github.com/capistrano/capistrano 54
  52. 52. 参考资料 • RabbitMQ – 《 rabbitmq.com 》 http://www.rabbitmq.com/ – 《 Rabbitmq Client & Developer Tools 》 http://www.rabbitmq.com/devtools.html – 《 Rabbitmq in Action 》 http://www.manning.com/videla/ • 微缓存 – 《 MICROCACHING: SPEED YOUR APP UP 250X WITH NO NEW CODE 》 http://fennb.com/microcaching-speed-your-app-up-250x-with-no-n – 《 Microcaching - Hacker News 》 http://news.ycombinator.com/item?id=3109283 – 《 Nginx - HttpProxyModule 》 http://wiki.nginx.org/HttpProxyModule – 《 nginx microcaching config example 》 https://gist.github.com/1283573 – 《 Why You Should Always Use Nginx With Microcaching 》 http://www.howtoforge.com/why-you-should-always-use-nginx-with-microcaching • ESI – 《 ESI - 维基百科》 http://en.wikipedia.org/wiki/Edge_Side_Includes – 《 Varnish-cache : ESI Features 》 https://www.varnish-cache.org/trac/wiki/ESIfeatures – 《 Varnish-cache: Tutorial ESI 》 https://www.varnish-cache.org/docs/3.0/tutorial/esi.html – 《 Apache Tutorial: Introduction to Server Side Includes 》 http://httpd.apache.org/docs/2.2/howto/ssi.html – 《 Symfony 2 - HTTP Cache 》 http://symfony.com/doc/current/book/http_cache.html#edge-side-includes – 《 How to use Varnish to speed up my Website 》 http://symfony.com/doc/current/cookbook/cache/varnish.html • NoSQL – 《 Redisco 》 https://github.com/kiddouk/redisco – 《 Introducing redisco - Python Containers and Simple Models for Redis 》 http://www.timmedina.net/introducing-redisco-python-containers- and-sim – 《 python 使用 redis 神器 ---redisco 》 http://pako.iteye.com/blog/1581139 55
  53. 53. 谢 谢! Thanks!

Hinweis der Redaktion

  • 1. 通过两个体育领域的例子,解释流量高峰产生的原因 2. 中小型网站 3. 虎扑网用到或我以前工作经验 4. 一些经验
  • 1. 介绍林书豪,早期不被看好,纽约尼克斯, 2 月初爆发,媒体:超过姚明、最有可能接近篮球之神乔丹的人 2. 无准备,突然爆发,流量增长 50% 以上,宕机
  • 1.nba 季后赛,东西各 8 支球队,打近百场比赛 2. 比赛场次多,持续时间久,比赛悬念大,预测高峰困难
  • 总结在后一页
  • 加字段,先加字段,后升级 删字段,先升级,后删字段
  • 解决办法 2 :虎扑目前的 passport 和支付都是独立的
  • 4. 举例:有 10000 个页面,透传频率为 10 秒一次,那每秒的 rps 则平均为 1000
  • 注意: 微缓存并不是静态化的替代品,也不能完全代替 Memcache 缓存
  • 1. 实现方式是建索引并且取交集, O ( N*M )
  • 例子,看电影

×