最近更新时间:2025-10-31 21:52:50
KRDS MySQL数据库代理是位于云数据库服务端和应用服务端之间的网络代理服务,用于代理应用服务访问云数据库时的所有请求。数据库代理通过服务地址提供服务,所有通过服务地址的请求将由代理实例根据请求类型转发至主实例或只读实例,实现自动读写分离,降低主库负载,提高业务请求处理能力。
KRDS MySQL数据库代理具有高可用、高性能、可运维、简单易用等特点。
代理连接地址是数据库代理的入口,通过数据库代理地址连接KRDS实例执行读写操作,数据库代理会通过代理地址自动将写请求发送到主实例,将读请求发送到只读实例,降低主实例压力。
读写分离指通过代理连接地址,实现读写请求的自动转发。
读多写少的应用场景可能会对主实例造成巨大的读取压力,进而影响到业务。读写分离功能可使写请求自动转发到主实例,读请求自动转发到各个只读实例(详见:请求转发逻辑),实现读写请求的自动分流,减轻主实例的压力。
读写分离(Read-Write Splitting)是一种数据库优化策略,通过数据库代理自动将读请求(SELECT)和写请求(INSERT/UPDATE/DELETE)分发到不同的数据库节点(详见:请求转发逻辑),以提高系统性能、扩展性和可用性。主要用于在读多写少场景下,减轻主实例的压力。
数据库代理的读写分离功能,可使写请求自动转发到主实例,读请求自动转发到各个只读实例,实现读写请求的自动分流,减轻主实例的压力。
1)统一接入点,简化架构管理
在未启用读写分离的场景下,应用端需要分别维护主实例与各只读实例的连接配置。通过KRDS数据库代理服务,仅需配置统一的代理连接地址即可实现读写请求的智能路由,显著降低运维复杂度。该方案支持通过横向扩展只读实例数量来提升系统吞吐量,且对应用完全透明。
2)设置权重和阈值,满足业务需求
支持按需配置主从实例的读负载权重,实现精细化的流量分配管理。
3)实例健康检查,提升数据库系统的可用性
内置健康监测机制,持续检测实例状态,当发现节点故障时,自动隔离异常实例并重新分配流量。故障恢复后,系统会智能地将实例重新纳入服务集群,确保业务高可用性。
为避免单点故障,建议您为一个主实例创建至少两个只读实例。
只发往主实例 | 发往只读实例或主实例 |
- INSERT、UPDATE、DELETE、SELECT FOR UPDATE - 所有DDL操作(建表/库、删表/库、变更表结构、权限等) - 所有事务中的请求 - 用户自定义函数 - 存储过程 - 使用到临时表(显示创建)的请求 - SELECT last_insert_id() - 所有对用户变量的查询和更改 - KILL(SQL语句中的KILL,非命令KILL) - LOCK相关语句 (LOCK TABLE、UNLOCK TABLE等) - FLUSH相关的语句(如FTWRL) - SAVEPOINT语句 - 使用Hint强制路由到主实例,如select /*use_master*/ ...(详见:使用Hint语法) | - 非事务中的SELECT |
支持通过/*use_master*/的Hint命令,显示指定请求路由到主节点(master节点)。
例如:SELECT /*use_master*/ * FROM users;,执行该命令后,会强制在master节点执行查询,即使在读写分离的环境中,该查询也会被路由到主节点而不是从节点。
Hint中有空格、换行、大小写不同,仍然生效。
支持连接复用,减少直连到数据库的连接数,降低短连接较多的场景下频繁建连造成的负载。
连接创建频繁
业务侧多为短连接
连接数量很大
在数据库代理架构中,当客户端发起会话请求时,代理会首先建立前端连接(即客户端与代理之间的会话),但此时并不会立即创建后端连接(代理与数据库之间的物理连接)。只有当实际需要处理SQL请求时,代理才会从连接池中查找可用的后端连接:
若存在可用连接:代理会直接复用该连接处理当前事务,并在事务结束后将其归还至连接池,供后续会话复用。
若无可复用连接:代理会动态创建新的后端连接,并在事务完成后将其纳入连接池管理。
通过这种机制,多个前端会话可以共享同一个后端连接,从而显著提升资源利用率。具体优势如下:
减少连接建立频率:后端连接保持长存活状态,避免频繁的TCP握手、认证等开销,降低数据库负载。
优化连接资源分配:通过连接复用,减少数据库的总连接数,避免闲置连接占用内存和线程资源。
在某些特定场景下,数据库连接会被锁定直至连接结束。在此期间,该连接不会被释放回连接池供其他会话复用,以确保事务的一致性和正确性。这些场景包括:
创建临时表
创建用户变量
使用LOCK TABLES
执行PREPARE语句或命令
不支持 FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函数的调用,这些函数可以调用成功,但是无法保证调用结果的正确性。
对于设置了 wait_timeout 的连接,wait_timeout 在客户端的表现可能不会生效,因为每次请求都会从连接池中获取连接,当 wait_timeout 超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。
由于连接可能会被复用,您可以使用 select connection_id() 查询当前连接的 thread id。
由于连接可能会被复用,所以 show processlist 显示的 IP 地址和端口可能和客户端实际的 IP 地址和端口不一致。
连接数过多导致实例负载过高
业务内有读写分离需求
业务内有大量短连接
数据库代理支持MySQL 5.6、MySQL 5.7、MySQL 8.0版本
目前仅华北1(北京)支持使用
主实例需满足以下条件:
主实例状态为运行中
主实例至少已关联一个只读实例
在使用KRDS MySQL数据库代理前,请了解本节介绍的注意事项,以便您顺利使用数据库代理服务。
使用代理连接地址时,事务请求都会路由到主实例。
从代理后端上删除只读实例时,该只读实例上正在执行的语句会报错。如果存在多个只读实例(实例A和实例B),下线只读实例A,实例A上正在执行的语句会尝试到实例B上执行,若尝试了指定次数都未成功,则报错。
主实例是否承担读流量由该实例配置的权重决定(默认情况下主实例可以承担读流量),若权重设置为非零,则承担读流量;否则,不承担读流量。
使用用户自定义变量时,包含用户自定义变量的语句会路由到主节点。
如果使用MySQL命令行进行连接并使用Hint语句,需要在命令中增加-c选项,否则Hint会被MySQL命令行工具过滤。
系统表的查询也是根据正则匹配路由到指定节点。
select database()路由到只读节点。
本节主要为您介绍如何通过KRDS MySQL控制台使用数据库代理功能。
登录云数据库MySQL控制台,在实例列表页单击目标实例ID,进入实例管理页面。
单击左侧导航栏数据库代理,进入数据库代理页面。
单击开通数据库代理,在开通数据库代理页面完成代理实例的配置与购买。
开通数据库代理需配置的参数说明如下表所示:
参数 | 说明 | |
可用区 | 代理节点所在的可用区,建议数据库代理可用区和RDS实例的可用区保持一致 | |
实例规格 | 可选2C8G | 4C16G | |
节点数量 | 一个数据库代理实例包含多个代理节点,支持2~6个节点 | |
连接限制 | ProxySQL: connection1=map{8192:2400, 16384:6400} | MySQL: connection2=100*内存 |
max_connections=min{connection1, connection2} | ||
代理实例创建完成后,即可进入数据库代理详情页。在代理服务页面,您可以查看当前数据库代理的基本信息,查看或变更代理节点配置,配置读写分离,以及查看已关联实例的信息和状态等。
权重与流量分发关系:假设SELECT * FROM t;路由到只读节点,且有三个只读节点A、B、C,其权重分别为1、2、3,则该语句分发到每个只读节点的概率C<B<A,即权重越大,流量分发到该节点的概率越大。
登录云数据库MySQL控制台,在实例列表页单击目标实例ID,进入实例管理页面。
单击左侧导航栏数据库代理,进入数据库代理页面。
在性能监控页面,您可以查看当前代理实例的资源使用情况。
如您需要查看服务日志,请提工单申请。
访问MySQL实例列表,顶部选择目标数据中心区域,单击目标实例ID。
单击左侧导航栏数据库代理。
单击页面右上角关闭数据代理。
单击确定。
数据库代理服务目前处于公测期间,用户可免费使用该服务,但不提供服务质量协议(SLA)承诺。
不是。
常规地址:正常的业务读写地址,通过该地址发送的所有请求只会路由到该实例。
数据库代理地址:可根据用户的SQL请求,自动判断读请求或写请求,并分发到主实例或只读实例,实现读写分离,减轻主实例的压力。
不会收回。
能。
设置读权重分配时,为主实例设置权重即可。
您可以通过hint语句强制转发请求到主实例上执行,详见:使用Hint语法。
没有开通数据库代理服务,无法配置只读实例的业务分配权重,但是您可以在不同的应用程序中配置不同的连接地址(只读实例或主实例连接地址),实现读写分离和负载均衡。(如果未开通数据库代理,主实例和只读实例的流量需要业务端自行实现)
不会自动切换,需要等待超时后重新连接到正常只读实例上。
开通数据库代理服务并完成读写分离的相关数据配置后,主实例的历史数据会自动同步到只读实例,无需手动同步。
所有DDL操作(创建表或库、删除表或库、表更表结构、权限等)会自动从主库同步到从库。
纯净模式
