MySQL 8.0 参考手册  / 第十七章复制  / 17.4 复制解决方案  /  16.3.4 使用复制进行横向扩展

16.3.4 使用复制进行横向扩展

您可以将复制用作横向扩展解决方案;也就是说,您希望在一些合理的限制范围内将数据库查询的负载分散到多个数据库服务器上。

由于复制是从一个源到一个或多个副本的分布,因此在具有大量读取和少量写入/更新的环境中使用复制进行横向扩展效果最佳。大多数网站都属于此类,用户浏览网站、阅读文章、帖子或查看产品。更新仅在会话管理期间发生,或者在进行购买或向论坛添加评论/消息时发生。

这种情况下的复制使您能够在副本上分发读取,同时仍然使您的 Web 服务器能够在需要写入时与源通信。您可以在图 16.1 “在横向扩展期间使用复制来提高性能”中看到此场景的示例复制布局 。

图 16.1 在横向扩展期间使用复制来提高性能

来自客户端的传入请求被定向到负载平衡器,该负载平衡器在多个 Web 客户端之间分配客户端数据。 Web 客户端进行的写入被定向到单个 MySQL 源服务器,Web 客户端进行的读取被定向到三个 MySQL 副本服务器之一。 复制发生在从 MySQL 源服务器到三个 MySQL 副本服务器的地方。

如果负责数据库访问的代码部分已被适当地抽象/模块化,那么将其转换为使用复制设置运行应该非常顺利和容易。更改数据库访问的实现以将所有写入发送到源,并将读取发送到源或副本。如果您的代码没有这种抽象级别,设置一个复制的系统会给您机会和动力来清理它。首先创建一个实现以下功能的包装器库或模块:

  • safe_writer_connect()

  • safe_reader_connect()

  • safe_reader_statement()

  • safe_writer_statement()

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

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

如果您编写了很多代码,您可能希望使用标准 MySQL 发行版附带的替换实用程序自动执行转换任务,或者编写您自己的转换脚本。理想情况下,您的代码使用一致的编程风格约定。如果没有,那么无论如何重写它可能会更好,或者至少通过并手动规范化它以使用一致的样式。