3

瀚高数据库DML自动转发功能介绍(数据库层面)

 2 years ago
source link: https://blog.51cto.com/u_13646489/5614836
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

瀚高数据库DML自动转发功能介绍(数据库层面)

精选 原创

瀚高实验室 2022-08-24 10:27:12 博主文章分类:Highgo DB ©著作权

文章标签 sql 数据库 sql语句 文章分类 MySQL 数据库 阅读数214

瀚高数据库

本文用于介绍瀚高在数据库层面开发的数据库转发功能,通过示例演示DML自动转发功能。

一、功能介绍

为了向应用程序提供多主服务,瀚高数据库开发sql_forward转发模块。转发模块内嵌于数据库内核中,通过截获到客户端发过来的SQL语句后,分析其读写属性,并 按照配置模式将SQL语句或转发到主端执行,或留在备端执行;对于客户端来说,实现了所有节点都可以读写的功能

二、涉及参数

HG_PUROG_SQL_FORWARD  ##是否开启SQL转发

HG_PUROG_SQL_FORWARD_TRANSACTION_WILD_MODE = off   ##是否开启Nontransactional(非事务)模式

HG_PUROG_SQL_FORWARD_TRANSACTION_LOST_MODE = off   ##是否开启Enhancenon-transactional(增强非事务)模式

HG_SQL_FORWARD_LOST_MODE_ENHANCE_SESSION = off   ##是否开启Enhancenon-transactional(增强非事务)模式,同上个参数一块使用

sql_forward_conninfo = 'host=10.0.0.1 port=5432'  ##转发的主节点连接

fwd_master_func_list = 'nextval,setval,lastval,currval' ## 写函数转发配置

fwd_slave_func_list = ''      ##读函数转发配置举例如下:func_name1(table_name1,table_name2),func_name2(table_name3) 

三、配置及模式介绍

从SQL语句的处理角度来看,转发模块分为普通模式、Nontransactional(非事务)模式、Enhancenon-transactional(增强非事务)模式三种模式。其中最基础的是普通模 式,依据解析树判断 SQL 语句的读写属性,若是读属性的 SQL 语句留在备端执行,若是写属性的 SQL 语句则转发到主端执行并转发主端回复结果给客户端。Nontransactional (非事务)模式、Enhancenon-transactional(增强非事务)模式的处理逻辑和普通模式 基本一致,这三种模式最根本的差异在对于事务的处理上。 普通模式下把整个事务块作为写操作来看待处理,即整个事务块都会被转发到主端 执行;Nontransactional(非事务)模式则是打散了事务块,把事务块内的SQL语句当作 自动提交的SQL语句来看待,事务内的写操作转到主端处理,读操作继续在备端执行;Enhancenon-transactional(增强非事务)模式是Nontransactional(非事务)模式的增强, 动态记录事务内写操作SQL语句波及的表,若后续发现了读取这些表的读属性SQL语 句,那将该SQL语句转发到主端执行.

四、各模式详解

1、测试环境说明

操作系统:rehat7.7

CPU:x86_64

数据库版本:HighGo4.5.6-see

数据库架构:hghac

IP明细:192.168.164.101(主节点)

     192.168.164.102(备节点)

     192.168.164.103(备节点)

瀚高数据库DML自动转发功能介绍(数据库层面)_sql

2、普通模式

判断接收到的 SQL 语句的读写属性,若是读操作的 SQL 语句在备端按照原生 PG 逻辑处理,若是写操作的 SQL 语句转发到主端执行,并接收回复结果后发送给最终客 户端;其中,事务块作为写操作发给主端执行。

普通模式设置步骤:

该模式下只有自动提交的读操作在备端执行,自动提交的写操作、事务都会转到主

端执行。将 postgresql.conf 内的 HG_PUROG_SQL_FORWARD 参数设为 on 即开启了 该模式。

演示如下:

①在备节点执行ddl及dml语句,可看到执行成功

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_02

②查看主节点数据库日志,可看到相关sql从备节点转发到主节点

瀚高数据库DML自动转发功能介绍(数据库层面)_数据库_03

3、Nontransactional(非事务)模式

读操作在备端执行,写操作转到主端执行,事务内的读写会被打散,会有事务一致 性问题,只适应于特定的读多写少的场景。

Nontransactional(非事务)模式设置步骤: 将 postgresql.conf 内的 HG_PUROG_SQL_FORWARD 和 HG_PUROG_SQL_FORWARD_TRANSACTION_WILD_MODE 参数设为 on 即可开 启该模式

演示如下:

①在备节点开启事务,依次执行insert及select查询

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_04
瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_05

②查看主备节点数据库日志,可以看到select语句在本地执行,insert操作被转移到了主节点执行

备节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_06

主节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_07

通过以上日志可以发现,同一事物块内的SQL被打散执行,主点只执行事务内的insert操作,select 操作留在本地执行。

4、 Enhancenon-transactional(增强非事务)模式

自动提交的读操作在备端执行,自动提交的写操作转到主端执行;事务内的写操作 会被记录写的哪个表,若在该事务内读操作要读刚写的表的话,那该读操作被转发到主 端执行,否则读操作在备端执行

Enhancenon-transactional(增强非事务)模式设置步骤:

将 postgresql.conf 内的 HG_PUROG_SQL_FORWARD 和 HG_PUROG_SQL_FORWARD_TRANSACTION_LOST_MODE 参数设为 on 即可开启 该模式

①在备节点开启事务,依次执行insert及select查询表a,查询表b

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_08
瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_09

②查看主备节点数据日志,可以看到对同一个表进行DML操作后,紧接着进行的select操作也会转移到主节点执行。

主节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_10

备节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_11

5、读写函数配置

三种模式对于函数读写属性的判定是一致的,需要在 postgresql.conf 内配置 fwd_master_func_list 写函数列表、fwd_slave_func_list 读函数列表两个参数,下面以fwd_master_func_list为例演示:

①备节点数据库参数设置

瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_12

②备节点创建序列,使用nextval函数生成数值

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_13

③查看主备节点数据库日志,可以看到nextval函数的操作转移到了主节点执行

备节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql语句_14

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_15

主节点数据库日志如下:

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_17

瀚高数据库DML自动转发功能介绍(数据库层面)_sql_18


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK