什么是读写分离

更新时间:2025-04-16 07:46:47

在少写多读的场景下,主实例会有较大的读请求处理压力,可能影响到主实例的性能。RDS MySQL的读写分离功能通过数据库代理地址(读写属性的代理终端)实现读写请求的自动转发,将读请求分流到只读实例,减轻主实例的压力。

介绍

数据库代理的读写分离功能,可使写请求自动转发到主实例,读请求自动转发到各个只读实例,实现读写请求的自动分流,减轻主实例的压力。

image

优势

  • 统一读写分离地址,方便维护。

    不开通读写分离时,您需要在应用程序中分别配置主实例和每个只读实例的连接地址,才能实现将写请求发往主实例而将读请求发往只读实例。

    RDS读写分离功能提供数据库代理连接地址,您连接该地址后即可对主实例和只读实例进行读写操作,读写请求被自动转发到对应实例,可降低维护成本。

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

  • 原生链路支持,提升性能,减少维护成本。

    如果您在云上自行搭建代理层实现读写分离,数据在到达数据库之前需要经历多个组件的语句解析和转发,对响应延迟有较大的影响。而RDS读写分离内置在RDS原生生态里,能够有效降低延迟,提升处理速度,同时减少客户的维护成本。

  • 可设权重和阈值,符合多场景使用。

    您可以设置主实例和只读实例的读请求权重,通过设置不同的权重来控制读流量的分发,以及设置只读实例的延迟阈值。

  • 实例健康检查,提升数据库系统的可用性。

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

    说明

    为避免单点故障,建议您为一个主实例创建至少两个只读实例。

请求转发逻辑

只发往主实例
发往只读实例或主实例
总是发往所有实例
  • INSERT、UPDATE、DELETE、SELECT FOR UPDATE。

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

  • 所有事务中的请求。开启事务拆分功能后的路由详情请参见设置事务拆分

  • RR(可重复读)隔离级别及以上的非只读事务。

  • 用户自定义函数。

  • 存储过程。

  • Multi Statements

  • 使用到临时表(显示创建)的请求。

  • SELECT last_insert_id()。

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

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

  • LOCK相关语句 (LOCK TABLE、UNLOCK TABLE等)。

  • FLUSH相关的语句(如FTWRL)。

  • SAVEPOINT语句。

  • 非事务中的SELECT。

  • 只读事务(START TRANSACTION READ ONLY)。

  • 所有系统变量的更改。

  • USE命令。

  • SHOW PROCESSLIST。

    说明

    执行SHOW PROCESSLIST命令后,代理将返回所有节点的PROCESSLIST汇总信息。

  • NAMED PREPARE命令。

  • COM_CHANGE_USER/COM_QUIT/COM_SET_OPTION等命令。

开启读写分离

仅高可用系列(需搭配只读实例)和集群系列实例可以使用读写分离功能。开通数据库代理后,实例自动开启读写分离,无需您手动操作:

使用读写分离功能时,您需要通过数据库代理连接地址(实例详情页 > 数据库代理 > 数据库代理连接地址连接RDS实例,经过代理连接地址的读写请求会根据请求转发逻辑自动分发至对应节点处理。开通读写分离功能后,您还可以进行以下操作:

  • 设置读写属性和读权重:更改代理连接地址的读写属性和各节点的读权重分配,实现业务隔离,调整各节点负载。

  • 查询SQL命令的分发方向:您可以临时开通SQL洞察和审计功能(收费,开通后可关闭),查询每个节点上处理的SQL命令,了解每个读写请求的分发方向。

代理连接地址的读写属性处理逻辑

读写属性

权限分配方式

主实例权重

正常情况

删除最后一个只读实例

只读实例全部故障

只读

系统分配或自定义

主实例权重不可设置

主实例:不可读不可写(不转发)

代理地址:可读不可写

主实例:不可读不可写(不转发)

代理地址:不可读不可写(连接报错)

主实例:不可读不可写(不转发)

代理地址:不可读不可写(连接报错)

读写

系统分配

等于0

具体请参见系统默认读权重分配规则

主实例:不可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

自定义

大于0

主实例:可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

等于0

主实例:不可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

主实例:可读可写

代理地址:可读可写

说明
  • 不转发:表示在只读属性中,主实例不参与只读请求的转发。

  • 连接报错:表示在只读属性中,代理终端不可读不可写时连接会报错。

  • 在读写模式下,当主实例权重配置为0时,默认不将读请求转发到主实例,但是当只读节点异常,强制Hint指定,或者开启了事务拆分的情况下,读请求会被转发到主实例。

  • 更多信息,请参见设置读写属性和读权重

相关文档

  • 本页导读 (1)
  • 介绍
  • 优势
  • 请求转发逻辑
  • 开启读写分离
  • 代理连接地址的读写属性处理逻辑
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等