本文为您介绍PolarDB数据库代理及其支持的相关功能。

前提条件

PolarDB标准版集群支持集群地址和数据库代理相关功能。PolarDB普惠版集群采用单节点架构无需集群地址和数据库代理功能。

PolarDB架构及PolarDB数据库代理介绍

PolarDB架构

PolarDB标准版是一个由多节点构成的数据库集群,包括一个主节点,多个只读节点。对外默认提供两个地址,分别为主地址和集群地址。其中,集群地址功能由PolarDB数据库代理提供,集群地址分为只读和可读可写两种读写模式,可读可写模式支持读写分离,只读模式支持按连接数负载。

读写分离

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

连接池

PolarDB提供了会话级连接池和事务级连接池。

  • 会话级连接池

    会话级连接池适用于PHP短连接场景。

    PHP短连接优化用于减少短连接业务频繁建立新连接导致MySQL负载高。当您的连接断开时,系统会判断当前的连接是否是一个闲置的连接,如果是闲置连接,系统将会代理该连接并保留在连接池中一小段时间,如果这时新的连接建立的话就会直接从连接池里获得连接(命中的条件包括userclientipdbname等),从而减少与数据库的建连开销;如果没有可用的连接,则走正常连接流程,重新与数据库建立一个新的连接。

    说明 该优化并不能减少数据库的并发连接数,只是减少应用与数据库建连的速率,从而减少MySQL主线程的开销,能够更好的处理业务请求。但是连接池里空闲的连接会短暂占您的连接数。
  • 事务级连接池

    事务级连接池适用于总连接数比较多的场景,例如连接数上万的情况。

    事务级连接池主要用于减少业务的连接数,以及减少短连接场景下频繁新建连接带来的负载。客户端可以与代理建立大量连接,而同时代理到数据库只创建少量连接。当客户端发送连接请求时,代理将从连接池中选取符合条件的(现阶段为系统变量一致)连接进行请求发送到数据库,并在当前事务结束后将连接放入连接池。

    使用限制如下:

    • 当执行以下行为时,锁定连接,直至连接结束,即该连接不会再被放到连接池里供其它用户连接使用。
      • 执行PREPARE语句或命令
      • 创建临时表
      • 修改用户变量
      • 大报文(例如16 M以上)
      • 使用lock table
      • 多语句
      • 存储过程调用
    • 不支持FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函数的调用,这些函数可以调用成功,但是结果无法保证正确。
    • 对于设置了wait_timeout的连接,wait_timeout在客户端的表现可能不会生效,因为每次请求都会从连接池中获取连接,当wait_timeout超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。
    • 除了sql_modecharacter_set_servercollation_servertime_zone这四个变量以外,如果业务依赖其他会话级别的系统变量,那么需要客户端在建连之后显式进行SET语句执行,否则连接池可能会复用系统变量已经被更改过的连接。
    • 由于连接可能会被复用,所以使用select connection_id()查询当前连接的thread id可能会变化。
    • 由于连接可能会被复用,所以show processlist中,显示的IP地址和端口可能和客户端实际的IP地址和端口不一致。
    • 数据库代理会将所有节点上的SHOW PROCESSLIST结果合并并返回,而在事务级连接池开启后,前端连接和后端连接的thread id无法对应。这导致KILL命令会可能返回一个错误,但是实际上KILL命令已经正常执行成功,可再通过SHOW PROCESSLIST确定相应的连接是否断开。
说明
  • 更改连接池设置后,仅对新建连接生效。如何修改主库不接受读状态请参见修改集群地址
  • 当前连接池功能不支持同一个账号对不同IP有不同的权限。如果您为同一个账号的不同IP设置了不同的库或者表权限,开通连接池可能会导致权限错误问题。例如user@192.xx.xx.1设置了database_a的权限,而user@192.xx.xx.2没有database_a的权限,可能会导致连接复用时权限出错。
  • 该功能是指PolarDB数据库代理的连接池功能,不影响客户端的连接池功能,如果客户端已经支持连接池,则可以不使用PolarDB数据库代理的连接池功能。

并行查询

并行查询是PolarDB MySQL 8.0引入的并行查询框架。PolarDB会根据成本和规则的考虑,启动这个查询框架。更多关于并行查询的介绍请参见并行查询

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:新增只读节点之后新建的读写分离连接才会转发请求到该只读节点。若需要使新增只读节点之前建立的读写分离连接也转发请求到新增的只读节点,则您需要通过重启应用等操作断开该连接并重新建立连接。

相关API

API 描述
CreateDBEndpointAddress 创建PolarDB集群的公网地址。
CreateDBClusterEndpoint 创建PolarDB自定义集群地址。
DescribeDBClusterEndpoints 查询PolarDB集群的地址信息。
ModifyDBClusterEndpoint 修改PolarDB集群地址属性。
ModifyDBEndpointAddress 修改PolarDB集群的连接地址(如自定义集群地址)。
DeleteDBEndpointAddress 释放PolarDB集群地址(除了自定义集群地址的私网地址)。
DeleteDBClusterEndpoint 释放PolarDB自定义集群地址。