从林书豪到全明星虎扑网技术架构如何化解流量高峰       虎扑网研发经理 洪涛      ArchSummit 2012 深圳
自我介绍洪涛8 年互联网开发多个大型网站架构经验2011 年初加入虎扑网主管研发和架构设计
公司介绍hupu.comAlexa 中国排名 90 左右流量:每天 1 亿 pv                   3
议程• 流量高峰从何而来?• 处理流量高峰时的困扰• 6 个能够化解流量高峰的技术• 虎扑网在处理流量高峰时的一些经验                     4
5
7
从两次事件看虎扑网流量高峰的特点• 时间发生突然,流量增长迅猛–流量高峰对系统负载提出了严峻的考验• 比赛场次多、悬念大–技术角度无法预测何时出现流量高峰• 大部分比赛在中国时间的早晨–出现问题时无法人工干预并及时修复             ...
流量高峰从何而来?• 社会热点事件• 体育赛事,明星• 电商促销活动 –淘宝“双 11” 、“抢红包”,京东“ 618”• 恶意攻击 –黑客攻击 –民间团体互掐                             9
大多数网站应对流量高峰的困扰• 缺少冗余服务器资源–流量高峰时没有额外资源用来提升系统性能• 无法预估流量高峰的发生时间–系统必须足够“智能”,在尽可能少干预的情况下发 现流量高峰并且作出应对• 必须提供稳定服务–每次流量高峰都是机遇–网站的存...
虎扑网化解流量高峰的策略• 流量高峰发生前:–预先处理并缓存页面和数据–监控系统负载,判断流量高峰是否有发生的趋势• 流量高峰发生时:–尽可能多的利用所有服务器向用户提供服务–削减或调整不必要的服务• 流量高峰发生后:–及时恢复正常服务    ...
技术上如何化解流量高峰?1.Shared-nothing 架构2.消息队列3.微缓存4.Edge Side Include5.NoSQL6.功能调节控制系统                      12
技术一: Shared-nothing 架构                         13
Shared-nothing 架构• 什么是 Shared-nothing ( SN )架构? –一个系统(网站)中的每一个节点(应用服务器)  都是互相独立的,彼此之间没有竞争或冲突。• SN 在现实生活中的例子 –电驴, P2P –蚂蚁  ...
SN 架构如何化解流量高峰?应用独立型架构    SN 架构                   15
SN 架构如何化解流量高峰?• 在传统的应用独立型架构中 –系统的性能取决于“短板”节点• 在 SN 架构中 –系统的性能是其所有节点性能的总和                      16
升级 SN 架构的三个关键问题• 如何管理 Session ?• 如何统一网站应用?• 如何部署应用?                       17
问题一:如何管理 Session ?•SN 架构下管理 Session 的三种方案 –通过区分 IP 将用户分配到固定的服务器上  •分布不均匀,易用性差,无法应对复杂的网络环境  •软件实现逻辑复杂,硬件实现价格昂贵 –使用外部数据库存储 S...
问题二:如何统一网站应用?• 使用统一的开发框架进行应用开发–虎扑网使用 Symfony 作为基础开发框架–虎扑网整个网站就是一个应用• 复杂的异构系统怎么办?–单机多实例–虚拟化                          19
问题三:如何部署 SN 架构下的网站应        用?• 应用服务器数量多–如何快速升级应用到新版本?• 应用复杂度变高–如何验证代码的正确性?–发现问题后如何回滚?• 部署的新版本需要改变数据库结构怎么办?                ...
虎扑网的部署策略1.部署过程可测试2.灰度部署3.发布前热机4.数据库结构调整策略1.在 SQL 语句中写全字段名2.字段调整尽量保证向前兼容                   21
虎扑网的部署工具           22
技术二:消息队列           24
使用消息队列后业务逻辑处理顺序的变化使用消息队列前   使用消息队列后                    25
虎扑网对消息队列的要求• 提供多种消息分发方式• 高性能• 多语言支持• 持久化支持• 支持集群和扩展                  26
虎扑网的选择         27
虎扑网已经部署 RabbitMQ 至生产环境                         28
消息队列在虎扑网的应用• 发送邮件和站内短消息• 图片处理• 发送手机短信• 用户访问数据的统计和分析• 缓冲对数据库的大数据量写和更新操作• ……                      29
某应用在部署消息队列后的负载曲线          部署消息队列前:          平均压力 0.5          峰值达到 2.7          部署消息队列后:          平均压力 0.5          无明显峰值 ...
消息队列如何化解流量高峰?• 减少“峰值效应” –性能需求从满足峰值降低到满足平均值• 系统运维难度降低 –系统负载变得平缓,热数据不会突然大量出现• 更加合理利用资源 –将一部分业务放在空闲时段处理 –闲置的计算资源可以被充分利用起来    ...
技术三:微缓存          32
经典的缓存方式    Nginx       App          Memcache                (PHP-FPM)1. 接受浏览器请求2. 透传所有请求去访问 App3.App 判断 Cache 是否可用,如果不可用则生...
什么是微缓存?    Nginx        App                 (PHP-FPM)     Nginx     Cache1. 接受到大量请求 2a. 透传其中的一个请求去访问 App 3a. 将 App 返回的结果写入...
微缓存的优势• 优势 –部署简单  •使用时仅需配置前端反向代理(如 Nginx ) –应用偶和度低  • 不侵占应用 、不修改程序代码 –页面更新速度快  •透传频率可调,最快每秒一次(以 Nginx 为例) –即使访问量再大,程序运行次数依...
微缓存的适用场景• 在同一时间点,用户访问某页面的结果相同–门户网站首页–新闻 / 视频 / 图片的评论、回复–论坛列表页、回复页–碎碎念(微博)–……                        36
技术四: ESI ( Edge Server Include )                                   37
包含页面片段的三种解决方案• Client Side Include –实现原理:通过 javascript 、 iframe 载入其他页面• Edge Side Include –实现原理:通过 ESI 标签中的 url 地址获取页面嵌  套...
ESI 和 SSI 的两点最重要的区别• 载入方式不同: –SSI 只能加载静态文件和本地 HTTP 地址 –ESI 可以加载远程 HTTP 地址,且可以设置 TTL 时  间• 各类 Web 服务软件的支持度不同 –SSI 主要被用在各种 W...
ESI 如何解决性能问题?• 为了显示页面中的动态元素–使用 ESI 前: •通过 CSI 载入动态元素 •频繁的重新生成静态页面或页面缓存–使用 ESI 后: •通过 ESI 请求一个接口,缓存并将页面进行组装 •可以为不同的页面片段分别设定...
页面头部 TTL :永久 视频及播放数 TTL : 5 分钟相关视频TTL : 60 分钟留言TTL :新内容产生时今日头条推荐TTL : 24 小时           41
ESI 应用的场景• 复杂页面(包含多个复杂组件)• 分布式网站应用–从远端服务器中获取页面数据–在本地服务器进行页面组装• 模拟多线程处理网页                   42
技术五: NoSQL             43
虎扑网使用的 NoSQL 服务• Memcache –30%• Tokyo Tyrant –40%• Redis –30%• Mongodb –开发中的游戏项目正在内部试用                            44
虎扑网使用 NoSQL 的一些经验• 勤用 Redis 的数据结构解决各种问题。 –List 可以当做简单的消息队列来使用 –Sorted Set 用来存放各种排序数据• 使用 SSD 作为持久化的容器 –虎扑网大量使用英某某公司的 520 系...
Redisco               MySQL                           Redis(With Redisco)select * from person..                 Person.obj...
技术六:功能调节控制系统               47
作用• 调节应用与服务的复杂度• 开启或关闭某个功能                48
实际例子 1• 赛事文字直播 –通过降低页面自动刷新的频率,增加系统相应能力通过增加一倍的间隔时间,可服务用户数也会增加一倍假设:单台服务器可以提供 500 的 RPS           自动刷新间隔    可服务用户            ...
实际例子 2• 新闻留言 –关闭复杂功能,增加系统性能                  50
功能调节控制系统的意义• 通过监测系统负载,调节各项影响性能的参数  和配置,提高响应能力,使系统尽可能地服务  更多的用户。                     52
虎扑网在处理流量高峰时的一些经验• 停止新版本的部署,保持线上环境稳定。•除非是紧急修复问题或提高性能的补丁• 禁止搜索引擎抓取页面。• 禁止第三方网站的页面请求。• 禁止访问次数过于频繁的 IP• 暂时封禁“过于活跃”的网站用户       ...
参考资料•   虎扑网架构     –   《 2011 架构师大会:虎扑网架构升级之路》 http://wenku.it168.com/d_000055728.shtml     –   《 2011 架构师大会:基于 Symfony 框架下...
参考资料•   RabbitMQ     –    《 rabbitmq.com 》 http://www.rabbitmq.com/     –    《 Rabbitmq Client & Developer Tools 》 http://...
谢谢!Thanks!
Upcoming SlideShare
Loading in …5
×

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

1,483 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,483
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
27
Comments
0
Likes
3
Embeds 0
No embeds

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

    1. 1. 从林书豪到全明星虎扑网技术架构如何化解流量高峰 虎扑网研发经理 洪涛 ArchSummit 2012 深圳
    2. 2. 自我介绍洪涛8 年互联网开发多个大型网站架构经验2011 年初加入虎扑网主管研发和架构设计
    3. 3. 公司介绍hupu.comAlexa 中国排名 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 Include5.NoSQL6.功能调节控制系统 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. 透传所有请求去访问 App3.App 判断 Cache 是否可用,如果不可用则生成 Cache4. 如果 Cache 可用则获取 Cache5.Web Server 获取到 App 返回的结果6.Web Server 将结果返回给用户 33
    32. 32. 什么是微缓存? Nginx App (PHP-FPM) Nginx Cache1. 接受到大量请求 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!

    ×