之前在Meetup中说到昆仑分布式数据库的架构的一些特点,因
此,有朋友好奇昆仑分布式数据库计算节点如何支持读写存储节点中的变量。
本篇文章就来阐述说明下
1.
使
set
[shard]
global
/
session
/
local
/PERSIST/PERSIST_only VARNAME=
VALUE
的语法
生效;
总是假设VARNAME是MySQL
的;
计算节点会发送SET语句给所有的存储节点去执行,且在一个session的生命期当中,所有设置过的session 变量的值会在计算节点的session里面缓存
。
在切换存储集群主节点后,新的主节点会使用缓存的session变量值设置给新的存储集群主节点,确保一致的会话(连接)状态。
set session innodb_lock_wait_timeout = 3;
set global innodb_lock_wait_timeout = 4; set persist_only innodb_lock_wait_timeout = 11;
2.
set VARNAME=VALUE
语句,在
PostgreSQL客户端连接的时候会默认以
PostgreSQL的变量名来看待他们,如果变量名不存在,则会把他们看成是MySQL的session变量。在客户端MySQL连接时,会默认把他们视为MySQL的session变量,如果变量名不存在则把他们视为
PostgreSQL变量。
set innodb_lock_wait_timeout = 2;
3.
计算节点会缓存MySQL配对的session var-value,且如果shard连接被重新设置或者重新连接,计算节点会把缓存的变量发送给MySQL节点。
4.
也支持
set @@global/session/local/persist/persist_only.varname=value
语句,且总是假定为MySQL变量,因为只有MySQL有这样的SET语法。但因
shift/reduce
冲突而不支持
set @@VARNAME=VALUE。
set @@global.innodb_lock_wait_timeout = 4;
set @@innodb_lock_wait_timeout = 2;
5.
支持
show [session/local/global] variables like 'wildcard-filter
语法且总是假定是MySQL变量,因为MySQL才有这样的语法,PostgreSQL没有。对于
show varname
语法总是先假定是PostgreSQL变量。如果变量名不是PostgreSQL变量,则被假定是MySQL变量。
show global variables like 'innodb_lock_wait_timeout';
show session variables like 'innodb_lock_wait_timeout';
show local variables like 'innodb_lock_wait_timeout';
6.
支持在Kunlun计算节点里面的选项
show [session/global/local] variables like
里选择
STRICT
来展示只有计算节点允许访问的MySQL变量。
show local variables like 'innodb_lock_wait_timeout' strict;
show session variables like 'innodb_lock_wait_timeout' strict;
show global variables like 'innodb_lock_wait_timeout' strict;
7.
当执行
show
语句时会取得一个变量的值,直接发送给任意存储shard来获取他的值。
昆仑分布式数据库的计算节点支持读写存储节点的系统变量,可以给用户带来很大的便利。
例如,用户可以在计算节点的连接中执行一个
set
global
var
=
value
;
语句,来设置所有后端集群的var变量的值为value。
也可以通过在计算节点执行一个
set
session
var
=
value
;
就把当前会话(连接)中的var变量的值设置为value。
这部分功能的对应测试脚本从
上面拉下来,在
src/
test
/regression/sql/vars.sql
中,这些测例也展示了MyQL变量访问的功能。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70011764/viewspace-2852630/
,如需转载,请注明出处,否则将追究法律责任。