Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Using Replication for Scale-Out

19.4.5 使用复制来实现横向扩展

您可以使用复制作为横向扩展解决方案,即在多个数据库服务器之间分配数据库查询负载,具有合理的限制。

因为复制从一个源到一个或多个副本工作,所以使用复制来实现横向扩展最适合在读取多、写入少的环境中。大多数网站都属于这种情况,用户浏览网站、阅读文章、帖子或查看产品。只有在会话管理、购买或添加评论/留言到论坛时才会进行更新。

在这种情况下,复制使您可以将读取分布到副本上,同时仍然使Web服务器可以在需要写入时与源服务器通信。您可以在图 19.1“使用复制来改进横向扩展性能”中看到一个示例复制布局。

图 19.1 横向扩展性能改进

Incoming requests from clients are directed to a load balancer, which distributes client data among a number of web clients. Writes made by web clients are directed to a single MySQL source server, and reads made by web clients are directed to one of three MySQL replica servers. Replication takes place from the MySQL source server to the three MySQL replica servers.

如果您的代码中负责数据库访问的部分已经被正确地抽象/模块化,那么将其转换为使用复制设置应该非常smooth和容易。如果您的代码没有这种抽象级别,那么设置复制系统将给您机会和动机来清洁它。从创建一个wrapper库或模块开始,该模块实现以下函数:

  • safe_writer_connect()

  • safe_reader_connect()

  • safe_reader_statement()

  • safe_writer_statement()

每个函数名中的“safe_”表示该函数处理所有错误条件。您可以为函数使用不同的名称。重要的是拥有一个统一的接口来连接读取、连接写入、执行读取和执行写入。

然后将客户端代码转换为使用wrapper库。这可能是一个痛苦和可怕的过程,但长期来说是值得的。所有使用这种方法的应用程序都能够利用源/副本配置,甚至包括多个副本。代码变得更易于维护,添加故障排除选项也变得很容易。您只需要修改一两个函数(例如,记录每个语句所需的时间或哪个语句导致错误)。

如果您编写了很多代码,您可能想要通过编写转换脚本来自动化转换任务。理想情况下,您的代码使用一致的编程风格约定。如果不是,那么您可能需要重写它,或者至少手动地将其规范化以使用一致的风格。