瀚高数据库
目录
文档用途
详细信息
文档用途
本文用于介绍瀚高在数据库层面开发的数据库转发功能,通过示例演示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