SlideShare a Scribd company logo
从林书豪到全明星
虎扑网技术架构如何化解流量高峰




       虎扑网研发经理 洪涛
      ArchSummit 2012 深圳
自我介绍

洪涛

8 年互联网开发
多个大型网站架构经验
2011 年初加入虎扑网
主管研发和架构设计
公司介绍

hupu.com
Alexa 中国排名 90 左右
流量:每天 1 亿 pv




                   3
议程

• 流量高峰从何而来?
• 处理流量高峰时的困扰
• 6 个能够化解流量高峰的技术
• 虎扑网在处理流量高峰时的一些经验




                     4
5
7
从两次事件看虎扑网流量高峰的特点

• 时间发生突然,流量增长迅猛
–流量高峰对系统负载提出了严峻的考验
• 比赛场次多、悬念大
–技术角度无法预测何时出现流量高峰
• 大部分比赛在中国时间的早晨
–出现问题时无法人工干预并及时修复




                     8
流量高峰从何而来?

• 社会热点事件
• 体育赛事,明星
• 电商促销活动
 –淘宝“双 11” 、“抢红包”,京东“ 618”
• 恶意攻击
 –黑客攻击
 –民间团体互掐



                             9
大多数网站应对流量高峰的困扰

• 缺少冗余服务器资源
–流量高峰时没有额外资源用来提升系统性能
• 无法预估流量高峰的发生时间
–系统必须足够“智能”,在尽可能少干预的情况下发
 现流量高峰并且作出应对
• 必须提供稳定服务
–每次流量高峰都是机遇
–网站的存活决定公司的生命


                           10
虎扑网化解流量高峰的策略

• 流量高峰发生前:
–预先处理并缓存页面和数据
–监控系统负载,判断流量高峰是否有发生的趋势
• 流量高峰发生时:
–尽可能多的利用所有服务器向用户提供服务
–削减或调整不必要的服务
• 流量高峰发生后:
–及时恢复正常服务

                         11
技术上如何化解流量高峰?

1.Shared-nothing 架构
2.消息队列
3.微缓存
4.Edge Side Include
5.NoSQL
6.功能调节控制系统



                      12
技术一: Shared-nothing 架构




                         13
Shared-nothing 架构

• 什么是 Shared-nothing ( SN )架构?
 –一个系统(网站)中的每一个节点(应用服务器)
  都是互相独立的,彼此之间没有竞争或冲突。
• SN 在现实生活中的例子
 –电驴, P2P
 –蚂蚁




                                 14
SN 架构如何化解流量高峰?




应用独立型架构    SN 架构


                   15
SN 架构如何化解流量高峰?

• 在传统的应用独立型架构中
 –系统的性能取决于“短板”节点
• 在 SN 架构中
 –系统的性能是其所有节点性能的总和




                      16
升级 SN 架构的三个关键问题

• 如何管理 Session ?
• 如何统一网站应用?
• 如何部署应用?




                       17
问题一:如何管理 Session ?

•SN 架构下管理 Session 的三种方案
 –通过区分 IP 将用户分配到固定的服务器上
  •分布不均匀,易用性差,无法应对复杂的网络环境
  •软件实现逻辑复杂,硬件实现价格昂贵
 –使用外部数据库存储 Session
  •严格意义上并没有实现 SN
 –将 Session 加密后存在 Cookie 里
  •对 Session 数据的大小有限制
  •如何验证 Cookie 有效性?

                             18
问题二:如何统一网站应用?

• 使用统一的开发框架进行应用开发
–虎扑网使用 Symfony 作为基础开发框架
–虎扑网整个网站就是一个应用
• 复杂的异构系统怎么办?
–单机多实例
–虚拟化




                          19
问题三:如何部署 SN 架构下的网站应
        用?
• 应用服务器数量多
–如何快速升级应用到新版本?
• 应用复杂度变高
–如何验证代码的正确性?
–发现问题后如何回滚?
• 部署的新版本需要改变数据库结构怎么办?




                        20
虎扑网的部署策略

1.部署过程可测试
2.灰度部署
3.发布前热机
4.数据库结构调整策略
1.在 SQL 语句中写全字段名
2.字段调整尽量保证向前兼容




                   21
虎扑网的部署工具




           22
技术二:消息队列




           24
使用消息队列后
业务逻辑处理顺序的变化




使用消息队列前   使用消息队列后




                    25
虎扑网对消息队列的要求

• 提供多种消息分发方式
• 高性能
• 多语言支持
• 持久化支持
• 支持集群和扩展




                  26
虎扑网的选择




         27
虎扑网已经部署 RabbitMQ 至生产环境




                         28
消息队列在虎扑网的应用

• 发送邮件和站内短消息
• 图片处理
• 发送手机短信
• 用户访问数据的统计和分析
• 缓冲对数据库的大数据量写和更新操作
• ……



                      29
某应用在部署消息队列后的负载曲线

          部署消息队列前:
          平均压力 0.5
          峰值达到 2.7




          部署消息队列后:
          平均压力 0.5
          无明显峰值




                     30
消息队列如何化解流量高峰?

• 减少“峰值效应”
 –性能需求从满足峰值降低到满足平均值
• 系统运维难度降低
 –系统负载变得平缓,热数据不会突然大量出现
• 更加合理利用资源
 –将一部分业务放在空闲时段处理
 –闲置的计算资源可以被充分利用起来



                         31
技术三:微缓存




          32
经典的缓存方式

    Nginx       App          Memcache
                (PHP-FPM)




1. 接受浏览器请求
2. 透传所有请求去访问 App
3.App 判断 Cache 是否可用,如果不可用则生成 Cache
4. 如果 Cache 可用则获取 Cache
5.Web Server 获取到 App 返回的结果
6.Web Server 将结果返回给用户



                                        33
什么是微缓存?

    Nginx        App
                 (PHP-FPM)

     Nginx
     Cache




1. 接受到大量请求
 2a. 透传其中的一个请求去访问 App
 3a. 将 App 返回的结果写入 Cache
 2b. 直接从 Cache 读取页面缓存
 3b. 将 Cache 的结果直接返回给用户




                             34
微缓存的优势

• 优势
 –部署简单
  •使用时仅需配置前端反向代理(如 Nginx )
 –应用偶和度低
  • 不侵占应用 、不修改程序代码
 –页面更新速度快
  •透传频率可调,最快每秒一次(以 Nginx 为例)
 –即使访问量再大,程序运行次数依然是固定的


                               35
微缓存的适用场景

• 在同一时间点,用户访问某页面的结果相同
–门户网站首页
–新闻 / 视频 / 图片的评论、回复
–论坛列表页、回复页
–碎碎念(微博)
–……




                        36
技术四: ESI ( Edge Server Include )




                                   37
包含页面片段的三种解决方案

• Client Side Include
 –实现原理:通过 javascript 、 iframe 载入其他页面
• Edge Side Include
 –实现原理:通过 ESI 标签中的 url 地址获取页面嵌
  套内容
• Server Side Include
 –实现原理:通过 SSI 标签中的文件地址获取页面嵌
  套内容


                                   38
ESI 和 SSI 的两点最重要的区别

• 载入方式不同:
 –SSI 只能加载静态文件和本地 HTTP 地址
 –ESI 可以加载远程 HTTP 地址,且可以设置 TTL 时
  间
• 各类 Web 服务软件的支持度不同
 –SSI 主要被用在各种 Web 服务器上,例如 Nginx 、
  Apache
 –ESI 主要被用在各种前端缓存服务器上,例如
  Varnish 、 Squid

                                   39
ESI 如何解决性能问题?

• 为了显示页面中的动态元素
–使用 ESI 前:
 •通过 CSI 载入动态元素
 •频繁的重新生成静态页面或页面缓存
–使用 ESI 后:
 •通过 ESI 请求一个接口,缓存并将页面进行组装
 •可以为不同的页面片段分别设定过期时间( TTL )




                              40
页面头部
 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
 –用 Redis 模拟类 SQL 操作的 Python 类库



                                  45
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
技术六:功能调节控制系统




               47
作用

• 调节应用与服务的复杂度
• 开启或关闭某个功能




                48
实际例子 1

• 赛事文字直播
 –通过降低页面自动刷新的频率,增加系统相应能力

通过增加一倍的间隔时间,可服务用户数也会增加一倍
假设:单台服务器可以提供 500 的 RPS
           自动刷新间隔    可服务用户


             12 秒   12*500=6000


             24 秒   24*500=12000



                                   49
实际例子 2

• 新闻留言
 –关闭复杂功能,增加系统性能




                  50
功能调节控制系统的意义

• 通过监测系统负载,调节各项影响性能的参数
  和配置,提高响应能力,使系统尽可能地服务
  更多的用户。




                     52
虎扑网在处理流量高峰时的一些经验

• 停止新版本的部署,保持线上环境稳定。
•除非是紧急修复问题或提高性能的补丁
• 禁止搜索引擎抓取页面。
• 禁止第三方网站的页面请求。
• 禁止访问次数过于频繁的 IP
• 暂时封禁“过于活跃”的网站用户


                       53
参考资料
•   虎扑网架构
     –   《 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
参考资料
•   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
谢
谢!
Thanks!

More Related Content

PPTX
MySQL压力测试经验
PDF
构建基于Lamp的网站架构
PPTX
如何针对业务做DB优化
PDF
天涯论坛的技术进化史-Qcon2011
PDF
Hacking Nginx at Taobao
PDF
阿里巴巴运维自动化的探索与规划
PDF
基于Fuel的超融合一体机
PDF
豆瓣网技术架构变迁
MySQL压力测试经验
构建基于Lamp的网站架构
如何针对业务做DB优化
天涯论坛的技术进化史-Qcon2011
Hacking Nginx at Taobao
阿里巴巴运维自动化的探索与规划
基于Fuel的超融合一体机
豆瓣网技术架构变迁

What's hot (19)

PPTX
My sql 5.6新特性深入剖析——innodb引擎
PDF
服务器基准测试-叶金荣@CYOU-20121130
PPTX
Cgroup lxc在17173 iaas应用池中应用
PPTX
Pptv lb日志实时分析平台
PDF
Nodejs & NAE
PPT
Traffic server overview
PDF
Openstack网络规划
PPTX
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
PPT
高性能并发Web服务器实现核心内幕
PDF
Bypat博客出品-服务器运维集群方法总结3
PDF
Mvcc (oracle, innodb, postgres)
PDF
Bypat博客出品-服务器运维集群方法总结2
PDF
分布式Key Value Store漫谈
PDF
Ceph in UnitedStack
PPTX
高性能队列Fqueue的设计和使用实践
PDF
新浪微博Feed服务架构
PPTX
Nosql三步曲
PDF
美团技术团队 - KVM性能优化
My sql 5.6新特性深入剖析——innodb引擎
服务器基准测试-叶金荣@CYOU-20121130
Cgroup lxc在17173 iaas应用池中应用
Pptv lb日志实时分析平台
Nodejs & NAE
Traffic server overview
Openstack网络规划
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
高性能并发Web服务器实现核心内幕
Bypat博客出品-服务器运维集群方法总结3
Mvcc (oracle, innodb, postgres)
Bypat博客出品-服务器运维集群方法总结2
分布式Key Value Store漫谈
Ceph in UnitedStack
高性能队列Fqueue的设计和使用实践
新浪微博Feed服务架构
Nosql三步曲
美团技术团队 - KVM性能优化
Ad

Viewers also liked (12)

PPT
Smart Approach To Smart Learning 4 Coft
PPTX
Mempersiapkan presentasi
PDF
Autonome voertuigen
PDF
Santos no mundo
PDF
如何使用工具提高PHP项目的生产力
PDF
大象也会跳舞 - 使用Symfony2快速开发网站应用
PPTX
虎扑网架构升级之路
PDF
Intuitive Appeal of Learning Styles
PDF
Belieforama - A panoramic approach on issues of religion and belief.
PPT
Php重装上阵
PPTX
Why Start A Home Base Travel Business?
PDF
A Zinneke Approach to Curriculum Development
Smart Approach To Smart Learning 4 Coft
Mempersiapkan presentasi
Autonome voertuigen
Santos no mundo
如何使用工具提高PHP项目的生产力
大象也会跳舞 - 使用Symfony2快速开发网站应用
虎扑网架构升级之路
Intuitive Appeal of Learning Styles
Belieforama - A panoramic approach on issues of religion and belief.
Php重装上阵
Why Start A Home Base Travel Business?
A Zinneke Approach to Curriculum Development
Ad

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

PPTX
tengine(nginx with lua ) develop at 2013
PDF
美团前端架构简介
KEY
新浪微博平台与安全架构
PDF
快!快!快! 互联网第一条军规
PPT
海量日志分析系统实践,Dba
PDF
众行业公司系统架构案例介绍
PDF
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
PDF
大众点评网的技术变迁之路
KEY
Beyond rails server
PDF
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
PDF
Train.IO 【第六期-OpenStack 二三事】
PDF
阿里云技术实践
PDF
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
PDF
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
PDF
合久必分,分久必合
PDF
twMVC#19 | opserver監控服務的解決
PPT
Java@taobao
PPTX
纵览Loadrunner核心功能
PDF
Mysql HandleSocket技术在SNS Feed存储中的应用
PDF
Redis在唯品会的应用实践.pdf
tengine(nginx with lua ) develop at 2013
美团前端架构简介
新浪微博平台与安全架构
快!快!快! 互联网第一条军规
海量日志分析系统实践,Dba
众行业公司系统架构案例介绍
[.Net开发交流会][2010.06.19]大众点评网的技术变迁之路(王宏)
大众点评网的技术变迁之路
Beyond rails server
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Train.IO 【第六期-OpenStack 二三事】
阿里云技术实践
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
合久必分,分久必合
twMVC#19 | opserver監控服務的解決
Java@taobao
纵览Loadrunner核心功能
Mysql HandleSocket技术在SNS Feed存储中的应用
Redis在唯品会的应用实践.pdf

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

Editor's Notes

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