读写分离是指通过一个读写分离地址实现读写请求的自动转发。通过RDS MySQL的读写分离地址,可以使写请求自动转发到主实例,读请求按照设置的权重自动转发到各个只读实例。

说明 本文介绍的是如何开通共享代理的读写分离。现在共享代理已经可以升级为独享代理,独享代理拥有比共享代理更好的性能,读写分离也更加方便,建议您升级至独享代理再使用读写分离。详情请参见共享代理升级为独享代理读写分离(独享代理)

前提条件

  • 实例是主实例(不是只读实例或灾备实例)。
  • 主实例版本为:
    • MySQL 5.7高可用版(本地SSD盘)
    • MySQL 5.6
  • 实例下有至少一个只读实例。关于如何创建只读实例,请参见创建只读实例
  • 实例下的只读实例没有设置只读实例延时复制,否则读写分离无法生效。读写分离无效

费用

开通及使用读写分离功能是免费的,当前仅收取只读实例的费用。

功能限制(共享代理)

  • 读写分离链路不会解析长度超过64KB的SQL语句,请求会直接路由到主实例(用hint也不能路由到只读实例)。如果需要在只读实例查询,请将SQL语句缩减到64KB之内。
  • 直接用SQL命令进行prepare时会自动在主实例执行。
  • 使用MySQL Command进行prepare时会转发至只读实例,直至该prepare被关闭。
  • set globalset userset once 的环境变量设置会自动在主实例执行。
  • 暂不支持执行如下命令或功能:
    • 暂不支持 SSL 加密。
    • 暂不支持压缩协议。
    • 暂不支持 com_dump_table 和 com_change_user 协议。
    • 暂不支持 kill connection [query]
    • 暂不支持 change user
  • 如下命令的执行结果具有随机性:

    show processlistshow master statuscom_process_info 这三个命令会根据执行时所连接的实例返回相应的结果。

  • 事务中的请求都路由到主实例。
    说明 事务内有SQL执行失败可能会导致事务回滚,也可能不回滚。如果事务中出现执行失败的SQL并回滚,之后的Select语句被路由到只读实例可能会导致查询结果异常。建议解决出错的SQL后再执行事务。
  • 读写分离不保证非事务读的一致性,业务上有读一致性需求的请加hint强制查询走主库,或者封装到事务中。
  • 暂不支持LAST_INSERT_ID()函数,若需使用该函数,请在请求中加入hint:/*FORCE_MASTER*/, eg:/*FORCE_MASTER*/ SELECT LAST_INSERT_ID();

注意事项

  • 第一次开通读写分离功能时,为保证服务的正常使用,系统会自动将开通该功能的主实例及其所关联的所有只读实例都升级到后端管控系统的最新版本。主实例会有1次30秒内的闪断,而只读实例在整个重启过程中都无法访问。建议在业务低峰期开通读写分离功能,并确保您的应用有自动重连机制,以避免闪断影响。
  • 若您在2017年3月8日后,对要开通读写分离功能的主实例和只读实例都自行做过至少1次的重启或者规格变更操作,则这些实例的后端管控系统已经自动升级到最新版本,开通读写分离功能时,系统不会再对实例进行重启,也不会产生闪断,您无需重启实例即可正常使用。
  • 开通读写分离生成的读写分离地址是固定的,不会因为多次关闭/开启读写分离而变化,不用多次更改应用程序,降低维护成本。
    说明 读写分离地址暂不支持手动修改。

操作步骤

  1. 登录RDS管理控制台
  2. 在页面左上角,选择实例所在地域。选择地域
  3. 找到目标实例,单击实例ID。
  4. 在左侧导航栏中单击数据库连接数据库代理
  5. 选择读写分离标签页,单击立即开启
    说明
    • 如果没有显示立即开启,请先打开数据库代理以及创建至少一个只读实例。
    • 若实例是在2017年3月8日前创建的,且在3月8日后没有进行过重启或规格变更操作,开启读写分离功能将会对主实例和只读实例进行一次重启。在系统弹出的提示框中,单击确定以开启读写分离。
  6. 填写设置信息,如下图所示。
    参数 说明
    地址类型 读写分离地址的类型。
    • 内网地址 :
      • 若主实例的内网类型是VPC,则读写分离地址的内网类型也是VPC。
      • 若主实例的内网类型是经典网络,则读写分离地址的内网类型也是经典网络。
    • 外网地址:用于从外网对实例进行访问,由于外网网络易波动,建议在业务中使用内网地址进行连接。
    延迟阈值 只读实例同步主实例数据时允许的最长延迟时间。若一个只读实例的延迟时间超过该阈值,则不论该只读实例的权重是多少,读请求都不会转发至该只读实例。

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

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

下一步

您可以修改应用程序,使用读写分离地址连接RDS实例。
说明基本信息页面或读写分离页面均可看到读写分离地址。

常见问题