我见过像this这样的图片,其中多个rails引擎写入单个mySQL服务器。
1)这可能吗?或者Rails是否希望每个应用程序服务器都写入一个数据库服务器?
2)如果可能,它是如何完成的?应用程序服务器和写入数据库服务器之间是否有队列和调度程序?
答案 0 :(得分:0)
扩展一个mysql数据库是一件非常困难的事情,但它确实已经做了很多次,并且有很多最佳实践可供你利用。您应该知道的第一件事是,在您担心缩放写入一段时间之前,您可能需要首先扩展读取。
使用replication可以非常轻松地进行缩放读取。有几种工具可以使管理复制变得更加容易,例如Amazon RDS。一般来说,许多Web服务器可以连接到许多数据库(如其他人所建议的那样),但是一旦您有大量流量,连接或正在执行的任何其他操作会在服务器上产生负载,您很快就会遇到规模问题。
由于复制的服务器是只读的,因此您需要根据正在执行的操作来管理连接到的服务器。即如果您有用户表,则在创建,更新或删除用户时,您需要使用“写入”数据库(主“源”服务器),但在读取用户表时,您可以使用其中一个只读副本。这减少了主写入服务器上的负载(允许它处理更多的写入),并且因为您可以在负载均衡器后面有多个读取数据库,您可以在很长一段时间内使用这种结构并且可以在数十个时间内读取数据。数据库服务器在您遇到任何重大问题之前(但大多数应用程序都会以1-3的形式消失)。
在某些情况下,您需要使用您的写入数据库进行读取操作(尽管您应该尽可能地避免它),因为由于复制写入数据库查询的延迟,读取副本可能略微落后于写入dbs,但是大多数时候你应该能够编码知道读取数据库有可能被延迟(即队列动作在一段合理的时间内,以便更新将在所有读取的服务器上传播),并且只需使用你的一个读取dbs而不是写入db。
除此之外,要处理的关键项目是确保您拥有高效的索引并应用其他最佳实践来维护合理的数据结构。您可能还想考虑拥有3个不同的“数组”数据库服务器。我一般喜欢写,读和“统计”数据库组。用于创建,更新和删除操作的写入组(以及用于更新的选择),对于必须快速返回其结果的一般读取项的读取,以及将在高负载下并且您不依赖的任何内容的统计信息为了获得快速响应(这样可以保持对读取数据库没有时间敏感性的重度查询,您需要快速响应一般读取)
一旦你遇到无法再购买更大硬件且你的写入容量接近最大化的情况,你需要研究分片,但这需要大量的流量/数据(所以不要担心它,除非你已经完成了上述所有工作。)