您可以使用复制作为横向扩展解决方案,即在多个数据库服务器之间分配数据库查询负载,具有合理的限制。
因为复制从一个源到一个或多个副本工作,所以使用复制来实现横向扩展最适合在读取多、写入少的环境中。大多数网站都属于这种情况,用户浏览网站、阅读文章、帖子或查看产品。只有在会话管理、购买或添加评论/留言到论坛时才会进行更新。
在这种情况下,复制使您可以将读取分布到副本上,同时仍然使Web服务器可以在需要写入时与源服务器通信。您可以在图 19.1“使用复制来改进横向扩展性能”中看到一个示例复制布局。
如果您的代码中负责数据库访问的部分已经被正确地抽象/模块化,那么将其转换为使用复制设置应该非常smooth和容易。如果您的代码没有这种抽象级别,那么设置复制系统将给您机会和动机来清洁它。从创建一个wrapper库或模块开始,该模块实现以下函数:
-
safe_writer_connect()
-
safe_reader_connect()
-
safe_reader_statement()
-
safe_writer_statement()
每个函数名中的“safe_”表示该函数处理所有错误条件。您可以为函数使用不同的名称。重要的是拥有一个统一的接口来连接读取、连接写入、执行读取和执行写入。
然后将客户端代码转换为使用wrapper库。这可能是一个痛苦和可怕的过程,但长期来说是值得的。所有使用这种方法的应用程序都能够利用源/副本配置,甚至包括多个副本。代码变得更易于维护,添加故障排除选项也变得很容易。您只需要修改一两个函数(例如,记录每个语句所需的时间或哪个语句导致错误)。
如果您编写了很多代码,您可能想要通过编写转换脚本来自动化转换任务。理想情况下,您的代码使用一致的编程风格约定。如果不是,那么您可能需要重写它,或者至少手动地将其规范化以使用一致的风格。