19.4.5 使用复制进行扩展
您可以使用复制作为扩展解决方案,即将数据库查询的负载分配到多个数据库服务器上,subject to certain limitations.
因为复制从一个源到一个或多个副本的分布工作,因此在读取操作非常多、写入操作非常少的环境中,使用复制进行扩展效果最佳。许多网站都适应这个情况,用户浏览网站、阅读文章、查看产品等。只有在会话管理、购买或在论坛添加评论/消息时才会进行更新。
在这种情况下,复制使您可以将读取操作分布到副本上,同时仍然允许您的Web服务器在需要写入时与源服务器通信。您可以在Figure 19.1,“使用复制来改善性能以实现扩展”中看到该场景的示例复制布局。
如果您的代码中负责数据库访问的部分已经被正确地抽象化和模块化,转换它以在复制设置中运行应该非常顺滑和容易。将数据库访问的实现更改为将写入操作发送到源服务器,将读取操作发送到源服务器或副本。如果您的代码没有达到这个级别的抽象,设置复制系统可以为您提供机会和动机来清洁它。首先,创建一个wrapper库或模块,实现以下函数:
-
safe_writer_connect()
-
safe_reader_connect()
-
safe_reader_statement()
-
safe_writer_statement()
safe_
在每个函数名称中都表示该函数负责处理所有错误情况。您可以使用不同的函数名称。重要的是在连接读取、连接写入、执行读取和执行写入时具有统一的接口。
然后将客户端代码转换为使用wrapper库。这可能在开始时是一件痛苦和可怕的事情,但是它最终会有回报。所有使用上述方法的应用程序都可以使用源/副本配置,即使是涉及多个副本的配置。代码维护起来更容易,添加故障排除选项也变得简单。您只需要修改一个或两个函数(例如,记录每个语句所需的时间,或者哪个语句中的错误)。
如果您编写了大量代码,您可能想自动化转换任务。理想情况下,您的代码使用一致的编程风格约定。如果不是,那么您可能更好地重新编写它,或者至少手动将其标准化到使用一致的风格。