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



我有一个运行在单个VPS上的rails应用程序,它使用passenger、apache和MySQL。我将通过以下简单设置将其迁移到Amazon AWS:

ELB> Web Server> MySQL

假设我预计每天的用户会有一个巨大的高峰,并希望开始在亚马逊AWS上使用多个实例进行扩展。新手从哪里开始这段旅程?我是否只需从我的生产配置的web服务器创建一个AMI,然后让ASG在需要时启动它们?

我知道AWS会根据负载要求增加使用自动伸缩组的实例数量,但是我是否需要在Rails应用程序中构建任何不同的架构,以便它在多个接口上大规模运行?

水平缩放的问题在于它实际上取决于应用程序。没有"直接加水"的方法。

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

  1. 将MySQL服务器提取到一个单独的实例中,该实例能够承载更高的负载。然后根据需要创建尽可能多的连接到MySQL数据库的worker(即app)实例。

  2. 你可以继续这样做,直到你的MySQL服务器被请求饱和,不能再跟上负载。
  3. 完成第1步后,可以添加MySQL副本并设置主从复制。这将给您留下一个MySQL集群,其中一个服务器可以接受写,而所有其他服务器都是只读的。设置完成后,更改应用程序,将SELECT命令发送到只读副本,并将INSERT/DELETE/UPDATE命令发送到可写主服务器。这种方法是基于这样一个事实,即大多数应用程序的读操作要比写操作频繁得多。对你来说可能不是这样,但如果是这样的话,它会让你漂浮很长时间。

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

虽然是通用的,但这些方法可以帮助你构建一个非常可靠的应用程序,能够每天为数百万用户服务,而不是被迫提出更奇特的扩展方式。

希望这对你有帮助!

最新更新