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

功能优势

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

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

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

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

  • 高安全链路原生支持,提升性能。

    如果您在云上自行搭建代理层实现读写分离,数据在到达数据库之前需要经历多个组件的语句解析和转发,对响应延迟有较大的影响。而RDS读写分离内置于已有的高安全链路,没有任何额外的组件来消耗时间,能够有效降低延迟,提升处理速度。

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

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

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

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

    说明
    为避免单点故障,建议您为一个主实例创建至少两个只读实例。
  • 免费使用,降低资源及维护成本。

    为普惠用户,RDS为所有只读实例用户免费提供读写分离功能,无需支付任何额外费用。

功能限制

  • 暂不支持将如下命令或功能转发至只读实例:
    • stmt prepare sql 命令会自动在主实例执行。
    • stmt prepare commandstmt close 前不支持转发至只读实例。
    • set globalset userset once 的环境变量设置会自动在主实例执行。
  • 暂不支持执行如下命令或功能:
    • 暂不支持 SSL 加密。
    • 暂不支持压缩协议。
    • 暂不支持 com_dump_table 和 com_change_user 协议。
    • 暂不支持 kill connection [query]
    • 暂不支持 change user
  • 如下命令的执行结果具有随机性:

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

  • 事务都路由到主库。
  • 读写分离不保证非事务读的一致性,业务上有读一致性需求的请加hint强制查询走主库,或者封装到事务中。
  • 若您需要使用某些查询语句来获取实时数据,您可以通过Hint格式将这些查询语句强制转发到主实例上执行。关于RDS读写分离支持的Hint格式,请参见文档系统权重分配规则中的通过Hint指定SQL发往主实例或只读实例部分。
  • 暂不支持LAST_INSERT_ID()函数,若需使用该函数,请在请求中加入hint:/*FORCE_MASTER*/, eg:/*FORCE_MASTER*/ SELECTLAST_INSERT_ID();

常见问题