什么是读写分离

PolarDB MySQL版集群自带读写分离功能。应用程序只需连接一个可读可写(自动读写分离)模式的集群地址,写请求会自动转发到主节点,读请求会自动根据各节点的负载(当前未完成的请求数)转发到主节点或只读节点。

优势

  • 读一致性

    当客户端通过读写分离地址与后端建立连接后,读写分离中间件会自动与主节点和各个只读节点建立连接。在同一个连接内(同一个session内),读写分离中间件会根据各个数据库节点的数据同步程度,来选择合适的节点,在保证数据正确的基础上(写操作之后的读有正确的结果),实现读写请求的负载均衡。

    示意图

  • 原生支持读写分离,提升性能

    如果您在云上通过自己搭建代理层实现读写分离,在数据到达数据库之前需要经历多个组件的语句解析和转发,响应延迟较大。而PolarDB读写分离直接内置在已有的高安全链路中,没有任何额外的组件产生消耗,能够有效降低延迟,提升处理速度。

  • 维护方便

    在传统模式下,您需要在应用程序中配置主节点和每个只读节点的连接地址,并且对业务逻辑进行拆分,才能将写请求发往主节点而将读请求发往所有节点。

    PolarDB提供集群地址,应用程序连接该地址后即可对主节点和只读节点进行读写操作,读写请求会被自动转发,转发逻辑完全对使用者透明,可降低维护成本。

    同时,您只需添加只读节点的个数,即可不断扩展系统的处理能力,应用程序无需做任何修改。

  • 节点健康检查,提升数据库系统的可用性

    读写分离模块自动对集群内的所有节点进行健康检查,当发现某个节点宕机或者延迟超过阈值后,PolarDB将不再分配读请求给该节点,读写请求在剩余的健康节点间进行分配,以此确保单个只读节点发生故障时,不会影响应用的正常访问。当节点被修复后,PolarDB会自动将该节点纳回请求分配体系内。

  • 免费使用,降低资源及维护成本

    免费提供读写分离功能,无需支付任何额外费用。

请求转发逻辑

可读可写模式转发逻辑如下:

  • 只发往主节点:

    • 所有DML操作(INSERTUPDATEDELETESELECT FOR UPDATE)。

    • 所有DDL操作(建表或库、删表或库、变更表结构、权限等)。

    • 在未开启事务拆分功能时,所有事务中的请求。

      说明

      开启事务拆分功能后的路由详情请参见事务拆分

    • 用户自定义函数。

    • 存储过程。

    • EXECUTE语句。

    • Multi Statements

    • 使用到临时表的请求。

    • SELECT last_insert_id()

    • 所有对用户变量的查询和更改。

    • binlog dump。

  • 发往只读节点或主节点:

    说明

    仅当主库是否接受读选择为时会发往主节点。

    • 非事务中的读请求。

    • COM_STMT_EXECUTE命令。

  • 总是发往所有节点:

    • 所有系统变量的更改。

    • USE命令。

    • COM_STMT_PREPARE命令。

    • COM_CHANGE_USERCOM_QUITCOM_SET_OPTION等命令。

    • SHOW PROCESSLIST

      说明

      执行SHOW PROCESSLIST命令后,PolarDB将返回所有节点的PROCESSLIST信息。

    • KILL(SQL语句中的KILL,非命令KILL)。

只读模式转发逻辑如下:

  • 不允许执行DDL、DML操作。

  • 所有读请求按照负载均衡的方式转发到各个只读节点。

  • 所有读请求不会转发到主节点。即使主节点已被添加到服务节点中,也不会生效。

  • binlog dump锁定到某个RO节点。

功能特性

PolarDB的读写分离功能主要包含以下特性: