如何扩展您的1服务器Rails应用程序

时间:2015-08-20 04:51:31

标签: ruby-on-rails amazon-web-services scale autoscaling

我在一个使用乘客,apache和MySQL的VPS上运行一个rails应用程序。我正在通过以下简单设置将其移至亚马逊AWS:

ELB> Web服务器> MySQL的

假设我预计每日用户数量会出现大幅增长,并且希望开始使用多个实例在Amazon AWS上进行扩展。新手从这个旅程开始在哪里?我是否只是从生产配置的Web服务器创建AMI,并在需要时让ASG启动它们?

据我所知,AWS会在负载需要时增加使用自动扩展组的实例数,但是我是否需要在Rails应用程序中以不同方式构建任何实例,以便在多个接口上大规模运行?

1 个答案:

答案 0 :(得分:3)

水平扩展的问题在于它实际上取决于应用程序。没有"只是添加水"如何做到这一点。

但是你可以在一开始就遵循一些通用的食谱:

  1. 将MySQL服务器提取到一个单独的实例中,该实例能够承受更高的负载。然后根据需要创建连接到MySQL数据库的尽可能多的工作者(即app)实例。您可以在MySQL服务器满足请求之前继续这样做,并且无法再跟上负载。

  2. 完成步骤1后,您可以添加MySQL副本并设置主从复制。这将使您拥有一个MySQL集群,其中一个服务器可以接受写入,而所有其他服务器都是只读的。设置完成后,更改应用程序以将SELECT发送到只读副本,并将INSERT / DELETE / UPDATE发送到可写主服务器。这种方法基于以下事实:大多数应用程序的读取方式比写入方式更频繁。对你来说情况可能并非如此,但如果是的话,它会让你的漂浮很长。在您使MySQL主服务器写入性能饱和之前。

  3. 一旦你从步骤2中挤出了所有内容,就可以继续对数据进行分片。现在,这越来越依赖于您的应用程序。但我会提供一个盲目的例子来传达这个想法。比如说,你有一个以用户为中心的应用程序(例如私人相册,没有共享功能),每个用户都有一个名字。在这种情况下,您可以创建两个完全独立的集群,其中第一个集群将为名称以A-M开头的用户提供服务,第二个集群将为具有N-Z的集群提供服务。它实际上使负载减少了两倍,但使整个架构复杂化。

  4. 虽然通用,但这些配方可以帮助您构建一个非常可靠的应用程序,能够每天为数百万用户提供服务,然后再被迫提出更多奇特的扩展方式。

    希望这有帮助!