• 瀚高数据库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(备节点)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    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

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    MathorCup挑战赛获奖名单公示,第九届研讨会及颁奖典礼即将举行
    斐波那契数列
    一种简易的Nor flash存储数据机制
    【Spring Boot】# 使用AOP实现接口鉴权访问、白名单限制、记录接口访问日志、限制接口请求次数
    云计算平台建设总体技术方案参考
    Liteos信号量的使用
    AGV|RGV小车RFID传感读卡器CK-G06A开发与用户手册技术说明
    【一】【SQL】表的增删查改(部分)
    06.多态
    matplotlib画latex表格
  • 原文地址:https://blog.csdn.net/pg_hgdb/article/details/126498861