在存算分离架构下,可以将一个或多个计算节点 (BE) 组成一个计算集群 (Compute Cluster)。本文档介绍如何使用计算集群,其中涉及的操作包括:

  • 查看所有计算集群
  • 计算集群授权
  • 在用户级别绑定计算集群 (default_cloud_cluster) 以达到用户级别的隔离效果

计算集群操作 - 图1备注

本文涉及的 cluster 均表示计算集群。

查看所有计算集群

可通过 show clusters 查看当前仓库拥有的所有计算集群。

1. > mysql show clusters;
2. +-------------------------------+------------+------------+
3. | cluster                       | is_current | users      |
4. +-------------------------------+------------+------------+
5. | regression_test_cluster_name0 | FALSE      | root, jack |
6. | regression_test_cluster_name5 | FALSE      |            |
7. +-------------------------------+------------+------------+
8. 2 rows in set (0.01 sec)

10. mysql SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name5';
11. Query OK, 0 rows affected (0.01 sec)

授予计算集群访问权限

使用 MySQL Client 创建一个新用户。

语法

1. GRANT USAGE_PRIV ON CLUSTER {cluster_name} TO {user}

示例

1. // 使用 Root 账号在 MySQL Client 中创建 Jack 用户
2. mysql CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin";
3. Query OK, 0 rows affected (0.01 sec)

5. mysql GRANT USAGE_PRIV ON CLUSTER regression_test_cluster_name0 TO jack;
6. Query OK, 0 rows affected (0.01 sec)

8. // 使用 Jack 登录 MySQL Client
9. mysql use d1@regression_test_cluster_name0;
10. Database changed

12. mysql show grants for jack\G
13. *************************** 1. row ***************************
14. UserIdentity: 'jack'@'%'
15. Password: Yes
16. GlobalPrivs: Admin_priv  (false)
17. CatalogPrivs: NULL
18. DatabasePrivs: internal.information_schema: Select_priv  (false)
19. TablePrivs: NULL
20. ResourcePrivs: NULL
21. CloudCluster: regression_test_cluster_name0: Usage_priv  (false)
22. CloudStage: NULL
23. 1 row in set (0.00 sec)

25. mysql select * from t1;
26. +------+------+-------+
27. | id   | name | score |
28. +------+------+-------+
29. |    1 | aaa  |    20 |
30. |    2 | bbb  |   320 |
31. |    3 | ccc  |    30 |
32. |    4 | ddd  |   120 |
33. |    5 | eee  |    30 |
34. |    6 | fff  |    30 |
35. |    7 | ggg  |    90 |
36. |    8 | hhh  |    30 |
37. +------+------+-------+
38. 8 rows in set (12.70 sec)

40. mysql insert into t1 (id, name, score) values (8, "hhh", 30);
41. Query OK, 1 row affected (7.22 sec)
42. {'label':'insert_6f40c1713baf4d61_9c33c0962c68ab07', 'status':'VISIBLE', 'txnId':'5462662627547136'}

若向 Jack 用户授权一个不存在的计算集群,系统不会报错,而会在执行相应的 use @cluster 时报错。

1. mysql GRANT USAGE_PRIV ON CLUSTER not_exist_cluster TO jack;
2. Query OK, 0 rows affected (0.05 sec)

4. mysql show grants for jack\G
5. *************************** 1. row ***************************
6. UserIdentity: 'jack'@'%'
7. Password: Yes
8. GlobalPrivs: Admin_priv  (false)
9. CatalogPrivs: NULL
10. DatabasePrivs: internal.information_schema: Select_priv  (false)
11. TablePrivs: NULL
12. ResourcePrivs: NULL
13. CloudCluster: not_exist_cluster: Usage_priv  (false)
14. CloudStage: NULL
15. 1 row in set (0.00 sec)

17. 切换到 Jack 账号,执行 use @not_exist_cluster,将出现提示 not_exist_cluster 不存在的报错提示

19. mysql use information_schema@not_exist_cluster;
20. No connection. Trying to reconnect...
21. Connection id:    1
22. Current database: *** NONE ***

24. ERROR 5091 (42000): Cluster not_exist_cluster not exist

撤销计算集群访问权限

语法

1. REVOKE USAGE_PRIV ON CLUSTER {cluster_name} FROM {user}

示例

1. // 使用 Root 账号在 MySQL Client 中创建 Jack 用户
2. mysql REVOKE USAGE_PRIV ON CLUSTER regression_test_cluster_name0 FROM jack;
3. Query OK, 0 rows affected (0.01 sec)

5. mysql show grants for jack\G
6. *************************** 1. row ***************************
7. UserIdentity: 'jack'@'%'
8. Password: Yes
9. GlobalPrivs: Admin_priv  (false)
10. CatalogPrivs: NULL
11. DatabasePrivs: internal.information_schema: Select_priv  (false)
12. TablePrivs: NULL
13. ResourcePrivs: NULL
14. CloudCluster: NULL
15. CloudStage: NULL
16. 1 row in set (0.01 sec)

设置默认计算集群

用户可从多个计算集群选择设置为默认计算集群。

语法

为当前用户设置默认计算集群:

1. SET PROPERTY 'default_cloud_cluster' = '{clusterName}';

为其他用户设置默认计算集群(此操作需要 Admin 权限):

1. SET PROPERTY FOR {user} 'default_cloud_cluster' = '{clusterName}';

查看当前用户默认计算集群,返回结果中default_cloud_cluster 的值即为默认计算集群:

1. SHOW PROPERTY;

查看其他用户默认计算集群,此操作需要当前用户具备相关权限,返回结果中default_cloud_cluster 的值即为默认计算集群:

1. SHOW PROPERTY FOR {user};

查看当前仓库下所有可用的计算集群:

1. SHOW CLUSTERS;

计算集群操作 - 图2备注

  • 若当前用户拥有 Admin 角色,例如:CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin",则:
  • 可以为自身以及其他用户设置默认计算集群;
  • 可以查看自身以及其他用户的 PROPERTY。
  • 若当前用户无 Admin 角色,例如:CREATE USER jack1 IDENTIFIED BY '123456',则:
  • 可以为自身设置默认计算集群;
  • 可以查看自身的 PROPERTY;
  • 无法查看所有计算集群,因该操作需要 GRANT ADMIN 权限。
  • 若当前用户未配置默认计算集群,现有系统在执行数据读写操作时将会触发错误。为解决这一问题,用户可通过执行 use @cluster 命令来指定当前 Context 所使用的计算集群,或者使用 SET PROPERTY 语句来设置默认计算集群。
  • 若当前用户已配置默认计算集群,但随后该集群被删除,则在执行数据读写操作时同样会触发错误。用户可通过执行 use @cluster 命令来重新指定当前 Context 所使用的计算集群,或者利用 SET PROPERTY 语句来更新默认集群设置。

示例

1. // 设置当前用户的默认计算集群
2. mysql SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name0';
3. Query OK, 0 rows affected (0.02 sec)

5. // 展示当前用户的默认计算集群
6. mysql show PROPERTY;
7. +------------------------+-------------------------------+
8. | Key                    | Value                         |
9. +------------------------+-------------------------------+
10. | cpu_resource_limit     | -1                            |
11. | default_cloud_cluster  | regression_test_cluster_name0 |
12. | exec_mem_limit         | -1                            |
13. | load_mem_limit         | -1                            |
14. | max_query_instances    | -1                            |
15. | max_user_connections   | 100                           |
16. | quota.high             | 800                           |
17. | quota.low              | 100                           |
18. | quota.normal           | 400                           |
19. | resource.cpu_share     | 1000                          |
20. | resource.hdd_read_iops | 80                            |
21. | resource.hdd_read_mbps | 30                            |
22. | resource.io_share      | 1000                          |
23. | resource.ssd_read_iops | 1000                          |
24. | resource.ssd_read_mbps | 30                            |
25. | resource_tags          |                               |
26. | sql_block_rules        |                               |
27. +------------------------+-------------------------------+
28. 17 rows in set (0.00 sec)

30. // 使用 Root 账号在 MySQL Client 中创建 Jack 用户
31. mysql CREATE USER jack IDENTIFIED BY '123456' DEFAULT ROLE "admin";
32. Query OK, 0 rows affected (0.01 sec)

34. // 为 jack 用户设置默认计算集群
35. mysql SET PROPERTY FOR jack 'default_cloud_cluster' = 'regression_test_cluster_name1';
36. Query OK, 0 rows affected (0.00 sec)

38. // 查看其他用户的默认计算集群
39. mysql show PROPERTY for jack;
40. +------------------------+-------------------------------+
41. | Key                    | Value                         |
42. +------------------------+-------------------------------+
43. | cpu_resource_limit     | -1                            |
44. | default_cloud_cluster  | regression_test_cluster_name1 |
45. | exec_mem_limit         | -1                            |
46. | load_mem_limit         | -1                            |
47. | max_query_instances    | -1                            |
48. | max_user_connections   | 100                           |
49. | quota.high             | 800                           |
50. | quota.low              | 100                           |
51. | quota.normal           | 400                           |
52. | resource.cpu_share     | 1000                          |
53. | resource.hdd_read_iops | 80                            |
54. | resource.hdd_read_mbps | 30                            |
55. | resource.io_share      | 1000                          |
56. | resource.ssd_read_iops | 1000                          |
57. | resource.ssd_read_mbps | 30                            |
58. | resource_tags          |                               |
59. | sql_block_rules        |                               |
60. +------------------------+-------------------------------+
61. 17 rows in set (0.00 sec)

若用户意图设置为默认计算集群的计算集群不存在,系统会报错并提示用户使用 SHOW CLUSTERS 命令来查看当前仓库下所有有效的计算集群。SHOW CLUSTERS 命令将返回一个结果集,其中:

  • Cluster 列表示计算集群名称。
  • is_current 列表示当前用户是否使用此计算集群。
  • Users 列表示该计算集群被以下用户设置为默认计算集群。
1. mysql SET PROPERTY 'default_cloud_cluster' = 'not_exist_cluster';
2. ERROR 5091 (42000): errCode = 2, detailMessage = Cluster not_exist_cluster not exist, use SQL 'SHOW CLUSTERS' to get a valid cluster

4. mysql show clusters;
5. +-------------------------------+------------+------------+
6. | cluster                       | is_current | users      |
7. +-------------------------------+------------+------------+
8. | regression_test_cluster_name0 | FALSE      | root, jack |
9. | regression_test_cluster_name5 | FALSE      |            |
10. +-------------------------------+------------+------------+
11. 2 rows in set (0.01 sec)

13. mysql SET PROPERTY 'default_cloud_cluster' = 'regression_test_cluster_name5';
14. Query OK, 0 rows affected (0.01 sec)

默认计算集群的选择机制

当用户未明确设置默认计算集群时,系统将自动为用户选择一个具有 Active 后端且用户具有使用权限的计算集群。在特定会话中确定默认计算集群后,默认计算集群将在该会话期间保持不变,除非用户显式更改了默认设置。

在不同次的会话中,若发生以下情况,系统可能会自动更改用户的默认计算集群:

  • 用户失去了在上次会话中所选择默认计算集群的使用权限
  • 有集群被添加或移除
  • 上次所选择的默认计算集群不再具有 Active 后端

其中,情况一和情况二必定会导致系统自动选择的默认计算集群更改,情况三可能会导致更改。

切换计算集群

用户可在存算分离架构中指定使用的数据库和计算集群。

语法

1. USE { [catalog_name.]database_name[@cluster_name] | @cluster_name }

若数据库或计算集群名称包含是保留关键字,需用反引号将相应的名称 ``` 包围。

示例

指定使用数据库 test_database:

1. USE test_database
2. 或者
3. USE `test_database`

指定使用计算集群 test_cluster:

1. USE @test_cluster
2. 或者
3. USE @`test_cluster`

同时指定使用数据库 test_database 和计算集群 test_cluster

1. USE test_database@test_cluster
2. USE `test_database`@`test_cluster`