网站首页 > PHP教程> 文章内容

PHP教程使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构细节

※发布时间:2014-8-17 9:30:00   ※发布作者:habao   ※出自何处: 

  【编者按】在公司的发展中,服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求。Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架构,使用HAProxy、PHP、Redis和MySQL就能支撑每周10亿请求。同时,你还能了解项目未来的横向扩展途径及常见的模式。

  以下为:

  在这篇文章中,我将展示一个非常简单的架构,使用HAProxy、PHP、Redis和MySQL支撑每周10亿请求。除此之外,我还将展示项目未来的横向扩展途径及常见的模式,下面我们一起看细节。

  状态:

  大约1年前,一个朋友找到我并提出了一个苛刻的要求:它们是一个飞速发展的电子商务初创公司,而当时已经准备向国际发展。介于那个时候他们仍然是一个创业公司,初始解决方案必须符合所谓的成本效益,因此也就无法在服务器上投入更多的资金。遗留系统使用了标准的LAMP堆栈,因此他们拥有一个强力的PHP开发团队。如果必须引入新技术的话,那么这些技术必须足够简单,不会存在太多架构上的复杂性;那么,他们当下的技术团队就可以对应用进行长期的。

  为了满足他们扩展到下一个市场的需求,架构师必须使用可扩展进行设计。首先,我们审视了他们的基础设施:

  老系统使用了单模块化设计思,底层是一些基于PHP的Web应用程序。这个初创公司有许多所谓的前端网站,它们大多都使用了的数据库,并共享了一些支撑业务逻辑的通用代码。毫不客气的说,长期这种应用程序绝对是一个噩梦:因为随着业务的发展,有些代码必须被重写,这样的话,修改某个网站将不可避免导致业务逻辑上的不一致,这样一来,他们不得不在所有Web应用程序上做相同的修改。

  通常情况下,这该归结于项目管理问题,管理员必须对横跨多个代码库的那些代码负责。基于这个观点,整改第一步就是提取核心的业务关键功能,并将之拆分为的服务(这也是本文的一个重点部分),也就是所谓的面向服务架构,在整个系统内遵循“separation of concern”原则。每个服务只负责一个业务逻辑,同时也要明确更高等级的业务功能。举个形象的例子也就是,这个系统可能是个搜索引擎、一个销售系统等。

  前端网站通过REST API与服务交互,响应则基于JSON格式。为了简单起见,我们选择了SOAP,一个开发者比较无爱的协议,因为谁都不愿意解析一堆的XML。

  提取一些不会经常处理的服务,比如身份验证和会话管理。这常必要的一个环节,因为它们的处理等级比较高。前端网站负责这个部分,只有它们可以识别用户。这样一来我们可以保持服务的足够简单,在处理扩展和代码相关问题时都具有巨大的优势,可谓各司其职,完美无缺。

  带来的好处:

  共生的缺点:

  为系统管理员带来更大的工作量。鉴于服务都使用了的基础设施,这将给管理员带来更多需要关注的地方。

  很难保持向后兼容。在一年的之后,API方法中发生了数不尽的变化。因此问题发生了,它们必将向后兼容,因为每个网站的代码都可能发生变化,还可能存在许多技术人员同时修改一个网站的情况……然而,一年后,所有方法匹配的仍然是项目开始时建立的文档。

  着眼请求工作流,第一层是应用程序。HAProxy负载均衡器、Varnish和Symfony2应用程序都在这一层。来自前端网站的请求首先会传递给HAProxy,随后负载均衡器将把他分给不同的节点。

  应用程序节点配置

  我们购买了3个这样的服务器,N+1冗余配置的active-active模式,备份服务器同样处理请求。因为性能不是首要因素,我们为每个节点配置的Varnish以降低缓存hit,同时也避免了单点故障(SPOF)。在这个项目中,我们更重视可用性。因为一个前端网站服务器中使用了Apache 2,我们保留了这个堆栈。这样一来,管理员不会困扰于太多新加入的技术。

  Symfony2应用程序

  应用程序本身基于Symfony2建立,这是一个PHP全堆栈框架,提供了大量加速开发的组件。作为基于复杂框架的典型REST服务可能受到很多人质疑,这里为你细说:

  许多现成的组件。遵循DRY思想……没有人愿意花力气去做重复的工作,我们也不例外。我们使用了大量的Symfony2 Console Component,这个框架非常有利于做CLI命令,以及应用程序性能分析(debug工具栏)、记录器等。

  在选用Symfony2之前,我们做了大量的性能测试以应用程序可以支撑计划流量。我们制定了概念验证,并使用JMeter执行,我们得到了让人满意的结果——每秒700请求时响应时间可以控制在50毫秒。这些测试给了我们足够的信心,让我们,即使Symfony2这样复杂的框架也可以得到理想的性能。

  应用程序分析与

  我们使用Symfony2工具来应用程序,在收集指定方法执行时间上表现的非常不错,特别是那些与第三方网络服务交互的操作。这样一来,我们可以发现架构中潜在的弱点,找出应用程序中最耗时的部分。

  冗长的日志同样是不可缺少的一部分,我们使用PHP Monolog库把这些日志处理成优雅的log-lines,便于开发者和管理员理解。这里需要注意的是尽可能多地添加细节,越详细越好,我们使用了不同的日志等级:

  因此,你可以清晰地了解Error和Critical信息。而在开发/测试中,Debug信息同样被记录。同时,日志被存储在不同的文件中,也就是Monolog库下的“channels”。系统中有一个主日志文件,记录了所有应用程序级错误,以及各个channel的短日志,从单独的文件中记录了来自各个channel的详细日志。

  扩展性

  扩展平台的应用程序层并不困难,HAProxy性能并不会在短时间耗尽,唯一需要考虑的就是如何冗余以避免单点故障。因此,当下需要做的只是添加下一个应用程序节点。

  我们当下拥有两个Redis服务器,使用主从复制模式。这两个节点的配置相同,都是Xeon E5-2650v2@2.60GHz,128GB,SSD。内存被设置为100GB,通常情况下使用率都是100%。

  在应用程序并没有耗尽单个Redis服务器的所有资源时,从节点主要作作备份使用,用以高有效性。如果主节点宕机,我们可以快速的将应用程序切换到从节点。在和服务器迁移时,复制同样被执行——转换一个服务器非常简单。

  你可能会猜想当Redis资源被一直耗尽时的情景,所有的键都是持久化类型,大约占90% keyspace,剩余资源被全部被用于TTL过期缓存。当下,keyspace已经被分为两个部分:一个是TTL集(缓存),另一个则是用于持久化数据。感谢“volatile-lru”最大化内存设置的可行性,最不经常使用缓存键会被移除。如此一来,系统就可以一直保持单Redis实例同时执行两个操作——主存储和通用缓存。

  使用这个模式必须一直“期满”键的数量:

  db.redis1:6379 info keyspace

  # Keyspace

  db0:keys=16X,expires=11,avg_ttl=0

  “期满”键数量越接近0情况越,这个时候管理员就需要考虑适当的分片或者是增加内存。

  我们如何进行?这里使用Icinga check,仪表盘会显示数字是否会达到临界点,我们还使用了Redis来可视化“丢失键”的比率。

  在一年后,我们已经爱上了Redis,它从未让我们失望,这一年系统从未发生任何宕机情况。

  在Redis之外,我们还使用了传统RDBMS——MySQL。但是区别于他人,我们通常使用它作为缓存层。我们使用MySQL存储一些不会经常使用对象以降低Redis的资源使用率,因此它们被放到了硬盘上。这里没有什么可说道的地方,我们只是尽可能地让其保持简单。我们使用了两个MySQL服务器,配置是Xeon E5-1620@3.60GHz,64GB RAM,SSD。两个服务器使用本地、异步的主-主复制。此外,我们使用一个单独的从节点作为备份。

  MySQL的高可用性

  在应用程序中,数据库永远是最难的瓶颈。当前,这里还不需要考虑横向扩展操作,我们多是纵向扩展Redis和MySQL服务器。当下这个策略还存在一定的发展空间,Redis运行在一个126GB内存的服务器上,扩展到256GB也并不困难。当然,这样的服务器也存在劣势,比如快照,又或是是简单的启动——Redis服务器启动需要很长的时间。

  在纵向扩展失效后进行的必然是横向扩展,值得高兴的是,项目开始时我们就为数据准备了一个易于分片的结构:

  在Redis中,我们为记录使用了4个“heavy”类型。基于数据类型,它们可以分片到4个服务器上。我们避免使用哈希分片,而是选择基于记录类型分片。这种情况下,我们仍然可以运行MGET,它始终在一种类型键上执行。

  在MySQL上,结构化的表格非常易于向另一台服务器上迁移——同样基于记录类型(表格)。当然,一旦基于记录类型的分片不再奏效,我们将转移至哈希。

  架构中使用复杂的框架并不意味着低性能。许多人惊讶我们使用全堆栈框架来支撑如此流量应用程序,其秘诀在于更聪明的使用工具,否则即使是Node.js也可能变得很慢。选择一个提供良好开发的技术,没有人期望使用一堆不友好的工具,这将降低开发团队士气。

  免费订阅“CSDN云计算(左)和CSDN大数据(右)”微信号,实时掌握第一手云中消息,了解最新的大数据进展!

  CSDN发布虚拟化、Docker、OpenStack、CloudStack、数据中心等相关云计算资讯, 分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、内存计算、流计算、机器学习和智能算法等相关大数据观点,提供云计算和大数据技术、平台、实践和产业信息等服务。

  本文为CSDN编译整理,未经允许不得转载,如需转载请联系(#换成@)

延伸内容:唐伯虎点秋香四川方言版,战争前线论坛,矢内里华,孔雀鱼怎么分公母,观赏龟的种类,鲁妹网,泷泽萝拉第一部作品,李宗瑞照片种子,商业大宋,李宗瑞 mia,巴中雷电击中巨蟒,foganglao在佛冈,大北农oa,游戏神童马桂木,四川方言笑话视频网,脆滑肉是什么地方的菜,泷泽萝拉av下载,拾年网80后,汕尾市民网,欢畅大领主,重庆高考排名,赣州信息港网络测速,重庆中小学zslpsh,四川重庆方言网,观赏龟的种类zadull,贵州方言网站,江西赣州人才网,刘惜芬受刑,重庆中学生,坐着火车去拉萨简谱,伊尔斯科赫,水族箱布景,重庆方言剧,lolfarm,027房产招聘网,西莉斯在纽约,七种武器之镇魂刀,suzhou.520hr.cc,活力佛foganglao,ngks-022,龙鱼图片,吉安永丰网,重庆中学生网老师,0755深圳旅游新闻,江西师大教务在线首页,袁宪千女儿,早乙露乙女 ed2k,110627来玩吧,重庆方言网西南,快乐大本营2010821,坊凌岭,兴国县将军网,ikan80,52worm,手机应用zwds,纸醉金迷三毛钱看,西南方言xindeshuo,218.5.6.212,zwds,澳客网机房故障,李修平,黄金渔场121107中字,0773桂林新闻网,高冈早纪真,336.tv,重庆市中学生信息网,友好kmqgsq论坛,中国好声音吉克俊逸,ipz159,坏丫头 音译,foganglao论坛佛冈,foganglao佛冈论坛,军情观察室20100119,dnf喜欢发射*非法字符*,tianyanmao.cn,tv336,永丰房价,yszy8,地图鱼怎么养,项城杀人案
相关阅读
重庆学习网zslpsh,0755深圳房产人才招聘网,拾年网90后,anedc股票,最新电影下载淘娱淘乐,重庆中学生网高考,重庆中学生网高考,学习重庆方言网,重庆中学生学习方法,重庆俗语网,中学生网zslpsh,0755深圳交友网,重庆初中生,贵州重庆方言网,025新闻网,西南重庆方言歌曲,025南京交友网,重庆农家乐美女,观赏蟹种类zadull,云南重庆方言网,重庆中学学习网,028成都交友网,推广taoyutaol,西南四川方言网,观赏龟论坛zadull,四川重庆方言网,022天津交友网,重庆中学生网家长,鹦鹉鱼zadull,重庆俗语,电影淘娱淘乐,taoyutaole娱乐,华夏视讯网,0755深圳旅游招聘,昆明重庆方言网,淘娱淘乐影视,www.00game.net,观赏鱼zadul,重庆高考zslpsh,重庆中学生网高考,027房产招聘网,坝坝舞wagcw,西南重庆方言网,贵州重庆方言网,重庆言子儿网,热带鱼zadull,重庆高考zslpsh,0755深圳旅游招聘网,淘娱淘乐影视网,0571.361.cm,重庆方言学习网,028成都新闻,异形观赏鱼种类,影视网淘娱淘乐,最新电影下载淘娱淘乐,0773桂林论坛,拾年网80后动画片,观赏蟹论坛zadull,观赏龟繁殖教程,重庆一中zslpsh,重庆俗语网,广场舞wagcw,观赏虾的种类zadull,观赏鱼观赏虾观赏龟,西南方言网,观赏鱼之家论坛zadull,战争前线辅助00game,西南重庆方言小说,重庆中小学zslpsh,推广taoyutaol,战争前线论坛00game,0871交友网,025南京新闻网,重庆言子儿网站,娱乐taoyutaole,022天津交友网,025新闻网,重庆中学生网学习,022天津交友网,重庆方言歌网,www.120.cm健康网,anedc股票,重庆初中生