读写分离是指通过独享代理地址(读写分离地址)实现读写请求的自动转发。

在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压力,您可以创建一个或多个只读实例,利用只读实例满足大量的数据库读取需求。

创建只读实例后,您可以开通读写分离,此时独享代理地址就可以作为读写分离地址,在应用程序中配置独享代理地址,就可以使写请求自动转发到主实例,读请求自动转发到各个只读实例。

读写分离地址和内外网地址区别

开通读写分离后,您就可以将独享代理地址配置在应用程序中,客户端发出的请求到达该地址后会根据请求类型和实例权重自动分配给内部的各个实例。

应用程序中的地址如果是主实例的内网或外网地址,则请求只会交给主实例,而不会交给只读实例处理,必须在程序中添加主实例及各个只读实例的地址及权重,才能达到读写分离地址的效果。

转发逻辑

  • 只发往主实例
    • 所有DML操作(INSERT、UPDATE、DELETE、SELECT FOR UPDATE)。
    • 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。
    • 所有事务中的请求。
    • 用户自定义函数。
    • 存储过程。
    • EXECUTE语句。
    • Multi Statements
    • 使用到临时表的请求。
    • SELECT last_insert_id()。
    • 所有对用户变量的查询和更改。
    • SHOW PROCESSLIST。
    • KILL(SQL语句中的KILL,非命令KILL)。
  • 发往只读实例或主实例
    • 非事务中的读请求。
    • COM_STMT_EXECUTE命令。
  • 总是发往所有实例
    • 所有系统变量的更改。
    • USE命令。
    • COM_STMT_PREPARE命令。
    • COM_CHANGE_USER/COM_QUIT/COM_SET_OPTION等命令。

功能优势

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

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

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

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

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

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

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

    您可以设置主实例和只读实例的读请求权重,以及设置只读实例的延迟阈值。

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

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

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

注意事项

  • 当主实例或只读实例变更配置时可能会出现连接闪断。
  • 新增只读实例后,新建的连接才会被路由到新只读实例上。
  • 独享代理地址暂不支持SSL加密。
  • 独享代理地址暂不支持压缩协议。
  • 使用独享代理连接地址时,事务请求都会路由到主实例。
  • 使用独享代理连接地址进行读写分离时,不保证非事务读的一致性,业务上有读一致性需求可以封装到事务中。
  • 使用独享代理连接地址时,show processlist会将所有节点的结果合并后返回。
  • 如果开通了短连接优化功能,show processlist可能会显示闲置的用户连接。
  • 如果执行了Multi-Statements或存储过程,当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
  • 支持Hint语法/*FORCE_MASTER*//*FORCE_SLAVE*/,但是因为Hint的路由优先级最高,例如Hint不受一致性、事务的约束,需要您评估是否可以用于业务。另外Hint语句里不能包含改变环境变量的语句,例如/*FORCE_SLAVE*/ set names utf8; ,可能导致后续业务出错。

前提条件

实例满足如下条件:

开通读写分离

  1. 登录RDS管理控制台
  2. 在页面左上角,选择实例所在地域。选择地域
  3. 找到目标实例,单击实例ID。
  4. 在左侧导航栏中单击数据库代理
  5. 选择读写分离页签,单击立即开启
  6. 设置如下参数。
    参数 说明
    延迟阈值 只读实例同步主实例数据时允许的最长延迟时间。若一个只读实例的延迟时间超过该阈值,则不论该只读实例的权重是多少,读请求都不会转发至该只读实例。

    取值范围为0秒到7200秒。受限于SQL的执行情况,只读实例有一定的几率会出现延迟,建议该值不小于30秒。

    读权重分配 实例的读权重越高,处理的读请求越多。例如,假设主实例有3个只读实例,读权重分别为0、100、200和200,则表示主实例不处理读请求(写请求仍然自动发往主实例),3个只读实例按照1:2:2的比例处理读请求。
    • 系统分配:系统根据实例规格自动分配各个实例的读权重。后续该主实例下新增的只读实例也会自动按照系统分配的权重加入到读写分离链路中,无需手动设置。更多信息请参见系统权重分配规则
    • 自定义:手动设置各个实例的读权重,范围为0至10000。后续该主实例下新增只读实例的读权重默认为0,需要您手动修改。
    说明 不支持为已经设置只读实例延时复制时间的实例设置权重。
    设置权重
  7. 单击确定

开通后,您需要在应用程序中配置读写分离地址(即独享代理地址),就可以使写请求自动转发到主实例,读请求自动转发到各个只读实例。

读写分离地址

常见问题

Q:读写分离支持hint语句吗?

A:您可以通过hint语句强制转发请求到主实例上执行。关于RDS读写分离支持的hint格式,请参见文档系统权重分配规则中的通过hint指定SQL发往主实例或只读实例部分。

相关文档

读写分离常见问题