文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  使用复制进行横向扩展

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.

如果负责数据库访问的代码部分已正确抽象/模块化,则将其转换为使用复制设置运行应该非常顺利且轻松。更改数据库访问的实现,将所有写入操作发送到源,并将读取操作发送到源或副本。如果您的代码没有这种抽象级别,则设置复制系统会为您提供清理代码的机会和动力。从创建实现以下功能的包装库或模块开始

  • safe_writer_connect()

  • safe_reader_connect()

  • safe_reader_statement()

  • safe_writer_statement()

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

然后将您的客户端代码转换为使用包装库。这最初可能是一个痛苦且可怕的过程,但从长远来看它会有所回报。所有使用上述方法的应用程序都能够利用源/副本配置,甚至包括涉及多个副本的配置。代码更易于维护,添加故障排除选项也很简单。您只需要修改一两个函数(例如,记录每个语句花费了多长时间,或者哪些语句导致了错误)。

如果您编写了大量的代码,您可能希望通过编写转换脚本来自动执行转换任务。理想情况下,您的代码使用一致的编程风格约定。如果没有,那么您可能最好重写它,或者至少通读并手动将其规范化为使用一致的风格。