• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用复制进行横向扩展

    您可以将复制用作横向扩展解决方案。也就是说,您希望在一些合理的限制内将数据库查询的负载分散到多个数据库服务器上。

    由于复制是从一个主服务器分发到一个或多个从服务器,因此使用复制进行横向扩展最适合读取次数多而写入/更新次数少的环境。大多数网站都属于此类别,用户可以在其中浏览网站,阅读文章,帖子或参见产品。更新仅在会话管理期间或在购买或向论坛添加评论/消息时发生。

    在这种情况下,复制使您可以在复制从属服务器上分发读取,同时在需要写入时仍使Web服务器能够与复制主机进行通信。您可以在图17.1“在横向扩展期间使用复制来提高性能”中看到此方案的示例复制布局。

    使用复制在横向扩展期间提高性能

    如果负责数据库访问的代码部分已被正确地抽象/模块化,则将其转换为使用复制设置运行将非常顺畅和轻松。更改数据库访问的实现,以将所有写入发送到主服务器,并将读取发送到主服务器或从服务器。如果您的代码没有这种抽象级别,则设置复制系统将为您提供清理它的机会和动力。首先创建一个实现以下功能的包装器库或模块:

    • safe_writer_connect()
    • safe_reader_connect()
    • safe_reader_statement()
    • safe_writer_statement()

    safe_每个函数名称中的“”表示该函数负责处理所有错误情况。您可以为函数使用不同的名称。重要的是要有一个统一的接口来连接读取,连接,写入,读取和写入。

    然后将您的客户端代码转换为使用包装器库。起初这可能是一个痛苦而令人恐惧的过程,但从长远来看,它是有回报的。使用上述方法的所有应用程序都可以利用主/从配置,甚至包括多个从属的应用。该代码易于维护,并且添加故障排除选项很简单。您只需要修改一个或两个函数(例如,记录每个语句花费的时间,或者发出的语句中的哪个给您带来错误)。

    如果您编写了很多代码,则可能需要通过编写转换脚本来自动执行转换任务。理想情况下,您的代码使用一致的编程样式约定。如果没有,那么您最好还是重写它,或者至少经历一下并手动对其进行规范化以使用一致的样式。