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