云数据库 SelectDB 版实例下可以包含多个计算集群,可分别用于支持不同的工作负载(例如读写隔离、在离线隔离等),以满足多业务间负载隔离的需求。本文将介绍云数据库 SelectDB 版实例中,如何使用多计算集群进行计算资源隔离。
基础原理
云数据库 SelectDB 版采用计算与存储分离的云原生架构,计算和存储分离之后,使得同一份数据可以被上层计算资源所共享。云数据库 SelectDB 版基于此架构提供了多计算集群特性。同一个实例(Instance)下可以包含多个计算集群,并共享底层的数据存储。
计算集群类似分布式系统中的计算组、计算队列,协调一个或多个负责计算的单元共同完成整体的计算任务。由于计算资源是物理隔离的,可分别用于支持不同的工作负载(例如读写隔离、在离线隔离等),从而满足多业务间负载隔离的需求,避免了业务间互相干扰。
使用示例
一个基础的多计算集群访问场景如下:实例有两个账号test_01和test_02。test_01用于业务A的计算请求,为其分配了集群cluster_01。test_02用于业务B的计算请求,为其分配了集群cluster_02。两个账号都可以操作实例中的全部数据。
通过admin账号连接实例,初始化test_01和test_02账号。示例如下。
mysql> CREATE USER test_01 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.06 sec) mysql> CREATE USER test_02 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.04 sec) mysql> GRANT ALL ON *.* TO test_01; Query OK, 0 rows affected (0.07 sec) mysql> GRANT ALL ON *.* TO test_02; Query OK, 0 rows affected (0.05 sec) mysql> GRANT USAGE_PRIV ON CLUSTER cluster_01 TO test_01; Query OK, 0 rows affected (0.05 sec) mysql> GRANT USAGE_PRIV ON CLUSTER cluster_02 TO test_02; Query OK, 0 rows affected (0.04 sec)
admin账号下查看当前可用集群,示例如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_01 | FALSE | | | cluster_02 | TRUE | | +------------+------------+-------+ 2 rows in set (0.04 sec)
结果显示admin账号拥有两个集群的访问权限,当前默认访问的集群是cluster_02。
通过test_01账号连接实例,查看当前可用集群,示例如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_01 | TRUE | | +------------+------------+-------+ 1 row in set (0.03 sec)
结果显示test_01账号只有集群cluster_01的访问权。
test_01账号下插入测试数据,示例如下。
mysql> CREATE TABLE golds_log ( user_id bigint, accounts string, change_type string, golds bigint, log_time int ) DISTRIBUTED BY HASH(`user_id`) BUCKETS 3; Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO golds_log VALUES -> (3645356,'wds7654321(4171752)','swim',1700,152607152), -> (2016869,'dqyx123456789(2376699)','noise',1140,152607152), -> (3630468,'dke3776611(4156064)','white',1200,152602752); Query OK, 3 rows affected (0.20 sec) {'label':'insert_9707a9905aab4805_b8b9d28aadcd96e6', 'status':'VISIBLE', 'txnId':'15313504260617216'}
通过test_02账号连接实例,查看当前可用集群,示例如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_02 | TRUE | | +------------+------------+-------+ 1 row in set (0.04 sec)
结果显示test_02账号只有集群cluster_02的访问权限。
test_02账号下查询测试数据,示例如下。
mysql> SELECT * FROM golds_log; +---------+------------------------+------------------+-------+-----------+ | user_id | accounts | change_type | golds | log_time | +---------+------------------------+------------------+-------+-----------+ | 3630468 | dke3776611(4156064) | noise | 1200 | 152602752 | | 2016869 | dqyx123456789(2376699) | whitewo | 1140 | 152607152 | | 3645356 | wds7654321(4171752) | swim | 1700 | 152607152 | +---------+------------------------+------------------+-------+-----------+ 3 rows in set (0.13 sec)
结果显示不同集群在同一实例下的数据是共享的。
通过admin账号连接实例,创建一个新账号test_03,不分配使用的集群权限,示例如下。
mysql> CREATE USER test_03 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.04 sec) mysql> GRANT ALL ON *.* TO test_03; Query OK, 0 rows affected (0.04 sec)
通过test_03账号连接实例,由于没有授予集群使用权限,查询测试数据会有错误提示,示例如下。
mysql> SELECT * FROM golds_log; ERROR 1105 (HY000): errCode = 2, detailMessage = 90363 have no queryable replicas. err: 90364's backend -1 does not exist or not alive, or you may not have permission to access the current cluster, clusterName=null