【问题标题】:multiple rails engines talking to one mySQL server for horizontally scaling application servers多个 Rails 引擎与一个 mySQL 服务器通信以水平扩展应用程序服务器
【发布时间】:2013-03-25 08:10:13
【问题描述】:

我见过像 this 这样的图片,其中多个 Rails 引擎写入单个 mySQL 服务器。

1) 这可能吗?或者 Rails 是否希望每个应用程序服务器写入一个数据库服务器?

2) 如果可以,它是如何实现的?应用服务器和写数据库服务器之间是否有队列和调度器?

【问题讨论】:

  • 我不确定您是否在讨论这个问题,或者真的不知道 mysql 和其他 RDBMS 的工作原理。
  • 我看过 Octopus,但它说它用于分片,其中多个数据库由同一个 Rails 应用程序使用。 IE。一对多而不是多对一。
  • @datasage - 我不是在拖钓。每隔一段时间,我们都会问一些愚蠢的问题,也许这就是一个?
  • Mysql 可以处理多个数据库和连接。所以是的,您可以将多个 Rails 应用程序连接到同一个 mysql 服务器。应用服务器不做任何读/写管理。 mysql会的。

标签: mysql ruby-on-rails amazon-ec2 horizontal-scaling


【解决方案1】:

扩展 mysql 数据库是一件相当困难的事情,但它肯定已经完成了很多次,并且有很多最佳实践可供您利用。您应该知道的第一件事是,在您暂时担心扩展写入之前,您可能需要先扩展读取。

使用replication 可以很容易地完成缩放读取。有几种工具可以让管理复制变得更加容易,例如Amazon RDS。一般来说,许多 Web 服务器可以连接到许多数据库(如其他人所建议的那样),但是一旦您有大量流量、连接或您正在执行的任何其他操作会在服务器上产生负载,您很快就会遇到规模问题。

由于复制的服务器是只读的,因此您需要根据正在执行的操作来管理要连接的服务器。 IE。如果您有一个用户表,则在创建、更新或删除用户时,您需要使用“写入”数据库(主要的“源”服务器),但在读取用户表时,您可以使用其中一个只读副本。这减少了主写入服务器上的负载(允许它处理更多写入),并且由于您可以在负载均衡器后面拥有多个读取数据库,您可以在很长一段时间内摆脱这种结构并在数十个范围内扩展读取数据库服务器在您遇到任何重大问题之前就关闭了(但是大多数应用程序都可以在 1-3 次之后成功)。

在某些情况下,您需要将写入数据库用于读取操作(尽管您应该尽可能避免使用它),因为由于复制写入数据库查询的延迟,读取副本可能会稍微落后于写入数据库,但是大多数时候,您应该能够在知道读取数据库可能会延迟的情况下编写代码(即在合理的时间段内排队操作,以便更新将在所有读取服务器上传播)并且只需使用您的一个读取数据库而不是写入数据库。

除此之外,要处理的关键事项是确保您拥有高效的索引并应用其他最佳实践来维护合理的数据结构。您可能还想考虑拥有 3 个不同的数据库服务器“组”。我通常喜欢有写、读和“统计”数据库组。用于创建、更新和删除操作(以及用于更新的选择)的写入组,必须快速返回结果的一般读取项的读取,以及任何将处于高负载且您不依赖的东西的统计信息on 以获得快速响应(这会使对时间不敏感的繁重查询远离您的读取数据库,您需要快速响应以进行一般读取)

一旦您遇到无法再购买更大硬件且写入容量接近极限的情况,您将需要考虑分片,但这会占用大量流量/数据(所以不要除非您已经完成上述所有操作,否则请担心它)。

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2017-05-13
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多