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

Post on 27-May-2015

1.114 views 12 download

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

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

虎扑网研发经理 洪涛ArchSummit 2012 深圳

自我介绍

洪涛

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

3

公司介绍

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

4

议程

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

5

7

8

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

•时间发生突然,流量增长迅猛–流量高峰对系统负载提出了严峻的考验

•比赛场次多、悬念大–技术角度无法预测何时出现流量高峰

•大部分比赛在中国时间的早晨–出现问题时无法人工干预并及时修复

9

流量高峰从何而来?

•社会热点事件•体育赛事,明星•电商促销活动

–淘宝“双 11”、“抢红包”,京东“618”

•恶意攻击–黑客攻击–民间团体互掐

10

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

•缺少冗余服务器资源–流量高峰时没有额外资源用来提升系统性能

•无法预估流量高峰的发生时间–系统必须足够“智能”,在尽可能少干预的情况下发现流量高峰并且作出应对

•必须提供稳定服务–每次流量高峰都是机遇–网站的存活决定公司的生命

11

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

•流量高峰发生前:–预先处理并缓存页面和数据–监控系统负载,判断流量高峰是否有发生的趋势

•流量高峰发生时:–尽可能多的利用所有服务器向用户提供服务–削减或调整不必要的服务

•流量高峰发生后:–及时恢复正常服务

12

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

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

13

技术一: Shared-nothing 架构

14

Shared-nothing 架构

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

•SN 在现实生活中的例子–电驴, P2P–蚂蚁

15

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

应用独立型架构 SN 架构

16

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

•在传统的应用独立型架构中–系统的性能取决于“短板”节点

•在 SN 架构中–系统的性能是其所有节点性能的总和

17

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

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

18

问题一:如何管理 Session ?

•SN 架构下管理 Session 的三种方案–通过区分 IP将用户分配到固定的服务器上

•分布不均匀,易用性差,无法应对复杂的网络环境•软件实现逻辑复杂,硬件实现价格昂贵

–使用外部数据库存储 Session•严格意义上并没有实现 SN

–将 Session 加密后存在 Cookie里•对 Session 数据的大小有限制•如何验证 Cookie 有效性?

19

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

•使用统一的开发框架进行应用开发–虎扑网使用 Symfony 作为基础开发框架–虎扑网整个网站就是一个应用

•复杂的异构系统怎么办?–单机多实例–虚拟化

20

问题三:如何部署 SN 架构下的网站应用?

•应用服务器数量多–如何快速升级应用到新版本?

•应用复杂度变高–如何验证代码的正确性?–发现问题后如何回滚?

•部署的新版本需要改变数据库结构怎么办?

21

虎扑网的部署策略

1.部署过程可测试2.灰度部署3.发布前热机4.数据库结构调整策略

1.在 SQL语句中写全字段名2.字段调整尽量保证向前兼容

22

虎扑网的部署工具

24

技术二:消息队列

25

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

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

26

虎扑网对消息队列的要求

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

27

虎扑网的选择

28

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

29

消息队列在虎扑网的应用

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

30

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

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

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

31

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

•减少“峰值效应”–性能需求从满足峰值降低到满足平均值

•系统运维难度降低–系统负载变得平缓,热数据不会突然大量出现

•更加合理利用资源–将一部分业务放在空闲时段处理–闲置的计算资源可以被充分利用起来

32

技术三:微缓存

33

经典的缓存方式

App(PHP-FPM)

Memcache

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

Nginx

34

什么是微缓存?

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

App(PHP-FPM)

Nginx

NginxCache

35

微缓存的优势

•优势–部署简单

•使用时仅需配置前端反向代理(如 Nginx )–应用偶和度低

•不侵占应用 、不修改程序代码–页面更新速度快

•透传频率可调,最快每秒一次(以 Nginx为例)–即使访问量再大,程序运行次数依然是固定的

36

微缓存的适用场景

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

37

技术四: ESI ( Edge Server Include )

38

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

•Client Side Include–实现原理:通过 javascript 、 iframe 载入其他页面

•Edge Side Include–实现原理:通过 ESI标签中的 url地址获取页面嵌套内容

•Server Side Include–实现原理:通过 SSI标签中的文件地址获取页面嵌套内容

39

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

•载入方式不同:–SSI只能加载静态文件和本地 HTTP地址–ESI 可以加载远程 HTTP地址,且可以设置 TTL 时间

•各类Web 服务软件的支持度不同–SSI 主要被用在各种Web 服务器上,例如 Nginx 、Apache

–ESI 主要被用在各种前端缓存服务器上,例如Varnish 、 Squid

40

ESI 如何解决性能问题?

•为了显示页面中的动态元素–使用 ESI 前:

•通过 CSI 载入动态元素•频繁的重新生成静态页面或页面缓存

–使用 ESI 后:•通过 ESI请求一个接口,缓存并将页面进行组装•可以为不同的页面片段分别设定过期时间( TTL )

41

页面头部TTL :永久

视频及播放数TTL : 5分钟

相关视频TTL : 60 分钟

留言TTL :新内容产生时

今日头条推荐TTL : 24小时

42

ESI 应用的场景

•复杂页面(包含多个复杂组件)•分布式网站应用

–从远端服务器中获取页面数据–在本地服务器进行页面组装

•模拟多线程处理网页

43

技术五: NoSQL

44

虎扑网使用的 NoSQL 服务

•Memcache–30%

•Tokyo Tyrant–40%

•Redis–30%

•Mongodb–开发中的游戏项目正在内部试用

45

虎扑网使用 NoSQL 的一些经验

•勤用 Redis 的数据结构解决各种问题。–List 可以当做简单的消息队列来使用–Sorted Set 用来存放各种排序数据

•使用 SSD 作为持久化的容器–虎扑网大量使用英某某公司的 520 系列

•Redisco–用 Redis模拟类 SQL操作的 Python类库

46

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')

47

技术六:功能调节控制系统

48

作用

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

49

实际例子 1

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

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

自动刷新间隔 可服务用户

12秒 12*500=6000

24秒 24*500=12000

50

实际例子 2

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

52

功能调节控制系统的意义

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

53

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

•停止新版本的部署,保持线上环境稳定。•除非是紧急修复问题或提高性能的补丁

•禁止搜索引擎抓取页面。•禁止第三方网站的页面请求。•禁止访问次数过于频繁的 IP

•暂时封禁“过于活跃”的网站用户

54

参考资料

• 虎扑网架构– 《 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

55

参考资料

• 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

谢谢 !Thanks!