扩展 mysql 数据库是一件相当困难的事情,但它肯定已经完成了很多次,并且有很多最佳实践可供您利用。您应该知道的第一件事是,在您暂时担心扩展写入之前,您可能需要先扩展读取。
使用复制可以很容易地完成扩展读取。有几种工具可以让管理复制变得更加容易,例如Amazon RDS。一般来说,许多 Web 服务器可以连接到许多数据库(如其他人所建议的那样),但是一旦您有大量流量、连接或您正在执行的任何其他操作会在服务器上产生负载,您很快就会遇到规模问题。
由于复制的服务器是只读的,您需要根据您正在执行的操作来管理您连接到的服务器。即,如果您有一个用户表,则在创建、更新或删除用户时,您需要使用“写入”数据库(主要的“源”服务器),但在读取用户表时,您可以使用其中一个只读副本。这减少了主写入服务器上的负载(允许它处理更多写入),并且由于您可以在负载均衡器后面拥有多个读取数据库,您可以在很长一段时间内摆脱这种结构并在数十个范围内扩展读取在您遇到任何重大问题之前数据库服务器(但是大多数应用程序都逃脱了 1-3)。
在某些情况下,您需要将写入数据库用于读取操作(尽管您应该尽可能避免使用它),因为由于复制写入数据库查询的延迟,读取副本可能会稍微落后于写入数据库,但是大多数您应该能够编写代码的时间知道读取数据库可能会延迟(即在合理的时间段内排队操作,以便更新将在所有读取服务器上传播)并且只需使用您的读取数据库之一而不是比写数据库。
除此之外,要处理的关键项目是确保您拥有有效的索引并应用其他最佳实践来维护合理的数据结构。您可能还想考虑拥有 3 个不同的数据库服务器“组”。我通常喜欢有写、读和“统计”数据库组。用于创建、更新和删除操作(以及用于更新的选择)的写入组,必须快速返回结果的一般读取项的读取,以及任何将处于高负载且您不依赖的东西的统计信息on 以获得快速响应(这会使对时间不敏感的繁重查询远离您的读取数据库,您需要快速响应以进行一般读取)
一旦遇到无法再购买更大硬件并且接近最大化写入容量的情况,您将需要考虑分片,但这会占用大量流量/数据(所以不要担心)除非您已经完成了上述所有操作)。