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

53
从从 从从从从从 从从从从从从从从从从从从从从从 从从从从从从从 从从 ArchSummit 2012 从从

Upload: scourgen-hong

Post on 27-May-2015

1.114 views

Category:

Technology


12 download

TRANSCRIPT

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

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

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

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

自我介绍

洪涛

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

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

3

公司介绍

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

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

4

议程

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

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

5

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

7

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

8

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

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

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

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

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

9

流量高峰从何而来?

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

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

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

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

10

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

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

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

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

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

11

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

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

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

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

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

12

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

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

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

13

技术一: Shared-nothing 架构

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

14

Shared-nothing 架构

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

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

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

15

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

应用独立型架构 SN 架构

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

16

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

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

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

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

17

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

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

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

18

问题一:如何管理 Session ?

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

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

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

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

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

19

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

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

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

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

20

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

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

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

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

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

21

虎扑网的部署策略

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

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

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

22

虎扑网的部署工具

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

24

技术二:消息队列

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

25

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

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

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

26

虎扑网对消息队列的要求

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

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

27

虎扑网的选择

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

28

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

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

29

消息队列在虎扑网的应用

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

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

30

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

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

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

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

31

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

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

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

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

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

32

技术三:微缓存

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

33

经典的缓存方式

App(PHP-FPM)

Memcache

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

Nginx

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

34

什么是微缓存?

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

App(PHP-FPM)

Nginx

NginxCache

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

35

微缓存的优势

•优势–部署简单

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

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

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

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

36

微缓存的适用场景

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

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

37

技术四: ESI ( Edge Server Include )

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

38

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

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

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

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

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

39

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

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

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

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

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

40

ESI 如何解决性能问题?

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

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

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

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

41

页面头部TTL :永久

视频及播放数TTL : 5分钟

相关视频TTL : 60 分钟

留言TTL :新内容产生时

今日头条推荐TTL : 24小时

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

42

ESI 应用的场景

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

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

•模拟多线程处理网页

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

43

技术五: NoSQL

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

44

虎扑网使用的 NoSQL 服务

•Memcache–30%

•Tokyo Tyrant–40%

•Redis–30%

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

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

45

虎扑网使用 NoSQL 的一些经验

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

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

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

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

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

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

47

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

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

48

作用

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

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

49

实际例子 1

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

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

自动刷新间隔 可服务用户

12秒 12*500=6000

24秒 24*500=12000

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

50

实际例子 2

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

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

52

功能调节控制系统的意义

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

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

53

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

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

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

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

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

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

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

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

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

谢谢 !Thanks!