RDS MySQL代理连接地址的读写属性和读权重决定连接地址处理的请求类型和处理方式,您可以根据业务实际需求调整每个代理连接地址的读写属性和读权重。本文介绍读写属性的含义、处理逻辑以及通过控制台和API接口设置读写属性和读权重的方法。
前提条件
实例系列需为高可用系列或集群系列。
说明高可用系列:可以创建MySQL只读实例做读写分离。
集群系列:可以直接使用实例的主备节点做读写分离。
读写属性说明
读写属性支持设置为读写或只读。
读写:用来支持读写分离功能实现业务线性扩展。
该模式下代理连接地址(原代理终端)访问策略中至少配置一个主实例和一个只读实例,写请求都只会发往主实例。支持如设置事务拆分、设置连接池等读写分离功能。
只读:用来支持只读的业务,比如报表。
该模式下代理连接地址访问策略中需要至少配置一个只读实例,主实例不会参与路由,不支持设置事务拆分。
当代理连接地址访问策略的读写属性设置为只读时,RDS会根据代理连接地址访问策略中配置的只读实例轮询分配连接,即一个客户端连接仅对应到一个只读实例的一个连接,而主实例不会参与到该分配,可用的业务连接总数是所有只读实例上的连接数之和。
对于RDS MySQL集群系列实例,读写属性设置为读写模式时,写请求只会发往主节点;读写属性设置为只读时,主节点不会参与路由,RDS会根据代理连接地址访问策略中配置的备节点轮询分配连接。
数据库代理的IP白名单和RDS主实例的IP白名单保持一致。RDS主实例的IP白名单更新,数据库代理的IP白名单也会同步更新。
为避免单点故障,建议您为一个主实例创建至少两个只读实例,并将只读实例进行跨可用区部署。若想降低跨可用区访问带来的网络延迟,您可以开通就近访问功能,详情请参见设置就近访问。
读写属性处理逻辑
读写属性 | 权限分配方式 | 主实例权重 | 正常情况 | 删除最后一个只读实例 | 只读实例全部故障 |
只读 | 系统分配或自定义 | 主实例权重不可设置 |
|
|
|
读写 | 系统分配 | 等于0 具体请参见系统默认读权重分配规则。 |
|
|
|
自定义 | 大于0 |
|
|
| |
等于0 |
|
|
|
不转发:表示在只读属性中,主实例不参与只读请求的转发。
连接报错:表示在只读属性中,代理访问策略不可读不可写时连接会报错。
在读写模式下,当主实例权重配置为0时,默认不将读请求转发到主实例,但是当只读节点异常,强制Hint指定,或者开启了事务拆分的情况下,读请求会被转发到主实例。
操作步骤
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,单击数据库代理。
在连接信息区域,在目标代理连接地址操作列,单击修改配置。
在弹出的对话框内,在读写属性右侧选中读写(读写分离)或只读(不连接主实例,无法接受请求)。
在读权重分配区域,选择系统分配或自定义:
系统分配:系统根据实例规格自动分配各个实例的读权重。后续该主实例下新增的只读实例也会自动按照系统分配的权重加入到读写分离链路中,无需手动设置。更多信息,请参见系统默认读权重分配规则。
自定义:手动设置各个实例的读权重,取值范围为0~10000。后续该主实例下新增只读实例的读权重默认为0,需要手动修改。
就近访问功能是保证客户端到代理之间的路由,而读权重是设置代理到后端MySQL实例之间的路由,两者互不相关。但需要将二者结合使用,才能做到最小访问延迟。
实例的读权重越高,处理的读请求越多。例如,假设主实例有3个只读实例,读权重分别为0、100、200和200,则表示主实例不处理读请求(写请求仍然自动发往主实例),3个只读实例按照1:2:2的比例处理读请求。
若只读实例被删除,则该实例的权重会被自动移除,其他实例权重不变。
不支持为已经设置只读实例延时复制时间的实例设置权重。
修改本参数实时生效,不会造成业务不可用。修改完成后,已存在的连接不会断开重连,新连接和存量老连接都会根据新权重进行分配。
相关API
API | 描述 |
查询RDS实例的数据库代理详情。 | |
查询RDS实例数据库代理的代理连接地址访问策略(原代理终端信息)。 | |
修改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;