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