存算分离计算集群
存算分离架构下,可以将一个或多个计算节点 (BE) 组成一个 Compute Cluster (以下简称 Cluster). 本文档描述如何使用 cluster(如何创建 cluster 请参考链接):
- 显示所有的 Cluster
- 如何进行 Cluster 的授权
- 如何在用户级别绑定 Cluster (
default_cloud_cluster
) 达到用户级别的隔离效果
SHOW CLUSTERS
可以通过 show clusters
,查看当前仓库拥有的所有计算集群。
mysql> show clusters;
+-------------------------------+------------+------------+
| cluster | is_current | users |
+-------------------------------+------------+------------+
| regression_test_cluster_name0 | FALSE | root, jack |
| regression_test_cluster_name5 | FALSE | |
+-------------------------------+------------+------------+
2 rows in set (0.01 sec)
mysql> SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name5';
Query OK, 0 rows affected (0.01 sec)
GRANT CLUSTER 访问权限给用户
1. 使用 MySQL Client 创建一个新用户
2. 语法
GRANT USAGE_PRIV ON CLUSTER {cluster_name} TO {user}
3. 示例
// 使用root账号在mysql client中创建jack用户
mysql> CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin";
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT USAGE_PRIV ON CLUSTER regression_test_cluster_name0 TO jack;
Query OK, 0 rows affected (0.01 sec)
// 使用jack登录mysql client
mysql> use d1@regression_test_cluster_name0;
Database changed
mysql> show grants for jack\G
*************************** 1. row ***************************
UserIdentity: 'jack'@'%'
Password: Yes
GlobalPrivs: Admin_priv (false)
CatalogPrivs: NULL
DatabasePrivs: internal.information_schema: Select_priv (false)
TablePrivs: NULL
ResourcePrivs: NULL
CloudCluster: regression_test_cluster_name0: Usage_priv (false)
CloudStage: NULL
1 row in set (0.00 sec)
mysql> select * from t1;
+------+------+-------+
| id | name | score |
+------+------+-------+
| 1 | aaa | 20 |
| 2 | bbb | 320 |
| 3 | ccc | 30 |
| 4 | ddd | 120 |
| 5 | eee | 30 |
| 6 | fff | 30 |
| 7 | ggg | 90 |
| 8 | hhh | 30 |
+------+------+-------+
8 rows in set (12.70 sec)
mysql> insert into t1 (id, name, score) values (8, "hhh", 30);
Query OK, 1 row affected (7.22 sec)
{'label':'insert_6f40c1713baf4d61_9c33c0962c68ab07', 'status':'VISIBLE', 'txnId':'5462662627547136'}
给 jack 用户 GRANT 一个不存在的 Cluster,不会报错。但是在 use @cluster
的时候会报错
mysql> GRANT USAGE_PRIV ON CLUSTER not_exist_cluster TO jack;
Query OK, 0 rows affected (0.05 sec)
mysql> show grants for jack\G
*************************** 1. row ***************************
UserIdentity: 'jack'@'%'
Password: Yes
GlobalPrivs: Admin_priv (false)
CatalogPrivs: NULL
DatabasePrivs: internal.information_schema: Select_priv (false)
TablePrivs: NULL
ResourcePrivs: NULL
CloudCluster: not_exist_cluster: Usage_priv (false)
CloudStage: NULL
1 row in set (0.00 sec)
切换到jack账号, use @not_exist_cluster, 会报错提示not_exist_cluster不存在
mysql> use information_schema@not_exist_cluster;
No connection. Trying to reconnect...
Connection id: 1
Current database: *** NONE ***
ERROR 5091 (42000): Cluster not_exist_cluster not exist
REVOKE 用户访问 Cluster 权限
1. 语法
REVOKE USAGE_PRIV ON CLUSTER {cluster_name} FROM {user}
2. 示例
// 使用root账号在mysql client中创建jack用户
mysql> REVOKE USAGE_PRIV ON CLUSTER regression_test_cluster_name0 FROM jack;
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for jack\G
*************************** 1. row ***************************
UserIdentity: 'jack'@'%'
Password: Yes
GlobalPrivs: Admin_priv (false)
CatalogPrivs: NULL
DatabasePrivs: internal.information_schema: Select_priv (false)
TablePrivs: NULL
ResourcePrivs: NULL
CloudCluster: NULL
CloudStage: NULL
1 row in set (0.01 sec)
设置 default_cluster
1. 语法
为当前用户设置默认 Cluster
SET PROPERTY 'default_cloud_cluster' = '{clusterName}';
为其他用户设置默认 Cluster,注意需要有 Admin 权限
SET PROPERTY FOR {user} 'default_cloud_cluster' = '{clusterName}';
展示当前用户默认 Cluster,注意需要有,default_cloud_cluster
的 Value 既是默认 Cluster
SHOW PROPERTY;
展示其他用户默认 Cluster,主要当前用户要有相关权限,default_cloud_cluster
的 Value 既是默认 Cluster
SHOW PROPERTY FOR {user};
展示当前 Warehouse 下所有可用的 Clusters
SHOW CLUSTERS;
2. 注意
当前用户拥有 Admin Role,例如:
CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin"
;- 可以给自己设置 Default Cluster 和给其他用户设置 Default Cluster;
- 可以 SHOW 自己的 PROPERTY 和其他用户的 PROPERTY;
当前用户不拥有 admin role,例如 CREATE USER jack1 IDENTIFIED BY '123456';
可以给自己设置 Default Cluster
可以 SHOW 自己的 PROPERTY
不能 SHOW CLUSTERS,会提示需要 GRANT ADMIN 权限
若当前用户没有配置默认 Cluster,目前实现在读写数据的时候,会报错。可以使用
use @cluster
设置当前 Context 使用的 Cluster,也可以使用 SET PROPERTY 设置默认 Cluster若当前用户配置了默认 Cluster,但是后面此 Cluster 被 Drop 掉了,读写数据会报错,可以使用
use @cluster
设置当前 Context 使用的 Cluster,也可以使用 SET PROPERTY 设置默认 Cluster
3. 示例
// 设置当前用户默认 Cluster
mysql> SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name0';
Query OK, 0 rows affected (0.02 sec)
// 展示当前用户的默认 Cluster
mysql> show PROPERTY;
+------------------------+-------------------------------+
| Key | Value |
+------------------------+-------------------------------+
| cpu_resource_limit | -1 |
| default_cloud_cluster | regression_test_cluster_name0 |
| exec_mem_limit | -1 |
| load_mem_limit | -1 |
| max_query_instances | -1 |
| max_user_connections | 100 |
| quota.high | 800 |
| quota.low | 100 |
| quota.normal | 400 |
| resource.cpu_share | 1000 |
| resource.hdd_read_iops | 80 |
| resource.hdd_read_mbps | 30 |
| resource.io_share | 1000 |
| resource.ssd_read_iops | 1000 |
| resource.ssd_read_mbps | 30 |
| resource_tags | |
| sql_block_rules | |
+------------------------+-------------------------------+
17 rows in set (0.00 sec)
// 使用 root 账号在 MySQL Client 中创建 jack 用户
mysql> CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin";
Query OK, 0 rows affected (0.01 sec)
// 给 jack 用户设置默认 Cluster
mysql> SET PROPERTY FOR jack 'default_cloud_cluster' = 'regression_test_cluster_name1';
Query OK, 0 rows affected (0.00 sec)
// 展示其他用户的默认 Cluster
mysql> show PROPERTY for jack;
+------------------------+-------------------------------+
| Key | Value |
+------------------------+-------------------------------+
| cpu_resource_limit | -1 |
| default_cloud_cluster | regression_test_cluster_name1 |
| exec_mem_limit | -1 |
| load_mem_limit | -1 |
| max_query_instances | -1 |
| max_user_connections | 100 |
| quota.high | 800 |
| quota.low | 100 |
| quota.normal | 400 |
| resource.cpu_share | 1000 |
| resource.hdd_read_iops | 80 |
| resource.hdd_read_mbps | 30 |
| resource.io_share | 1000 |
| resource.ssd_read_iops | 1000 |
| resource.ssd_read_mbps | 30 |
| resource_tags | |
| sql_block_rules | |
+------------------------+-------------------------------+
17 rows in set (0.00 sec)
若当前 Warehouse 下不存在将要设置的默认 Cluster 会报错,提示使用 SHOW CLUSTERS 展示当前 Warehouse 下所有有效的 Cluster Cluster 列表示 clusterName
,is_current
列表示当前用户是否使用此 Cluster,Users 列表示这些用户设置默认 Cluster 为当前行的 Cluster
mysql> SET PROPERTY 'default_cloud_cluster' = 'not_exist_cluster';
ERROR 5091 (42000): errCode = 2, detailMessage = Cluster not_exist_cluster not exist, use SQL 'SHOW CLUSTERS' to get a valid cluster
mysql> show clusters;
+-------------------------------+------------+------------+
| cluster | is_current | users |
+-------------------------------+------------+------------+
| regression_test_cluster_name0 | FALSE | root, jack |
| regression_test_cluster_name5 | FALSE | |
+-------------------------------+------------+------------+
2 rows in set (0.01 sec)
mysql> SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name5';
Query OK, 0 rows affected (0.01 sec)
未设置 default_cluster,系统自动选择集群的规则
如果用户没有设置默认集群,则会找到一个有 active 后端并且有使用权限的集群。并且在同次会话中,系统选择的集群将一直保持不变。
对于不同次的会话,存在以下情况,可能导致系统自动选择的集群发生改变
用户失去了上次选择集群的使用权限
有集群被添加或者移除
上次选择的集群不存在 Active 的后端
其中,第一种和第二种情况一定会导致系统自动选择的集群发生改变,第三种情况可能会导致系统自动选择的集群发生改变。
切换 Cluster
在存算分离版本中,指定使用的数据库和计算集群
1. 语法
USE { [catalog_name.]database_name[@cluster_name] | @cluster_name }
如果 Database 名字或者 Cluster 名字是保留的关键字,需要用 Backtick
` `
括起来
2. 举例
指定使用该数据库 test_database
USE test_database
或者
USE `test_database`指定使用该计算集群 test_cluster
USE @test_cluster
或者
USE @`test_cluster`同时指定使用该数据库 test_database 和计算集群 test_cluster
USE test_database@test_cluster
USE `test_database`@`test_cluster`