更新时间:2024-11-06 GMT+08:00

GaussDB(for MySQL)数据库代理简介

数据库代理是GaussDB(for MySQL)和应用服务之间的网络代理服务,用于代理应用服务访问GaussDB(for MySQL)的所有请求。

读写分离是指通过数据库代理地址实现读写请求的自动转发。创建GaussDB(for MySQL)实例后,您可以开通数据库代理,通过代理地址,写请求自动访问主节点,读请求按照数据库代理的路由模式分发到各个节点,进行读写分离,降低主节点的负载。

功能介绍

基本概念

  • 代理地址

    购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。

  • 代理模式

    GaussDB(for MySQL)的代理模式支持读写模式和只读模式。

    读写模式:所有写请求只发往主节点,所有读请求按照读权重配比或者是活跃连接数情况分发到已选节点。

    只读模式:所有读请求按照读权重配比或者是活跃连接数情况分发到已选只读节点,不会分发到主节点。

  • 事务拆分

    数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。

    更多关于事务拆分的内容请参见开启GaussDB(for MySQL)代理的事务拆分功能

  • 连接池

    数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。

    更多关于连接池的内容请参见开启GaussDB(for MySQL)代理的连接池功能

  • 路由模式

    GaussDB(for MySQL)数据库代理支持权重负载、负载均衡的路由模式,可根据需要配置不同的路由模式。

    • 权重负载:根据您设置的读权重比例分发读请求。
    • 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。

    更多关于路由模式的内容请参见路由模式

读写分离原理

GaussDB(for MySQL)支持开通一个或多个数据库代理。

  • 单个数据库代理下的读写分离

    一个GaussDB(for MySQL)实例下只有1个数据库代理实例,应用服务通过数据库代理地址连接到数据库代理实例,写请求通过数据库代理实例自动转发到主节点,读请求根据数据库代理实例的路由模式转发至主节点或只读节点。

    图1 单个数据库代理读写分离原理图
  • 多个数据库代理下的读写分离

    一个GaussDB(for MySQL)实例下可以创建多个数据库代理实例,最多支持创建4个代理实例,主要适用于有隔离需求的复杂业务。不同的应用服务可以根据业务需要连接不同的数据库代理,数据库代理连接指定的只读节点,将不同应用服务之间的读请求最终转发到不同的只读节点上,实现业务隔离。

    图2 多个数据库代理读写分离

适用场景

  • 事务内有大量请求,导致主节点负载过高的场景。
  • 连接数过多导致主节点负载过高的场景。
  • 有读写分离需求的场景。

读写分离优势

  • 相比在应用程序内手动做读写分离,扩容灵活,维护成本低。
  • 客户端读请求按权重分发至后端只读节点,数据库实例整体负载更加均衡,提升资源利用率。
  • 通过代理将指定业务的读请求路由到选定的只读实例上,实现业务隔离,避免多个业务之间相互影响。
  • 数据库代理默认提供过载保护功能:避免用户执行大结果集操作时,因压力过大引起服务端OOM。该功能默认打开,不需要用户单独设置。针对数据库内核过慢引起的压力,依赖数据库限流机制。

请求路由规则

  • 只发往主节点的写请求
    • INSERT、UPDATE、DELETE。
    • 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。
    • 所有事务中的请求(事务拆分开启时部分读请求可能发送至只读节点,详见事务拆分)。
    • 用户自定义函数。
    • 存储过程。
    • EXECUTE语句。
    • Multi Statements。
    • 使用到临时表的请求。
    • 所有对用户变量的更改。
    • KILL(SQL语句中的KILL,非命令KILL)。
  • 发往主节点的读请求
    • 如果查询语句被放在事务中,事务请求都会路由到主实例。如果在查询语句前设置set autocommit=0时也当做事务处理路由到主实例。
    • 如果所有只读节点都均异常或只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。
    • 在执行SQL语句时:
      • 如果执行了Multi-Statements(如“insert xxx;select xxx”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
      • 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。
      • 当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。
      • 如果执行了Handler语句,默认后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
    • SELECT last_insert_id()。
    • 所有对用户变量的查询。
  • 发往只读节点或主节点
    • 非事务中的SELECT。
    • COM_STMT_EXECUTE命令。
  • 总是发往所有节点
    • 所有系统变量的更改。
    • USE命令。

数据库代理读写属性处理逻辑

GaussDB(for MySQL)数据代理支持只读和读写两种代理模式,每种模式的读写属性处理逻辑不同。

数据库代理模式

路由模式

主节点权重

正常情况

只读节点全部故障

只读

权重负载

负载均衡

主节点权重不可设置

主节点:不处理只读请求

代理地址:可读不可写

主节点:不处理只读请求

代理地址:连接报错

读写

负载均衡

系统分配

主节点:可读可写

代理地址:可读可写

主节点:可读可写

代理地址:可读可写

权重负载

> 0

主节点:可读可写

代理地址:可读可写

主节点:可读可写

代理地址:可读可写

= 0

主节点:不可读可写

代理地址:可读可写

主节点:可读可写

代理地址:可读可写

计费说明

数据库代理服务暂不收费。

注意事项

表1 数据库代理注意事项

分类

注意事项

版本约束

  • GaussDB(for MySQL)实例内核版本如下时,不支持开通数据库代理。
    • 大于等于2.0.26.2且小于等于2.0.28.3
    • 等于2.0.29.1
  • GaussDB(for MySQL)实例的内核版本低于2.0.42.230601时,仅支持创建1个代理实例。
  • GaussDB(for MySQL)实例的内核版本高于或等于2.0.42.230601时,最多支持创建4个代理实例。

不支持的功能

  • 数据库代理不支持压缩协议。
  • 数据库代理不支持事务隔离级别READ-UNCOMMITTED。
  • 数据库代理不支持读写表中单列超过16MB的数据。
  • 数据库代理不支持SQL_MODE参数PAD_CHAR_TO_FULL_LENGTH

使用约束

  • 实例的CPU总核数(即所有节点的CPU核数的总和)低于8核时,不支持开通数据库代理。
  • 至少创建1个只读节点才能开启读写分离功能。
  • 开启读写分离功能后,不允许修改GaussDB(for MySQL)实例的端口和读写内网地址。
  • 如果执行了Multi-Statements,当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
  • 使用代理地址时,事务请求都会路由到实例的主节点(可以使用事务拆分功能对事务中写之前的读请求进行拆分),不保证非事务读的一致性,业务上有读一致性需求可以封装到事务中。
  • 使用代理地址时,show processlist和直连数据库有差异。因为数据库代理的show processlist是逻辑的,仅仅将通过数据库代理节点下发的业务展示出来,所以和直连数据库有差异。
  • 当某一个代理节点处于异常状态时,通过代理执行show processlist或者Kill时,有可能会出现命令执行时间稍微变长的情况,此时无需关注,业务不会受到影响。
  • 当数据库代理进行缩容后,通过代理执行show processlist命令时,可能会将被缩容的节点上的业务展示出来。
  • 通过数据库代理进行Kill时,偶尔可能会出现超时等报错信息,此时可以通过二次show processlist查看业务是否真正被Kill成功。
  • 当数据库代理的某个节点处于异常状态时,执行show processlist命令时,可能会出现2秒卡顿,此时无需关注,结果会正常返回。
  • 当使用数据库代理时,多语句拼接的SQL大小不超过100MB,避免数据库代理解析SQL消耗过多的资源。
  • 当使用数据库代理时,不能使用中文数据库和中文用户名。

HTAP实时分析

  • 不支持一致性级别和连接池。
  • 路由模式仅支持权重负载模式。
  • 代理模式仅支持读写模式。