在Amazon AWS上重新设计服务器体系结构

时间:2012-09-08 07:33:15

标签: architecture nginx amazon-ec2 amazon-web-services memcached

我们目前的项目架构如下。 有2个亚马逊实例。两者都安装了Ubuntu 10.10。

实例1:(m1.large) - 此实例安装了Php,Apache和MySql。 它包含主要网站+ API(以Php开发)+数据库(MySql)

实例2:(t1.micro) - 此实例安装了Php,Apache和MySql。 它包含一个Javascript。

客户端 - 服务器互动: 在客户端,有一块JS代码在客户端加载 Instance 2 的JS文件。此JS文件创建请求并将其发送到实例1 上的API。 实例1上的API生成响应并将其发送到客户端。

在实例1中,有每周运行的cron进程,即每周日约5-6小时。

实例1的最大CPU利用率约为80%,而在周日当cron设置为运行时,它会超过95%。主实例每天的平均请求数约为225k。

**There is no issue on instance 2 of CPU utilization.Size of database is 7.5 GB**

需要新架构: 我们可以看到,在当前的架构中,CPU利用率很高。如果我们想要提供更多请求,那么这种架构效率不高。随着客户端数量的增加,服务器和数据库大小的请求数量也将增加。

您能否建议新的架构设计? 我们还计划将我们的数据库从MySql更改为MongoDB。另外,将数据库与实例1分开。这是正确的决定吗?

任何人都可以建议我们可以为Memcached,nginx等新架构实施的任何新技术。

谢谢。

5 个答案:

答案 0 :(得分:5)

以下是亚马逊Reference Architectures之一的链接,可能有所帮助:

enter image description here

简而言之:

  • 将您的基础架构拆分为层(Web,App,Data)
  • 当流量增加/减少时,使用自动缩放组旋转/缩小
  • 跨可用区划分高可用性层
  • 使用CloudFront托管静态图片/ javascript /等。对速度敏感 项目

答案 1 :(得分:0)

这是一个非常普遍的问题,但这里有一些要考虑的问题:

  • 从应用服务器上取下您的数据库。您可以将Amazon RDS用于亚马逊托管的MySQL实例。
  • 尝试使用单独的Web服务器来获取静态资源。 nginx将是一个不错的选择。
  • nginx还可以作为前端代理将您的动态PHP请求转发到后端服务器。
  • 此选项还为您提供更轻松的可伸缩性。如果您需要额外的计算能力,只需添加更多后端PHP服务器,将它们添加到您的nginx配置中即可完成。
  • 在您的应用中,尝试使用连接到memcache的透明缓存层(可能应该安装在另一个实例上)。如果在缓存中找不到结果,请构建它(例如,通过查询数据库)并将其存储在缓存中。以后的请求可以使用缓存中的结果。

答案 2 :(得分:0)

这里有一些你可能想要考虑的事情:

  1. 您需要知道您获得的最大连续请求数,而不是一天的平均请求数。您可以通过在apache.conf中设置(达到某个限制)并使用autoscaling增加ec2实例的配置来改进和测试连续请求apache的数量。由于周日的cron作业导致cpu利用率上升,因此可以自动调整cpuutilization。

  2. 您可以考虑使用Cloudfront,它可以提高性能(如检索时间),还可以使应用程序具有高可用性。

  3. 如果您打算转到MongoDb,您将无法使用RDS。如果你坚持使用Mysql,你应该使用RDS。

  4. 在考虑内存缓存时,尝试在应用程序级别和数据库级别实现缓存,因为内存缓存可以给你一些差异。

  5. Nginx是提供静态内容的好选择,可以作为一个好的代理服务器。

答案 3 :(得分:0)

这里的其他人真的很好。我想我会讨论静态内容,因为其他答案中的共同主题是使用像Nginx这样的东西。对我来说,我发现将图像,javascript,CSS等放入S3存储桶并放置Cloudfront发行版更容易,而不是甚至不得不试图为此内容提供Web服务器。您可以在边缘节点上获得更接近最终用户的静态内容,而不必担心任何扩展方面。

我还建议迁移到更新版本的Ubuntu(也许是Canonical的12.04)。

我会尝试不在任何实际的生产Web服务器上运行大型cron进程(即那些消耗大量CPU或磁盘周期的进程)。也许根据需要启动相同的实例,而不是在负载均衡器中执行这些任务。您还可以适当地调整/扩展Web服务器(不适用于cron运行时的最坏情况)

是否使用Mongo与MySQL实际上取决于您的数据结构(即它更适合于关系结构或无架构结构)。

答案 4 :(得分:0)

嗯,我同意@Mike Brant。这里的每个人都很好的投入和底线是 - “是否使用Mongo与MySQL实际上取决于您的数据结构(即它更适合于关系结构或无架构结构)。” 关于静态内容问题,我认为Nginx是一个相当不错的选择,但我不排除Cloudfront(主要是因为缺乏足够的经验)。但是对于你的数据库选择,如果你选择NoSQL,我认为{{ 3}}是一个不错的选择,如果你选择MySQL,我建议你除了RDS之外还要看看mongoDB。干杯:)