当前位置:龙图IT服务 > 数据库 >

使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构内幕

作者:龙图IT服务 发布时间:2014-12-22 阅读: 转至微博:

  【编者按】正正在公司的发展中,服务器的可扩展性对于于扩大企业的市场需要存正正在次要作用,因此,这关于架构师提出了一定的要求。Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架构,使用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之外,我们还使用了传统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编译整理,未经准许没有得转载,如需转载请联系(#换成@)

关键词: mysql开发文档