文档

什么是读写分离

更新时间:

如果您的业务场景中读请求远大于写请求,且大量的读请求对主实例造成了负载压力,则可以购买只读实例,配合RDS PostgreSQL数据库代理的读写分离功能,通过一个数据库代理地址实现读写请求的自动转发,充分发挥各只读实例的读性能,减轻主实例的访问压力。

介绍

少写多读的应用场景可能会对主实例造成巨大的读取压力,进而影响到业务。数据库代理的读写分离功能,可使写请求自动转发到主实例,读请求自动转发到各个只读实例,实现读写请求的自动分流,减轻主实例的压力。

image

读写分离优势

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

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

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

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

  • 原生链路支持,提升性能,减少维护成本。

    如果您在云上自行搭建代理层实现读写分离,数据在到达数据库之前需要经历多个组件的语句解析和转发,对响应延迟有较大的影响。而RDS读写分离内置在RDS原生生态里,能够有效降低延迟,提升处理速度,同时减少您的维护成本。

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

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

    说明

    为避免单点故障,建议您为一个主实例创建至少两个只读实例。

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

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

请求转发类型

转发目标

请求类型

只发往主实例

  • INSERT、UPDATE、DELETE、SELECT FOR UPDATE。

  • 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。

  • 所有事务中的请求。

  • 用户自定义函数。

  • 存储过程。

  • Multi Statements。

    说明

    如果执行了Multi-Statements或存储过程,当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。

  • 使用到临时表的请求。

  • 系统表的读写请求。

  • Prepared Statement中的写操作。

发往只读实例或主实例

  • 非事务中的SELECT。

  • 开启事务拆分后,事务中第一个写操作之前的请求。

  • Prepared Statement中的读操作。

  • 可以安全地在只读上操作的系统函数,如pg_sleep等。

总是发往所有实例

  • 所有系统变量的更改。

  • Prepared Statement中的Parse。

  • BEGIN/START,END/ROLLBACK/COMMIT。

  • CANCEL。

操作步骤

请参见开通数据库代理配置数据库代理终端

注意事项

请参见数据库代理注意事项

常见问题

请参见数据库代理常见问题