POLARDB for PostgreSQL集群自带读写分离功能,通过一个集群地址(读写分离地址)实现读写请求的自动转发。

背景信息

在对数据库有少量写请求,但有大量读请求的应用场景下,单个节点可能无法承受读取压力,甚至对业务产生影响。使用集群地址(读写分离地址),就可以使写请求自动转发到主节点,读请求自动转发到各个只读节点。从而实现读取能力的弹性扩展,满足大量的数据库读取需求。

示意图

功能优势

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

    您未使用集群地址(读写分离地址)时,需要在应用程序中分别配置主节点和每个只读节点的连接地址,才能实现将写请求发往主节点而将读请求发往只读节点。POLARDB提供一个集群地址(读写分离地址),您连接该地址后即可对主节点和只读节点进行读写操作,读写请求被自动转发到对应节点,可降低维护成本。同时,您只需添加只读节点的个数,即可不断扩展系统的处理能力,应用程序无需做任何修改。

  • Session级别的读一致性。

    当客户端通过读写分离建立与后端的连接后,读写分离中间件会自动与主节点和各个只读节点建立连接。在同一个连接内(同一个session 内),读写分离中间件会根据各个数据库节点的数据同步程度,来选择合适的节点,在保证数据正确的基础上(写操作之后的读有正确的结果),实现读写请求的负载均衡。

  • 扩展查询(prepare语句/命令)的负载均衡。

    读写分离中间件会自动根据excute语句/命令中的信息来找到之前执行prepare语句/命令的数据库节点,从而做到扩展查询的负载均衡。

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

    如果您在云上自行搭建代理层实现读写分离,数据在到达数据库之前需要经历多个组件的语句解析和转发,对响应延迟有较大的影响。而 POLARDB读写分离中间件隶属于集群组件,相比外部组件而言,能够有效降低延迟,提升处理速度。

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

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

功能限制

  • 暂不支持如下命令或功能:
    • 不支持Replication-mode方式进行建连,即不支持通过读写分离地址自行搭建主备复制集群。如需自行搭建主备复制集群,请使用主节点的连接地址。
    • 不支持临时表的ROWTYPE。
      create temp table fullname (first text, last text);
      select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;
    • 不支持函数中创建临时资源。
      • 函数中创建临时表,然后再执行对临时表的查询SQL可能会收到表不存在的错误信息。
      • 函数中带有prepare语句,后续execute时可能会收到statement name不存在的错误信息。
  • 路由相关限制 :
    • 多语句(multi-statement)会路由到主节点,且之后本连接内的所有请求均路由到主节点。
    • 大的请求报文 (大于等于16MB)会路由到主节点,且之后本连接内的所有请求均路由到主节点。
    • 事务中的请求都路由到主节点,事务退出后,恢复负载均衡。
    • 所有使用函数(除聚合函数,例如,count、sum)的语句,会路由到主节点。

申请或修改集群地址

  1. 登录POLARDB控制台
  2. 在控制台左上角,选择地域。
  3. 单击目标集群ID。
  4. 基本信息页面的访问信息区域,找到集群地址
  5. 单击申请,在弹出的对话框中单击确认,刷新后即可看到集群私网地址。
    说明 存量集群若未申请集群读写分离连接地址的需要手动申请集群私网地址,新购集群自动开通集群私网地址。若已有集群地址,请直接查看第6步。
  6. 单击修改,设置新的集群私网地址,并单击提交集群地址

下一步

连接数据库集群

说明 申请集群地址后,您只需在应用中配置该集群地址,即可实现自动读写分离。

相关API

API 描述
CreateDBEndpointAddress 创建POLARDB集群的公网地址。
DescribeDBClusterEndpoints 查询POLARDB集群的地址信息。
ModifyDBClusterEndpoint 修改POLARDB集群地址属性。
ModifyDBEndpointAddress 修改POLARDB集群默认访问地址前缀。
DeleteDBEndpointAddress 释放POLARDB集群地址(除了自定义集群地址的私网地址)。