SelectDB Cloud
开发指南
数据查询
计算集群

计算集群

SelectDB Cloud采用存储和计算分离的架构。

其中数据主要存储在云厂商的对象存储上,一个仓库可拥有多个互相隔离的计算集群,每个计算集群有多台计算节点组成。所有的计算集群共享底层的对象存储。

计算集群的创建,请在 管理指南/集群管理 部分进行创建。

使用时指定集群

当存在多个集群时,可以通过以下方式指定集群,示例如下:

  1. 通过 MySQL Client 连接 SelectDB,使用集群 cluster_1 进行数据库、表的建立。
//切换使用计算集群 cluster_1
USE @cluster_1;
 
//创建 database、table
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table
(
    k1 TINYINT,
    k2 DECIMAL(10, 2) DEFAULT "10.05",
    k3 CHAR(10) COMMENT "string column",
    k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 16;
  1. JDBC 连接串
jdbc:mysql://<host>:<port>/<Database>@<Cluster>?user=<Username>&password=<Password>
  1. 通过 Stream Load 方式,使用集群 cluster_2 写入样例数据。
curl --location-trusted -u admin:admin_123 -H "cloud_cluster:cluster_2" -H "label:123" -H "column_separator:," -T data.csv http://host:port/api/test_db/test_table/_stream_load

其中 data.csv 中的样例数据如下:

1,0.14,a1,20
2,1.04,b2,21
3,3.14,c3,22
4,4.35,d4,23
  1. 在 WebUI 中指定集群

执行 SQL 命令时,可右上角选择切换集群

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}
  1. 示例:
// 使用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}
  1. 示例:
// 使用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;
  1. 注意:
  • 当前用户拥有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
  1. 示例:
// 设置当前用户默认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 }

Note: 如果database名字或者cluster名字是保留的关键字, 需要用backtick

` `

括起来

2. 举例

  1. 指定使用该数据库test_database
USE test_database
或者
USE `test_database`
  1. 指定使用该计算集群test_cluster
USE @test_cluster
或者
USE @`test_cluster`
  1. 同时指定使用该数据库test_database和计算集群test_cluster
USE test_database@test_cluster
USE `test_database`@`test_cluster`
© 2023 北京飞轮数据科技有限公司 京ICP备2022004029号 | Apache、Apache Doris 以及相关开源项目名称均为 Apache 基金会商标