全部产品
Search
文档中心

云数据库 RDS:设置读写属性和读权重

更新时间:Mar 11, 2025

RDS MySQL代理连接地址的读写属性和读权重决定连接地址处理的请求类型和处理方式,您可以根据业务实际需求调整每个代理连接地址的读写属性和读权重。本文介绍读写属性的含义、处理逻辑以及通过控制台和API接口设置读写属性和读权重的方法。

前提条件

读写属性说明

读写属性支持设置为读写只读

  • 读写:用来支持读写分离功能实现业务线性扩展。

    该模式下代理连接地址(原代理终端)访问策略中至少配置一个主实例和一个只读实例,写请求都只会发往主实例。支持如设置事务拆分设置连接池等读写分离功能。

  • 只读:用来支持只读的业务,比如报表。

    该模式下代理连接地址访问策略中需要至少配置一个只读实例,主实例不会参与路由,不支持设置事务拆分

    当代理连接地址访问策略的读写属性设置为只读时,RDS会根据代理连接地址访问策略中配置的只读实例轮询分配连接,即一个客户端连接仅对应到一个只读实例的一个连接,而主实例不会参与到该分配,可用的业务连接总数是所有只读实例上的连接数之和。

说明
  • 对于RDS MySQL集群系列实例,读写属性设置为读写模式时,写请求只会发往主节点;读写属性设置为只读时,主节点不会参与路由,RDS会根据代理连接地址访问策略中配置的备节点轮询分配连接。

  • 数据库代理的IP白名单和RDS主实例的IP白名单保持一致。RDS主实例的IP白名单更新,数据库代理的IP白名单也会同步更新。

  • 为避免单点故障,建议您为一个主实例创建至少两个只读实例,并将只读实例进行跨可用区部署。若想降低跨可用区访问带来的网络延迟,您可以开通就近访问功能,详情请参见设置就近访问

读写属性处理逻辑

读写属性

权重分配方式

主实例权重

正常情况

删除最后一个只读实例

只读实例全部故障

只读

系统分配或自定义

主实例权重不可设置

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

  • 代理访问策略:可读不可写

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

  • 代理访问策略:不可读不可写(连接报错)

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

  • 代理访问策略:不可读不可写(连接报错)

读写

系统分配

等于0

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

  • 主实例:不可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

自定义

大于0

  • 主实例:可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

等于0

  • 主实例:不可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

  • 主实例:可读可写

  • 代理访问策略:可读可写

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

  • 连接报错:表示在只读属性中,代理访问策略不可读不可写时连接会报错。

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

权重对运维的影响

说明

如何查看数据库代理内核小版本请参见查看代理内核小版本。如需升级数据库代理内核小版本,请参见升级数据库代理内核小版本

运维动作

内核版本大于等于2.8.41

内核版本小于2.8.41

权重为0的节点在新会话开启时,是否建立连接?

权重从非0改为0,节点是否会从存量会话上摘除?

权重从非0改为0,存量会话的路由是否按照最新的权重转发?

权重从0改为非0,节点是否会加入存量会话?

权重从0改为非0,存量会话的路由是否按照最新的权重转发?

摘除权重非0的只读节点是否会导致存量会话闪断?

说明

2.x版本的数据库代理虽然存在retry_failed_reads机制,但在结果集返回一半时摘除只读节点仍可能导致闪断。

摘除权重为0的只读节点是否会导致存量会话闪断?

如果存在存量会话且会话上有请求在执行,则会闪断,否则不会。

权重为0的只读节点上Kill连接,连接是否断开?

在1.x版本的数据库代理中,如果active session未降至0,则连接会被断开;否则不会断开,且被Kill的连接会自动重连。

权重非0的只读节点上Kill连接,连接是否断开?

操作步骤

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏,单击数据库代理

  3. 连接信息区域,在目标代理连接地址操作列,单击修改配置

  4. 在弹出的对话框内,在读写属性右侧选择读写(读写分离)只读(不连接主实例,无法接受请求)

  5. 读权重分配区域,选择系统分配自定义

    • 系统分配:系统根据实例规格自动分配各个实例的读权重。后续该主实例下新增的只读实例也会自动按照系统分配的权重加入到读写分离链路中,无需手动设置。更多信息,请参见系统默认读权重分配规则

    • 自定义:手动设置各个实例的读权重,取值范围为0~10000。后续该主实例下新增只读实例的读权重默认为0,需要手动修改。

说明
  • 就近访问功能是保证客户端到代理之间的路由,而读权重是设置代理到后端MySQL实例之间的路由,两者互不相关。但需要将二者结合使用,才能做到最小访问延迟。

  • 实例的读权重越高,处理的读请求越多。例如,假设主实例有3个只读实例,读权重分别为0、100、200和200,则表示主实例不处理读请求(写请求仍然自动发往主实例),3个只读实例按照1:2:2的比例处理读请求。

  • 若只读实例被删除,则该实例的权重会被自动移除,其他实例权重不变。

  • 不支持为已经设置只读实例延时复制时间的实例设置权重。

  • 修改本参数实时生效,不会造成业务不可用。修改完成后,已存在的连接不会断开重连,新连接和存量老连接都会根据新权重进行分配。

相关API

API

描述

DescribeDBProxy

查询RDS实例的数据库代理详情。

DescribeDBProxyEndpoint

查询RDS实例数据库代理的代理连接地址访问策略(原代理终端信息)。

ModifyDBProxyEndpoint

修改RDS实例数据库代理的代理连接地址访问策略(原设置代理终端)。

附录一:通过Hint指定SQL发往主实例、只读实例或主备节点

在读写分离权重分配体系之外,Hint可作为一种SQL补充语法来指定相关SQL到高可用系列的主实例和只读实例或集群系列的主备节点执行。

RDS读写分离支持的Hint格式如下所示:

对于RDS MySQL高可用系列实例:

  • /*FORCE_MASTER*/:指定后续SQL到主实例执行。

  • /*FORCE_SLAVE*/:指定后续SQL到只读实例执行。

对于RDS MySQL集群系列实例:

  • /*FORCE_MASTER*/:指定后续SQL到主节点执行。

  • /*FORCE_SLAVE*/:指定后续SQL到备节点执行。

说明
  • 对于RDS MySQL高可用系列实例,使用/*FORCE_MASTER*/时,即使主实例的读权重为0,SQL也会被路由到主实例。

  • 对于RDS MySQL集群系列实例,使用/*FORCE_MASTER*/时,即使主节点的读权重为0,SQL也会被路由到主节点。

例如,对于RDS MySQL高可用系列实例,在如下语句前加入Hint后,不论权重如何设置,该语句一定会路由到主实例上执行。

/*FORCE_MASTER*/ SELECT * FROM table_name;

附录二:无感下线只读节点最佳实践

假设,现有一主两备的读写分离环境,主节点rm-bp1n24g0g****,只读节点rr-bp1k0v739****和rr-bp191c9h****。如果希望无感下线掉只读节点rr-bp1k0v739****,可以按照以下步骤操作。

  1. 数据库代理页面的连接拓扑管理区域,单击代理连接地址的卡片中的修改配置,将待下线只读节点rr-bp1k0v739****的读权重设置为0。imageimage

  2. 监控与报警页面,观察待下线只读节点会话连接监控指标的active_session。当active_session跌至0后,控制台将该节点从连接地址中摘除。image

    说明

    只需要关注active_session是否为0。若total_session不为0,也无需进行Kill session的操作。