PHP + Apache + Mysql + 服务器集群 – 陷阱,提示和路线图效率

在我的公司需要集群服务器设置(就是它所谓的?)。 我们有我们的主机在国外租用,因此有实际的硬件访问有限,但我们有完全的自由,不受金融资源的限制(当然,如果我们避免了过度消耗 – 如果3能处理的话,不需要300台服务器) 。

我们是一家提供免费在线可读书籍的国际在线发行商。 这意味着我们有大量的静态内容 – 主要是许多GB的闪存文件。 我们最近去升级服务器操作系统到CentOS x64,并将服务器软件从Apache改为Nginx(用于静态内容)+ Apache。 然而,也出现了一些问题,我们遇到了一些意想不到的停机时间,即使只有几个小时,也给我们造成了严重的损失。

我对集群设置的想法如下:
– 服务器1:我们目前的MySQL数据库。
– 服务器2,服务器3,服务器4:我们的应用程序,也就是我们在Apache上的PHP代码
– 服务器4:仅支持静态内容(5kb至3mb的图像,5MB至100MB的PDF,200kb至20MB的Flash文件等)

我相信,如果三台应用服务器中的一台发生故障,这个设置将帮助我们避免宕机,除了在三台服务器之间共享负载,而不是像现在一切(静态+数据库+应用程序)在一台机器上那样。

我想从你的退伍军人是一些有用的链接关于服务器负载分享,提示和技巧关于这个问题和我上面提出的build议..我作为一个PHP开发人员有限的经验,并没有太多,所以如果任何人可以提供任何宝贵的洞察到他们的设置或不同的硬件/软件的经验,我将非常感谢。

另外,什么是正确的术语? ? 簇? 我应该知道的任何其他条款。 请温柔一点,我只是开始踏入服务器世界。

谢谢

编辑:新的计划如下,请让我知道你的想法:

应用程序集群

  • 运行Nginx(或Cherokee)的3台服务器和使用PHP的Apache。 Nginx会在同一台服务器上处理对静态内容的请求(CSS,JS,缩略图,精灵,图片)
  • 由于我们目前有2个stream量相当大的网站(一个是数据库更新,另一个是静态内容),我们正在考虑将这两个网站放在这个应用服务器上。
  • 这两个应用程序将有两个负载平衡器在三台服务器之间分配stream量。 服务器将是相同的克隆,并且稍后可轻松扩展。

数据库集群

  • 两台运行MySQL的服务器,克隆。 负载平衡器。 备份可以自行完成,因为它们不太可能同时死亡。 App群集上的两个应用程序都将使用这个群集 – 一个会执行平均读取负载,另一个会执行高读写负载。

静态集群

  • 两台服务器只有静态内容,基本上只存储成千上万的PDF,ZIP和Flash文件。 没有备份,不可能有效地执行。 服务器是彼此的备份。 这个静态集群将为App集群上的两个应用程序提供更大的静态内容。

这是现实吗? 如果有的话,你会build议什么? 你会添加什么?

几年来我学到的一些一般的东西:

  • 请参阅此问题,获取有关性能,扩展性和高可用性网站主题的优秀书籍列表。
  • “群集”是正确的术语。 您正在使用多台机器来提供一个站点,以提高可用性。 您也可以使用集群来引用您的设置的特定部分:例如服务器2 + 3 + 4将是您的应用程序集群。
  • 在应用程序级别只有冗余是否有任何原因? 那么MySQL和静态内容呢? 特别是因为你的静态内容相对较大,如果需要的话,可以向N个并发用户提供多less带宽。 如果MySQL服务器发生故障或服务器#4有一个坏的磁盘,会发生什么?
  • 如果你把所有东西从一台机器上移开,除非你不介意花费超过你的需要。 例如,在类似的情况下,我发现从1台服务器到3台服务器的性能提升比预期要大。 在分割成多个服务器后,您可能会发现新的瓶颈位于不同的区域。
  • 正如你计划扩展现在不要完全忘记可能的未来扩展。 现在有点前瞻性的思想和devise可以为你节省时间。 例如,您现在有一台静态服务器,但是一年中需要多台服务器,或者多台服务器在地理位置上分布。
  • 考虑创build脚本来帮助设置特定types的服务器…手动执行每一个变老,你总是忘记一个步骤。 我最近做了这个,希望我从一开始就做到了。 运行一个可以在几分钟内自动安装步骤的脚本可以节省大量时间。
  • 当你获得更多的服务器时,遇到某种硬件故障的可能性就会变高。 计划这个和玩假设的游戏:如果硬盘驱动器在服务器X失败怎么办? 我们会输什么? 这个网站要多长时间? 需要多久才能修复? 等等…

我认为这个普通的东西很好。 为了决定你要做什么,你需要坐下来思考几件事情:

  1. 每个组件的当前负载是多less? 预计的未来负荷是多less?
  2. 你想要处理的故障场景是什么? 是什么导致了你最后的失败

第一个问题告诉你每个级别需要的最less服务器数量,以便拥有一个正在运行的站点。

第二个问题告诉你,为了确保你的网站继续运行,你真正想要的硬件有多less。 当你布置失败模式时,你会发现你需要考虑的不仅仅是服务器:防火墙,上游的互联网连接,发电机,物理位置等等。 您还需要解决一些问题,例如让pipe理员随时待命处理在凌晨3点发生的服务器崩溃以及需要监视唤醒pipe理员并让他们知道事情已经崩溃的情况。 如果之前的失败是由于configuration或编程错误引起的,那么可以考虑在开发和生产之间build立一个分级环境,以便在程序员完成其更改之后以及更改生效之前进行testing。