本文为您介绍PolarProxy(代理)的一致性级别、事务拆分、主库不接受读、Hint等功能。

PolarDB架构及PolarProxy介绍

PolarDB架构

PolarDB是一个由多个节点构成的数据库集群,一个主节点,多个读节点。对外默认提供两个地址,分别为主地址和集群地址。其中,集群地址功能由PolarProxy提供,集群地址分为读写集群地址和只读集群地址,读写集群地址支持读写分离,只读集群地址支持按连接数负载。读写分离请参见读写分离,更多关于PolarProxy的功能介绍请参见下文。

一致性级别

由于PolarDB使用异步复制的方式进行主从同步,该模式在读写分离模式下,可能出现一个写请求之后的读请求无法获得最新的写结果,导致不一致。PolarDB提供了如下几种一致性级别供您选择取值范围如下:

  • 最终一致性

    PolarDB采用异步物理复制方式在主库和只读库间做数据同步, 在主库更新后,相关的更新会同步到只读库,具体的延迟时间与写入压力有关, 延迟一般在毫秒(ms)级别, 通过异步复制的方式实现主库和只读库之间的最终数据一致。该级别无法保证业务通过读写分离地址获得一致性的数据。

  • 会话一致性(推荐)

    为解决最终一致性会出现的查询不一致,PolarDB利用自身物理复制速度快的优点,内部数据库代理会保证将查询发给已经更新了数据的只读节点,以满足会话一致性需求。

    说明 会话一致性只能满足一个会话内的请求是一致的,不能保证不同会话间的一致性,当所有只读节点都无法满足一致性要求时,会把该读请求路由到主库,所以可能引起主库读压力大。
说明 更多关于一致性级别的内容请参见PolarDB PostgreSQL一致性级别

事务拆分

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

通常情况数据库代理会将事务内的所有请求都发送到主节点,但由于某些框架实现的原因会将所有请求封装到事务中,导致主节点负载过大。此时您可以开启事务拆分功能,开启后数据库代理会识别当前事务的真正状态,将正式开启事务前的读请求通过负载均衡模块分流至只读节点。

事务拆分
说明
  • 读写分离模式下,事务拆分功能默认开启,如何修改事务拆分状态请参见高级选项-事务拆分
  • 某些业务对一致有较高要求,开启事务拆分后将不满足一致,因此在事务拆分前请充分评估事务拆分功能是否适用于您的业务。
  • 更改事务拆分设置后,仅对新建连接生效。

主库不接受读

当主库配置为不接受读时,普通的读请求将不再路由到主库。而事务内,一致性要求的读还是会被路由到主库,以保证业务的需求,另外当所有只读节点出现故障后读请求也会路由到主库。如果业务对一致的要求较低,可以通过设置一致性级别最终一致性来减少读请求到主库,也可以通过事务拆分功能来减少真正事务前的读请求路由到主库。 广播的请求(例如set, prepare)还是会路由到主库上。

说明
  • 读写分离模式下,主库不接受读默认开启。
  • 更改主库不接受读后立即生效。

Hint语法

在SQL语句前加上/*FORCE_MASTER*//*FORCE_SLAVE*/可以强制指定这条SQL的路由方向。

例如select * from test默认会路由到只读节点,改为/*FORCE_MASTER*/ select * from test就会路由到主节点。

说明
  • Hint的路由优化级最高,不受一致性级别和事务拆分的约束,使用前请进行评估。
  • Hint语句里不要有改变环境变量的语句,例如/*FORCE_SLAVE*/ set names utf8; 等,这类语句可能导致后续的业务出错。