RDS PostgreSQL数据库代理提供自动读写分离功能。数据库代理是位于数据库服务端和应用服务端之间的网络代理服务,用于代理应用服务端访问数据库时的所有请求,具有高可用、高性能、可运维、简单易用等特点,本文介绍RDS PostgreSQL的数据库代理服务。

适用场景

  • 事务内有大量请求,导致主实例负载过高的场景。
  • 连接数过多导致主实例负载过高的场景。
  • 纯只读和有隔离需求的业务。
    说明 例如:您购买了包含1个主实例和4个只读实例的RDS实例,现在需要将A业务(纯只读)和B业务(可读可写)都连接至该实例。您可以将只读实例1和只读实例2组成代理终端A(只读模式)提供给业务A,主实例、只读实例3和只读实例4组成代理终端B(读写模式)提供给业务B,以实现两个业务在数据库使用上的物理隔离,避免相互影响。

基本概念

  • 代理终端

    代理终端是数据库代理的核心,可自定义连接地址,RDS PostgreSQL实例中最多支持7个代理终端,您可以修改各代理终端的读写属性来满足不同的业务场景,增强业务的灵活性。

  • 读写分离

    读写分离指通过代理终端实现读写请求的自动转发。

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

  • 事务拆分
    数据库代理默认开启事务拆分功能,能够将事务内写操作之前的读请求转发到只读实例,降低主实例负载。
    说明
    • 显式事务(例如begin或者start transaction)暂时不支持拆分。
    • 某些业务对全局一致性有要求,开启事务拆分后将不满足全局一致性,因此在开启事务拆分前请评估事务拆分功能是否适用于您的业务。
    • 该功能暂不支持关闭。

读写分离优势

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

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

    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。

注意事项

  • 数据库代理、只读实例和主实例均独立收费,三者互不干扰。相关计费详情,请参见数据库代理费用只读实例价格主实例价格
  • 当主实例或只读实例变更配置时可能会出现连接闪断。
  • 开启数据库代理后,新增只读实例或只读实例重启,只有新的连接的请求才会转发到新的只读实例或重启的只读实例,旧的连接请求不会变化。
  • 使用代理连接地址进行读写分离时,会话内的读一致性目前暂未支持。
  • 使用代理连接地址时,查看会话变量需要增加 /*force_master*/ /*force_slave*/ 来查看主实例和只读节点上的配置。
  • 数据库代理的连接模型是1:N(即您的一个业务连接到达代理后,代理会连接到主实例和所有配置的只读实例),数据库代理本身并没有最大连接数的限制,连接数的限制主要由后端数据库中计算节点的规格决定。每条由客户端发起的连接都需要在后端主节点和所有只读节点上各创建一个对应的连接。建议开通数据库代理后,主实例和只读实例的连接数规格尽量一致,否则业务的连接数会受限于最小规格的实例连接数限制。
  • 主实例被锁定期间,代理不会被释放,可继续提供读服务,但无法提供写服务。
  • 主实例若被释放,数据库代理自动跟随主实例释放,释放后不再产生费用。
  • 在使用高权限账号单独配置账号的host范围时,代理支持配置为10.1.2.%格式的网段。
    说明 暂不兼容将代理的网段配置为10.1.2.0/24

使用方法

请参见开通并配置数据库代理服务