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

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了瀚高数据库DML自动转发功能介绍(数据库层面)相关的知识,希望对你有一定的参考价值。

瀚高数据库
目录
文档用途
详细信息

文档用途
本文用于介绍瀚高在数据库层面开发的数据库转发功能,通过示例演示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(备节点)

2、普通模式

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

普通模式设置步骤:

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

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

演示如下:

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

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

3、Nontransactional(非事务)模式

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

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

演示如下:

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

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

备节点数据库日志如下:

主节点数据库日志如下:

通过以上日志可以发现,同一事物块内的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操作后,紧接着进行的select操作也会转移到主节点执行。

主节点数据库日志如下:

备节点数据库日志如下:

5、读写函数配置

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

①备节点数据库参数设置

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

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

备节点数据库日志如下:


主节点数据库日志如下:image.png


以上是关于瀚高数据库DML自动转发功能介绍(数据库层面)的主要内容,如果未能解决你的问题,请参考以下文章

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

5G网络学习——5G网络中数据包转发模型(未完待续)

5G网络学习——5G网络中数据包转发模型(未完待续)

MySQL 数据操作 DML(增删改查)

nginx 一直都在做7层转发,4层也需要看看

迁移char(n)数据类型到瀚高数据库数据不足定长自动补齐空格的问题