多计算集群
云数据库 SelectDB 版实例下可以包含多个计算集群,多个计算集群间可以分别用于支持不同的工作负载(例如读写数据),以满足各个业务的不同性能规模和使用时长需求。本文将介绍云数据库 SelectDB 版实例中多集群之间计算资源和数据的共享与隔离。
实例
云数据库 SelectDB 版实例中对计算请求的处理都基于计算集群执行。对于同一个实例下的集群,它们之间在计算层上是隔离的,而在数据层则是共享的。计算层的隔离,可使得同一实例下的不同集群用来做读写隔离和不同业务场景的隔离等。数据层的共享,即同一实例下通过多个场景共同使用同一份数据,节省存储成本。
集群
云数据库 SelectDB 版集群,支持存算分离架构,多计算集群共享存储数据。云数据库 SelectDB 版集群包括计算资源(vCPU、内存)和缓存资源(Cache),以集群粒度进行算力隔离,满足各个业务的不同性能规模和使用时长需求。云数据库 SelectDB 版集群会将热数据缓存到本地,从而加速响应大量重复的SQL请求,遇到没命中缓存的SQL请求,云数据库 SelectDB 版集群会从对象存储查询获取结果后再响应。
存储
云数据库 SelectDB 版存储,支持存算分离架构,多集群共享存储数据从而减少副本数,并且使用对象存储(OSS),大幅降低存储成本。云数据库 SelectDB 版存储用于存放全量数据,支持通过Stage分段批量导入数据、通过S3协议导入对象文件或者通过JDBC连接集群后执行SQL dump方式导入数据。除此之外,云数据库 SelectDB 版存储还支持响应集群的低频读写请求。
如下图所示,从系统结构的角度看,在云数据库 SelectDB 版中,实例是一个整体,集群则可以理解为是实例内部用来处理计算任务的计算队列。每个实例都有单独的一份对象存储空间用于数据存储,所以在同一个实例内的数据库表是共享的,不用考虑分数据库的概念。而对于不同的实例来说,它们的计算集群不仅互相隔离,使用的对象存储空间也是互相隔离的。
若您期望执行的任务占据固定的资源且彻底隔绝其对于其他作业的影响,或者某类任务不具有明显的随时间变化的高峰期特征,且较少考虑资源的利用程度,则可以考虑通过部署多集群的方式,为每类任务分配固定的计算集群资源,实现计算的硬隔离。
多计算集群隔离
同一个实例的连接入口是统一的。若需要在某个集群上执行计算任务,则需要连接到对应的实例上,再在连接的页面中或代码里指定特定集群执行计算任务。集群存在访问权限的概念。可以通过设置用户对计算集群的访问权限来限制用户使用的计算集群,进而达到进群隔离的效果,集群的权限设置,详情请参见集群访问管理。
使用示例
一个基础的多计算集群访问场景如下。
有两个账户test_01和test_02。test_01用于业务A的计算请求,为其分配了集群cluster_01(4核 32GB内存);test_02用于业务B的计算请求,为其分配了集群cluster_02(8核 64GB内存)。两个用户都可以使用实例中的全部数据。
使用admin账户初始化这些账户(密码设定为12345,生产环境中请勿使用此类弱强度密码),示例如下。
mysql> CREATE USER test_01 IDENTIFIED BY '12345'; Query OK, 0 rows affected (0.06 sec) mysql> CREATE USER test_02 IDENTIFIED BY '12345'; 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账户只被允许访问集群test_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账户只被允许访问集群test_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)
可以看到使用不同集群在同一实例下的数据是共享的。
若此时创建一个新账户test_03,但不分配使用的集群权限,示例如下。
mysql> CREATE USER test_03 IDENTIFIED BY '12345'; 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
- 本页导读 (1)