PolarDB-O集群自带读写分离功能。应用程序只需连接一个集群地址,写请求会自动发往主节点,读请求会自动根据各节点的负载(当前未完成的请求数)发往主节点或只读节点。

功能优势

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

    您未使用集群地址(读写分离地址)时,需要在应用程序中分别配置主节点和每个只读节点的连接地址,才能实现将写请求发往主节点而将读请求发往只读节点。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不存在的错误信息。
  • 路由相关限制 :
    • 事务中的请求都路由到主节点,事务退出后,恢复负载均衡。
    • 所有使用函数(除聚合函数,例如,count、sum)的语句,会路由到主节点。

创建或修改集群地址

高级选项-事务拆分

在默认的Read Commited隔离级别下,当PolarDB接收到开启事务的语句(例如begin或set autocommit=0)时,不会立即开启事务,而是在发生写操作时才正式开启事务。

默认情况下,PolarDB会将事务内的所有请求都发送到主节点以保障事务的正确性,但是某些框架会将所有请求封装到事务中,导致主节点负载过大。此时您可以开启事务拆分功能,开启后PolarDB会识别当前事务的状态,将正式开启事务前的读请求通过负载均衡模块分流至只读节点。

事务拆分
说明 某些业务对全局一致有要求,开启事务拆分后将不满足全局一致,因此在事务拆分前请充分评估事务拆分功能是否适用于您的业务。

开启事务拆分操作如下:

  1. 登录PolarDB控制台
  2. 在控制台左上角,选择集群所在地域。
  3. 找到目标集群,单击集群ID。
  4. 链接地址区域,找到目标集群地址,单击目标集群名称右侧的齿轮 > 编辑配置
    修改集群地址
  5. 编辑地址配置对话框内,开启事务拆分
    事务拆分
    说明 开启事务拆分后将对新的连接生效,现有的连接需重新连接才生效。
  6. 单击确定

高级选项-一致性级别

详情请参见PolarDB-O一致性级别

FAQ

  • Q:为什么刚插入的语句,立即查的时候查不到?

    A:读写分离的架构下,主节点和只读节点之间复制会有延迟,但PolarDB支持会话一致性,即同一个会话内保证能读到之前的更新。

  • Q:为什么只读节点没有压力?

    A:默认情况下事务中的请求都会路由到主节点,若是用sysbench做压测,0.5版本的sysbench可以加上--oltp-skip-trx=on,1.0版本的sysbench可以加上--skip-trx=on去掉事务,若业务上因为事务较多导致只读库负载过低,可以提交工单开启读写分离下的分布式事务。

  • Q:为什么某个节点的请求数比别的节点多?

    A:当前是根据负载来分发请求的,负载小的节点接收的请求数会更多。

  • Q:是否支持0毫秒延迟的读取?

    A:PolarDB集群的主节点和只读节点在正常负载情况下,具有毫秒级的延迟,读写分离连接地址暂时不支持在数据写入后0毫秒的读取。如果要求0毫秒延迟的读取,可使用主地址(动态指向PolarDB主节点)将读写请求发给主节点。

  • Q:新增的只读节点会自动加入到读写分离吗?

    A:新增只读节点之后新建的读写分离连接会转发请求到该只读节点。新增只读节点之前建立的读写分离连接不会转发请求到新增的只读节点,需要断开该连接并重新建立连接,例如,重启应用。