Klustron(原KunlunBase) 独特的变量读写功能介绍
Klustron(原KunlunBase) 独特的变量读写功能介绍
本篇文章阐述说明下Klustron 计算节点如何支持读写存储节点中的变量。
功能详细介绍
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、支持在 Klustron 计算节点里面的选项 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 来获取他的值。
8、支持 select @@[global. | session.]var_name [ [AS] alias] [, ... ] [limit N] 语法,例如: select @@global.innodb_lock_wait_timeout, @@autocommit AS ac; select @@session.sql_log_bin limit 1
总结
Klustron 的计算节点支持读写存储节点的系统变量,可以给用户带来很大的便利。
例如,用户可以在计算节点的连接中执行一个 set global var=value; 语句,来设置所有后端集群的 var 变量的值为 value。也可以通过在计算节点执行一个 set session var=value; 就把当前会话(连接)中的var变量的值设置为 value。
这部分功能的对应测试脚本从 https://gitee.com/zettadb/kunlun.git 上面拉下来,在 src/test/regression/sql/vars.sql 中,这些测例也展示了 MyQL 变量访问的功能。