mysql - 多个 Rails 引擎与一个 MySQL 服务器通信,用于水平扩展应用程序服务器

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

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

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

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

最佳答案

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

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

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

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

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

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

关于mysql - 多个 Rails 引擎与一个 MySQL 服务器通信,用于水平扩展应用程序服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791099/

相关文章:

php - 存储php mysql ajax搜索引擎结果

ruby-on-rails - 将/profiles/1/edit/details 重写为/me/profile/details 的最佳方法?

ruby-on-rails - 如何在删除:destroy in Rails?中传递ID

ruby-on-rails - Rails 使用复数表名,即使我告诉它使用单数

android - 我应该选择什么 AWS 开发工具包?

mysql - 我在插入选择时收到不正确的日期值

php - MYSQL查询哪些年份有记录

performance - 是否有关于 Google App Engine 或其他云平台性能的报告或论文

mysql - 最优二元线性回归计算

amazon-ec2 - github repo 中缺少 Ansible 动态库存