您可以将复制用作横向扩展解决方案;也就是说,您希望在一些合理的限制范围内将数据库查询的负载分散到多个数据库服务器上。
由于复制是从一个源到一个或多个副本的分布,因此在具有大量读取和少量写入/更新的环境中使用复制进行横向扩展效果最佳。大多数网站都属于此类,用户浏览网站、阅读文章、帖子或查看产品。更新仅在会话管理期间发生,或者在进行购买或向论坛添加评论/消息时发生。
这种情况下的复制使您能够在副本上分发读取,同时仍然使您的 Web 服务器能够在需要写入时与源通信。您可以在图 17.1 “在横向扩展期间使用复制来提高性能”中看到此场景的示例复制布局 。
如果负责数据库访问的代码部分已被适当地抽象/模块化,那么将其转换为使用复制设置运行应该非常顺利和容易。更改数据库访问的实现以将所有写入发送到源,并将读取发送到源或副本。如果您的代码没有这种抽象级别,设置一个复制的系统会给您机会和动力来清理它。首先创建一个实现以下功能的包装器库或模块:
safe_writer_connect()
safe_reader_connect()
safe_reader_statement()
safe_writer_statement()
safe_
在每个函数名称中表示该函数负责处理所有错误情况。您可以为函数使用不同的名称。重要的是要有一个统一的接口来连接读取、连接写入、读取和写入。
然后转换您的客户端代码以使用包装器库。起初这可能是一个痛苦而可怕的过程,但从长远来看会有所回报。使用刚刚描述的方法的所有应用程序都能够利用源/副本配置,甚至是涉及多个副本的应用程序。代码更容易维护,添加故障排除选项也很简单。您只需修改一个或两个函数(例如,记录每个语句花费的时间,或者发出的语句中的哪个语句给了您错误)。
如果您编写了很多代码,您可能希望通过编写转换脚本来自动执行转换任务。理想情况下,您的代码使用一致的编程风格约定。如果没有,那么无论如何重写它可能会更好,或者至少通过并手动规范化它以使用一致的样式。