我最近在我创建的Facebook应用程序上遇到了大量的流量(主要是为了教育,没有任何营销意图)
不用说,我在创建应用程序时没有考虑可伸缩性.我现在处于MediaTemple托管的微弱虚拟服务器根本没有削减它的位置,而且它真正归结为机器的原始I/O. 由于这个项目到目前为止对我如此教育,我想我会以此为契机来了解Amazon EC2平台.
应用程序本身是用PHP(使用Zend Framework)和MySQL后端创建的.我尽可能使用memcached进行应用程序缓存.我花了整个周末玩EC2,启动实例,安装我想要的软件包,以及将EBS卷安装到实例.
但是,为可扩展性带来良好结果的下一个合乎逻辑的步骤是什么?我是为MySQL启动AMI实例还是为Apache服务启动一个?或者我只是根据需要复制实例多次,然后在前端进行某种负载平衡?理想情况下,我想拥有一个集中式数据库,因为我会在所有数据库行中汇总统计信息,但是,这不是一个很难的要求(我可能会想出一些特定于应用程序的解决方案来解决这个问题)
我知道这可能不是一个直截了当的答案,所以欢迎提出意见和建议.
这么多问题 - 尽管它们都很好.
在缩放方面,您有几个选择.
首先是从一个盒子开始.你可以向上扩展 - 使用更强大的盒子.EC2具有各种大小的实例.这涉及每次需要更大的盒子时的服务器迁移.
更容易添加服务器.您可以从Apache和MySQL的单个实例开始.然后,当流量增加时,为MySQL创建一个单独的实例,并将您的应用程序指向这个新实例.这在应用程序和数据库之间创建了一个很好 听起来这是一个基于您的流量的良好起点.
接下来,您可能需要更多应用程序功能(Web服务器)或更多数据库功能(MySQL群集等).您可以将DNS记录指向运行某些负载平衡软件的几个前箱(尝试Pound).这些负载平衡服务器将请求分发给您的Web服务器.EC2有Elastic Load Balancing,它可以替代自己管理它,并且可能更容易 - 我没有亲自使用它.
还有其他需要注意的事项 - EC2没有持久存储.您必须使用Elastic Block Store自行管理持久数据.本指南是一个关于如何执行此操作的优秀教程,具有自动备份功能.
如果您认为EC2是前进的方向,我建议您购买一些预留实例.你可以在3年内节省约50%的费用!
最后,您可能对像RightScale这样的服务感兴趣,它们提供成本管理服务.还有其他提供商可用.
第一步是分开关注点.我会分开一个单独的MySQL服务器,可能还有一个专用的memcached框,具体取决于你的负载有多高.然后我会监控每个盒子上的内存和CPU使用情况,看看哪里可以优化.这可以通过旋转新的Media Temple盒来完成.我还建议Slicehost使用更便宜,更开发人员的替代方案.
一些更低预算的PHP部署优化:
使用更高效的Web服务器(如nginx)来处理静态文件服务,然后将代理应用程序请求反向到单独的Apache实例
使用像PHP-FPM之类的东西在nginx上使用FastCGI实现PHP,彻底摆脱Apache.如果您的Apache需求不会超出mod_rewrite
更简单的Apache模块,那么这可能是一个很好的选择.
如果您更喜欢更高级别,自己动手的方法,您可能需要查看Scalr(Google代码中的代码).值得在他们的网站上观看视频.它使用Amazon EC2构建可扩展的托管环境.该技术是开源的,因此您可以在自己的管理服务器上下载并自行实施.(也许是你的Media Temple盒子?)Scalr预装了AMI(EC2设备),可用于一些常见用例.
web:利用nginx及其许多功能:软件负载平衡,静态文件服务等.您可能只有其中之一,它可能会实现与Amazon的EBS或持久存储解决方案的某种连接,如上所述dcaunt.
app:Apache和PHP的应用程序服务器.您可能拥有其中的许多,如果需要处理更多负载,它们将自动创建.这种类型的服务器将保存您的ZF应用程序的副本.
db:带MySQL的数据库服务器.同样,您可能拥有其中的许多,如果需要处理更多负载,则会自动创建更多从属实例.
memcached:一个专用的memcached服务器,可用于在所有应用实例中进行集中式缓存,会话管理等.
Scalr选项可能会进行一些更改配置,但如果您觉得缩放需要快速加速,则可能需要花费时间和精力.