【问题标题】:Architecture of a PHP app on Amazon EC2Amazon EC2 上的 PHP 应用程序架构
【发布时间】:2010-12-08 13:10:51
【问题描述】:

我最近在我创建的 Facebook 应用上遇到了大量流量(主要是为了教育,而不是出于任何营销目的)

不用说,我在创建应用程序时并没有考虑可扩展性。我现在处于一个位置,MediaTemple 托管的微薄虚拟服务器根本没有削减它,它实际上归结为机器的原始 I/O。由于到目前为止这个项目对我的启发很大,我想我会借此机会了解 Amazon EC2 平台。

应用程序本身是用 PHP(使用 Zend 框架)和 MySQL 后端创建的。我尽可能通过 memcached 使用应用程序缓存。我整个周末都在玩 EC2,启动实例,安装我想要的包,并将 EBS 卷安装到实例。

但是下一个合理的步骤是什么?我是否为 MySQL 启动一个 AMI 实例,为 Apache 服务启动一个?还是我只是根据需要多次复制实例,然后在前端进行某种负载平衡?理想情况下,我希望有一个集中式数据库,因为我会汇总所有数据库行的统计信息,但是,这不是硬性要求(我可能会想出一些特定于应用程序的解决方案来解决这个问题)

我知道这可能不是一个直截了当的答案,因此欢迎提出意见和建议。

【问题讨论】:

    标签: php zend-framework amazon-ec2


    【解决方案1】:

    这么多问题 - 不过都很好。

    在缩放方面,您有几个选择。

    首先是从一个盒子开始。您可以向上扩展 - 使用更强大的盒子。 EC2 有各种大小的实例。每次您想要一个更大的盒子时,这都会涉及一次服务器迁移。

    更容易添加服务器。您可以从 Apache 和 MySQL 的单个实例开始。然后当流量增加时,为 MySQL 创建一个单独的实例并将您的应用程序指向这个新实例。这在应用程序和数据库之间创建了一个很好的层。根据您的流量,这听起来像是一个很好的起点。

    接下来,您可能需要更多的应用程序能力(Web 服务器)或更多的数据库能力(MySQL 集群等)。您可以让您的 DNS 记录指向运行某些负载平衡软件的几个前端框(尝试Pound)。这些负载平衡服务器将请求分发到您的网络服务器。 EC2 有Elastic Load Balancing,这是您自己管理的替代方法,并且可能更容易 - 我没有亲自使用过。

    需要注意的其他事项 - EC2 没有持久存储。您必须使用 Elastic Block Store 自己管理持久数据。 This guide 是一个很好的教程,教你如何做到这一点,自动备份。

    如果您决定采用 EC2,我建议您购买一些预留实例。您将在 3 年内节省约 50% 的费用!

    最后,您可能对RightScale 这样的服务感兴趣,这些服务提供收费的管理服务。还有其他可用的提供程序。

    【讨论】:

    • 这听起来像是我要迈出的第一步。问题:一个 EBS 卷可以挂载到多个实例吗?我想我可以将 /var/www 目录存储在 EBS 上的 apache 服务器上,并将 mysql 数据存储在 EBS 上的 mysql 服务器上。
    • 很遗憾没有。将 EBS 视为硬盘,一次只能附加到一个实例。您可以克隆它们,但克隆的 EBS 不会获得任何更改或新数据。你的任务是编写一个自动设置新实例的脚本——从 subversion 中检查你的代码,设置 apache,通知负载均衡器它已准备好接收请求。我相信,像 RightScale 这样的服务可以让这部分变得更容易。
    【解决方案2】:

    第一步是分离关注点。我会用一个单独的 MySQL 服务器和可能的专用 memcached 盒子分开,这取决于你的负载有多高。然后我会监控每个盒子上的内存和 CPU 使用情况,看看你可以在哪里优化。这可以通过剥离新的 Media Temple 盒子来完成。我还建议 Slicehost 提供更便宜、对开发人员更友好的替代方案。

    一些更低成本的 PHP 部署优化:

    • 使用更高效的 Web 服务器(例如 nginx)来处理静态文件服务,然后将代理应用请求反向到单独的 Apache 实例
    • 使用 PHP-FPM 之类的东西在 nginx 上使用 FastCGI 实现 PHP,完全摆脱 Apache。如果您的 Apache 需求没有超出 mod_rewrite 和更简单的 Apache 模块,这可能是一个很好的选择。

    如果您更喜欢更高级的自己动手的方法,您可能需要查看Scalr (code at Google Code)。值得在他们的网站上观看视频。它使用 Amazon EC2 提供可扩展的托管环境。该技术是开源的,因此您可以下载并在自己的管理服务器上自行实施。 (也许是您的 Media Temple 盒子?)Scalr 具有可用于一些常见用例的预构建 AMI(EC2 设备)。

    • web:利用 nginx 及其许多功能:软件负载平衡、静态文件服务等。您可能只有其中一个,它可能会实现与 Amazon 的 EBS 的某种连接,或者dcaunt 提到的持久存储解决方案。
    • app:带有 Apache 和 PHP 的应用服务器。你可能有很多这样的,如果需要处理更多的负载,它们会自动创建。这种类型的服务器将保存您的 ZF 应用程序的副本。
    • db:带有 MySQL 的数据库服务器。同样,您可能会有很多这样的实例,如果需要处理更多负载,则会自动创建更多从属实例。
    • memcached:专用的 memcached 服务器,可用于在所有应用实例中进行集中缓存、会话管理等。

    Scalr 选项可能需要进行更多配置更改,但如果您觉得您的扩展需要快速加速,那么花时间和精力可能是值得的。

    【讨论】:

    • Scalr 看起来很有趣。不过,这可能比我的需求高出一步。我可能会从您的第一个建议开始,然后从那里开始
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多