设置高速负载均衡服务器集群 – web / db / NFS

我正在寻找最好的方法(主要是硬件方面)的build议,在预算(比如2000英镑到3000英镑)上build立一个高速负载平衡服务器集群来托pipeWeb服务,数据库服务器和通用文件系统。 所有在Linux上。

对于Web服务器,我知道我想用apache来设置IPVS,但我不知道花在硬件上的最佳方式。 我会设想有一台机器(理想的备份)接受来自互联网的请求,并在apache服务器arrays中对这些请求进行负载平衡。 arrays中的每个服务器都可以共享一个通用文件系统。 到时候,我会添加更多的服务器arrays,以增加容量。

  1. 系统在负载平衡器中始终是瓶颈。 我需要什么样的机器才能支持非常高/不那么高的stream量? 哪个更重要 – 处理器/内存

  2. 对于apachearrays中的机器,我要做什么 – 更多的处理器,更快的处理器,更多的内存等 – 这是最重要的,如果我打算添加更多的机器

  3. 为了提供可伸缩性(易于添加更多的磁盘空间)和性能(因为它也是一个瓶颈),实现共享文件系统的最佳方式是什么? 在这里我想要软件和硬件的build议。

  4. 每种不同任务的机器成本/性能估算。

  5. 任何有关这种交通量的想法,您可以使用此设置为给定数量的机器提供服务。

我最近不得不devise类似的东西。 这是我对信封devise的回顾

负荷分配

我假设networking运营商们已经build立了一个冗余和高度可用的路由,防火墙和交换结构,向负载均衡器发送请求。

(如果没有的话,我会使用PF或IPtables的有状态HA设置,使用鲤鱼或keepalived自动故障转移。)负载均衡器speci fi cations将取决于是否Web应用程序负载分配方法和成本等度量标准。

根据预算,负载平衡可以通过以下方式实现 – 基于硬件的负载平衡器往往是昂贵的 – 基于软件的代理,如HAProxy

负载平衡器必须高度可用,所以我会去做一些有备用的负载备份(比如2个HAProxy实例,2个备用模式)。

我有路由层发送请求到负载平衡器。 如果其中一个负载平衡器失败,则将使用基于keepalived的解决scheme来无缝地replace故障盒。

一旦负载均衡器接受请求,它们就会将它们传递给caching层。 caching层将处理:

  • 请求静态内容。
  • 具有HTTP标头的内容说明它尚未过期。
  • 压缩静态文本内容,如CSS和JS文件。

caching层可以使用反向代理中的解决scheme(如SQUID或NGINX)来实现。 通过这样做,我们将通过只向Apache / PHP服务器发送dynamic请求来减less应用程序服务器上的负载。

为了把成本降到最低,我会把HAProxy和NGINX放在同一个盒子里。

一个简单而可扩展的方法是通过网站的子域来提供CSS,JS和静态图片(比如http://cdn.myservice.com/static )。 使用这样的设置,我们可以在将来全局安装caching实例,并让DNS将静态请求发送到最近的CDN实例。 最初,NGNX实例可以处理CDN工作,以降低成本。

处理层

处理层由为Apache / PHP优化的服务器池组成。 他们将从NFS或分布式文件系统共享中加载其configuration文件,并通过从另一个远程共享(NFS或DFS)处理PHP脚本来处理它们的请求。 使用这些远程共享可以简化维护和同步服务器configuration的configuration开销。

Apache和PHP可以进一步优化,例如:

  • 在PHP和Apache中删除不需要的模块。
  • 使用PHP操作码caching(如APC)来减lessPHP编译开销。
  • 优化Apache的设置,如MPM和保持活动设置。

memcache服务器池也可以configuration为存储常见和昂贵的数据库查询的结果。 如果读取查询不在memcache层中,那么通常会将读取查询发送给从属服务器,并将其结果caching起来。 写入操作将被发送到主服务器,并可能涉及使Memcache层中的数据无效。 PHP会话数据也可以通过memcached共享,这样如果任何一个Apache / PHP服务器失败,其余的服务器可以从memcache中获取会话数据。

处理池中负载的扩展将是添加更多服务器和更新反向代理的问题。 服务器池可能被分区成多个逻辑组。 一个逻辑组然后将使用通过NFS共享的一个公共configuration,并可以作为块升级。

然后可以对升级进行监控,如果检测到问题,可以实施固件或实施回滚。 逻辑组可以分布在不共享数据的机架上(Power,networking交换机等),并由不同的成员组成(例如来自Dell的服务器型号A,B和C),以便块迁移testing是全面的。

数据库

对于数据库,我会有一个MySQL服务器运行在主/从属设置。 主设备将针对启用复制的二进制日志logging进行优化。 这通常意味着我们将使用MySQL的通常优化,例如:

  • 使用RAID 10和高RPM驱动器。
  • 在mysql数据目录上禁用atime / mtime。
  • 调整CPU和RAM的innodb设置。
  • 正确索引和分区表。
  • 监视慢查询日志并使用解释来缓慢查询。
  • 监视数据库性能。

从设备将被configuration为读取,并且需要使用诸如maatkit的mk-heartbeat之类的实用程序来持续监控复制延迟。 滞后的服务器可能会从PHP读取集中删除,直到它赶上。

在主站故障的情况下:

  • 奴隶将晋升为主人。
  • 将对DNS进行更改以指向新主控。
  • networking中的parsing器重新加载以反映DNS更改。
  • 其他从站会自动从新主站中选取(我们可以使主站和从站上的binlog位置和文件相同,从而使这种迁移变得容易)
  • Apache / PHP服务器会自动写入新的主服务器,因为DNSparsing器将返回新的主服务器。 读取也将被发送到适当的服务器通过使用DNS循环与A / AAAAAlogging为奴隶集。

DNS的替代scheme可能是将良好从属列表存储在caching(如memcache)中并进行适当更新。

最重要的是,我有一个或两个工作站用于networking监控和报告汇总。 我使用Munin / Zenoss进行趋势分析,系统日志服务器用于聚合服务器日志,用于日志分析和警报的自定义脚本。 Nagios也可用于提供基础设施和警报的全局概述。

缩放

升级基础架构以获得更多负载将由以下方面处理:

  • 增加负载平衡器反向代理服务器来处理更多的静态内容。
  • 静态内容的地理分布。 根据成本的不​​同,CDN工作可能会外包给亚马逊的云端服务。
  • 增加Apache / PHP服务器的数量来处理更多的负载。
  • 增加MySQL从站的数量。
  • 分割master和MySQL联合以提供遍布在数据库服务器集群上的表的统一视图