多计算集群

云数据库 SelectDB 版实例下可以包含多个计算集群,可分别用于支持不同的工作负载(例如读写隔离、在离线隔离等),以满足多业务间负载隔离的需求。本文将介绍云数据库 SelectDB 版实例中,如何使用多计算集群进行计算资源隔离。

基础原理

云数据库 SelectDB 版采用计算与存储分离的云原生架构,计算和存储分离之后,使得同一份数据可以被上层计算资源所共享。云数据库 SelectDB 版基于此架构提供了多计算集群特性。同一个实例(Instance)下可以包含多个计算集群,并共享底层的数据存储。

计算集群类似分布式系统中的计算组、计算队列,协调一个或多个负责计算的单元共同完成整体的计算任务。由于计算资源是物理隔离的,可分别用于支持不同的工作负载(例如读写隔离、在离线隔离等),从而满足多业务间负载隔离的需求,避免了业务间互相干扰。

image

使用示例

一个基础的多计算集群访问场景如下:实例有两个账号test_01和test_02。test_01用于业务A的计算请求,为其分配了集群cluster_01。test_02用于业务B的计算请求,为其分配了集群cluster_02。两个账号都可以操作实例中的全部数据。

  1. 通过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)
  2. admin账号下查看当前可用集群,示例如下。

    mysql> SHOW clusters;
    +------------+------------+-------+
    | cluster    | is_current | users |
    +------------+------------+-------+
    | cluster_01 | FALSE      |       |
    | cluster_02 | TRUE       |       |
    +------------+------------+-------+
    2 rows in set (0.04 sec)

    结果显示admin账号拥有两个集群的访问权限,当前默认访问的集群是cluster_02。

  3. 通过test_01账号连接实例,查看当前可用集群,示例如下。

    mysql> SHOW clusters;
    +------------+------------+-------+
    | cluster    | is_current | users |
    +------------+------------+-------+
    | cluster_01 | TRUE       |       |
    +------------+------------+-------+
    1 row in set (0.03 sec)

    结果显示test_01账号只有集群cluster_01的访问权。

  4. 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'}
  5. 通过test_02账号连接实例,查看当前可用集群,示例如下。

    mysql> SHOW clusters;
    +------------+------------+-------+
    | cluster    | is_current | users |
    +------------+------------+-------+
    | cluster_02 | TRUE       |       |
    +------------+------------+-------+
    1 row in set (0.04 sec)

    结果显示test_02账号只有集群cluster_02的访问权限。

  6. 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)

    结果显示不同集群在同一实例下的数据是共享的。

  7. 通过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)
  8. 通过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