# DWS逻辑集群/计算组概述
逻辑集群是通过节点组（Node Group）机制实现资源和数据隔离的功能。通过将物理集群的所有物理节点划分成多个逻辑集群，每个逻辑集群本质上是一个节点组，每个物理节点只能属于一个逻辑集群，用户数据表只能分布在一个逻辑集群范围内。这样不同逻辑集群的用户数据是隔离的，逻辑集群所属节点的资源主要提供给逻辑集群内数据表的操作，同时供其他逻辑集群的作业交互查询使用。企业将不同的业务部署在不同的逻辑集群上，既可以实现业务统一管理，也能保证业务之间数据隔离和资源隔离。
逻辑集群从物理节点层次将大集群进行划分，和数据库形成交叉关系。一个数据库中的表可以按逻辑集群来分配到不同的物理节点，而一个逻辑集群也可以包含多个数据库的表。在划分逻辑集群后，整个数据库中对象间的层次关系如[图1]所示。
其中"Node Group"是数据库内核层面的术语；在产品化封装后，其命名根据架构不同而有所区分：在存算一体架构中，被称为"逻辑集群"；而在存算分离架构中，则称为"计算组"。
- **节点组（Node Group）**
  数据库内核的一个基本概念，每个集群节点就是一个Node，若干个Node组成一个Node Group，一个物理集群包含多个Node Group，每个Node Group封装成用户感知的形态，就是一个逻辑集群（Logical Cluster）。
  
- **逻辑集群（Logical Cluster）**
  存算一体形态下，每个物理集群下划分成多个节点组（Node Group），每个节点组对应一个逻辑集群。用户创建存算一体集群时，界面为**"逻辑集群"**页签。
  
- **计算组（Virtual Warehouse）**
  即存算分离形态下的逻辑集群。用户创建存算分离集群时，界面为**"计算组"**页签。
  
图1逻辑集群、数据库、表层次关系   
![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617625521.png "点击放大")
#### 逻辑集群架构
[图2]展示了物理集群划分成多个逻辑集群的架构示意图。物理集群的所有节点被分成多个逻辑集群节点组。业务用户1和业务用户2的作业分别在不同的逻辑集群上执行。用户1和用户2可以在本逻辑集群内部定义资源池来控制不同作业的资源（CPU，内存，I/O）。如果业务用户1的某些作业需要访问业务用户2的数据，在获得授权后可以跨逻辑集群访问。逻辑集群可以配置跨逻辑集群访问的资源来保证逻辑集群内部作业的资源充足。
图2逻辑集群架构   
![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587225740.png "点击放大")
将物理集群的所有节点分成多个逻辑集群，每个子集群都可以根据业务情况定义资源池。由于用户表不会跨逻辑集群分布，如果业务不跨逻辑集群访问，业务之间就**不存在资源竞争**。同一逻辑集群内部的作业可以通过资源池来分配资源。如果某些业务需要访问其他逻辑集群的数据，可以跨逻辑集群访问，被访问的逻辑集群可以对来自其他逻辑集群的访问请求进行资源控制，以减少对逻辑集群内部作业的资源竞争。
用户在创建完成物理集群后就要确定是否划分逻辑集群，如果在划分逻辑集群前已经创建了用户表，由于这些用户表已经分布在所有物理节点，就无法再划分逻辑集群了，具体限制条件请参见[约束和限制]。
对于已经在使用的集群（例如**8.1.0.100之前集群版本** 构建的数据库集群），如果希望转换为逻辑集群管理，可以在集群升级到支持逻辑集群（**8.1.0.100及以上集群版本**）后，将整个集群全部节点转换为一个逻辑集群。然后通过添加新节点对物理集群扩容，并在新增节点上创建新的逻辑集群。
 #### 约束和限制
**版本与兼容性限制：**
- 逻辑集群仅支持8.1.0.100及以上集群版本。
- 物理集群转换为逻辑集群模式之后不支持回退到物理集群，该操作不可逆。
- 逻辑集群不支持单独备份和恢复。
- 逻辑集群不支持单独升级。
 
**数据与操作限制：**
- 逻辑集群不是独立子集群，可以实现数据隔离、资源隔离和权限隔离，但**不支持独立运维**。
- 逻辑集群的创建、扩容和缩容必须以环为单位，最少**3个物理节点**，DN的主备从必须在同一环所包含的物理节点内。

- 逻辑集群切换期间，如果原物理集群有数据，则会进行**锁集群操作**。用户可执行增删改查等简单DML语句，但执行操作数据库对象等复杂DDL语句会阻塞业务出现报错，请谨慎操作。
- 逻辑集群的OM操作（创建、删除、编辑、扩容、缩容、重启）**不支持并行执行**。
**功能使用限制**：
- 逻辑集群模式下，只能创建逻辑集群，不支持创建普通的NodeGroup，逻辑集群内部也不支持创建子NodeGroup。
- 由于公共数据库对象（除系统表之外的表、外表和视图）会分布在物理集群所有节点，当某个逻辑集群节点重启后，其他逻辑集群对这些公共数据库对象进行的DDL操作将会中断。
- 在逻辑集群模式下，由于每个DN只包含所属逻辑集群下的表，而自定义函数要在所有DN上创建，因此创建的函数体中不能使用**%type**引用表字段类型。
- 在逻辑集群模式下，WITH RECURSIVE语句**不支持下推**。
- 在逻辑集群模式下，普通表和分区表如果不在同一个逻辑集群或节点组，将会采用将数据插入对方表内方式来实现交换分区，这样交换分区的时间与表数据量有关，对于数据量非常大的表和分区表，交换分区将会**非常耗时**。
- 在逻辑集群模式下，创建函数时如果函数参数或返回值有表类型，这些表类型必须属于**同一个逻辑集群**。
- 在逻辑集群模式下，通过CREATE TABLE ... LIKE方式创建外表时，源表和要创建的外表必须是在**同一个逻辑集群中**。
- 在逻辑集群模式下，不支持创建Schema同时创建表语句，即CREATE SCHEMA ... CREATE TABLE语句，用户需要首先创建Schema，再创建表到该Schema下。
- 逻辑集群**不支持一主多备** ，逻辑集群只在**主备从**的部署形态下生效。
- 某个逻辑集群用户不能访问另一个逻辑集群用户创建的**全局临时表**。
- 在逻辑集群模式下，当执行的查询语句中存在子查询与父查询执行集群不一致，且子查询中存在与父查询关联的过滤条件时，由于相关条件无法跨逻辑集群下推，导致计划产生额外的算子开销。该场景下性能可能会劣于单逻辑集群场景。
- 在逻辑集群模式下，跨逻辑集群写操作需保证DDL与DML在CN上锁互斥，否则会存在并发写数据问题。针对非分区表，在CN上默认存在主表锁互斥，无需额外配置；针对分区表，如需支持跨逻辑集群写操作，需确保在behavior_compat_options参数中设置disable_select_truncate_parallel选项。
 
#### 权限说明
- 系统管理员可以关联到特定逻辑集群，并在多个逻辑集群中创建表。建表规则如下表所示。
   表1建表规则 
  | 条件                                                            | 建表位置                             | 说明                                                |
  |:---|:---|:---|
  | 用户指定了TO GROUP子句                                             | 指定的逻辑集群                         | 显式指定优先级最高                                        |
  | 用户未指定TO GROUP，且已关联逻辑集群                                       | 用户关联的逻辑集群                         | 关联关系优先，支持变更用户关联的逻辑集群                              |
  | 用户未指定TO GROUP，未关联逻辑集群，且设置了default_storage_nodegroup            | default_storage_nodegroup指定的逻辑集群 | 参数指定次优先                                          |
  | 用户未指定TO GROUP，未关联逻辑集群，且default_storage_nodegroup为installation | 第一个逻辑集群（OID最小的逻辑集群）                | 没有设置default_storage_nodegroup时，默认值为installation |
     
  

- 逻辑集群创建权限（CREATE ON NODE GROUP）允许授予任何用户/角色，创建权限后可在对应的逻辑集群上进行创建表等相关操作。
  - 如果创建的表指定的Schema是某个用户私有Schema（即该Schema和用户同名且Schema的Owner是该用户），则新创建的表会将Owner自动变更为该用户，不需要进行关联逻辑集群操作。
  
  - 用户/角色在对应的逻辑集群创建表操作需遵循[表1]。
  
  - 存算分离支持创建**只读计算组**，如果用户关联到只读计算组，只能在只读计算组上创建会话级临时表（本地临时表和volatile临时表，不包括全局临时表）；该用户如果创建其他常规表和外表，要遵循没有关联计算组的用户建表规则。
  
  - 系统管理员可以通过ALTER ROLE命令为每个用户设置默认的default_storage_nodegroup，具体语法参考[ALTER ROLE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0134.html)。
   
- 允许修改表的Owner为任何用户，但对表进行操作时，需要检查对应的Schema和NodeGroup权限。

- 允许将系统管理员权限授予关联了逻辑集群的用户，但同样遵循[表1]。
- 非表对象（Schema/Sequence/Function/Trigger等）的访问不再检查逻辑集群权限。
- 系统中的资源池必须关联到特定逻辑集群。
  - 在一个逻辑集群下可以创建多个资源池，同一个资源池不能属于多个逻辑集群。
  
  - 由于资源池定义了资源使用量，因此关联特定资源池的逻辑集群用户发起的作业将受到该资源池的资源约束。
  
  - 逻辑集群下不需要创建负载组来定义并发作业的数量。因此，逻辑集群模式不再支持负载组。
   
- 逻辑集群删除时只删除表、外表和资源池对象，其他对象不会删除。
  - 如果有对象依赖逻辑集群下的表（部分依赖表的Sequence/Function/Triggers）同样也会删除。
  
  - 逻辑集群删除过程会取消用户关联关系，删除已有的父子租户关系，该集群用户将会绑定默认的installation nodegroup，关联全局默认资源池。
   
- 逻辑集群用户如果有创建数据库权限也可创建数据库。
 
#### 复制表节点组
复制表节点组是逻辑集群模式下一种特殊的节点组，它可以包含一个或多个逻辑集群，但**只能创建复制表** 。典型应用场景是用来创建**公共维度表**。如果多个逻辑集群都需要一些相同的公共维表，可以创建复制表节点组，并将这些公共维表创建在这个节点组中。复制表节点组包含的逻辑集群都可在本DN上直接访问这些维度表，而不需访问其他DN节点上的表。如果复制表节点组包含的逻辑集群中有任何一个发生了扩容或缩容操作，复制表节点组也会随之扩容或缩容。如果包含的逻辑集群被删除了，复制表节点组会随之缩容。但如果复制表节点组只包含一个逻辑集群，这种情况下如果逻辑集群被删除，则复制表节点组也会删除。通常情况下不建议创建只包含了一个逻辑集群的复制表节点组，而是应该将表创建到逻辑集群内。
复制表节点组通过SQL语句CREATE NODE GROUP创建，通过DROP NODE GROUP语句删除，删除前需要将该节点组上的表对象都删掉。
#### 应用场景
**场景一：基于不同资源要求划分逻辑集群**
图3基于不同资源要求划分逻辑集群   
![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587065830.png "点击放大")
如上图所示，不同资源要求的数据就分开存放到不同逻辑集群中，同时不同逻辑集群之间也支持互访，在保证资源隔离的基础上也可以保证功能不受影响。
- **批处理业务：**T1和T2表主要用于大批量数据计算，并生成报表数据（例如银行跑批）。该过程由于需要大批量导入和大数据查询，对节点的内存和IO资源消耗比较高，且耗时比较长，但这类查询对实时性要求不高，因此可以将这些数据划分到一个独立的逻辑集群中。
- **实时查询业务：**T3和T4表包含了计算数据和实时数据，主要用于业务点查和实时查询，这类查询要求实时性高，为避免其他高负载操作影响，可以将这些数据划分到独立的逻辑集群中。
- **高并发OLTP业务：**T5和T6表主要用于大并发OLTP类操作，数据更新非常频繁，对I/O非常敏感，为了避免大数据查询对其影响，可以将这类表划分到独立的逻辑集群中。
**场景二：基于不同业务要求划分逻辑集群** **，扩展多租户能力**
图4逻辑集群多业务数据和多租户管理   
![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587225742.png "点击放大")
大规模数据库集群往往同时包含很多业务的数据，不同业务有不同的数据表，为了对不同业务进行资源隔离，可以通过创建多租户来实现。将不同业务用户分配给不同租户，以便减少业务之间资源竞争。但随着业务规模不断扩大，集群系统中的业务数目越来越多，通过划分多租户来管理越来越难以控制资源竞争。由于每个表都会分布在数据库集群的所有DN节点上，因此每次数据表操作都可能会涉及所有DN节点，这会导致网络压力增大和系统资源消耗，单纯通过扩大集群规模也很难解决。所以可通过划分多个逻辑集群解决业务数量扩大问题，如上图所示。
通过划分独立的逻辑集群，将新增的业务分配到独立的逻辑集群上，这样新增业务对原有业务的影响会很小。而原有逻辑集群中的业务规模如果扩大，也可以通过对原有逻辑集群扩容来解决。
![](https://support.huaweicloud.com/mgtg-dws/public_sys-resources/note_3.0-zh-cn.png)
逻辑集群不适合将多个独立的数据库系统合并在一起管理，独立的数据库系统往往对独立运维要求很高，需要能够单独管理、监控、备份和升级，同时集群之间要求故障隔离，逻辑集群无法做到独立运维和完全的故障隔离。
#### 逻辑集群和资源池区别
表2逻辑集群和资源池区别 
| 对比项     | 多租户资源池        | 逻辑集群                  |
|:---|:---|:---|
| 隔离粒度     | 逻辑隔离（资源配额控制）  | 物理隔离（节点级隔离）         |
| 数据分布 | 所有表分布在全部DN节点   | 每个逻辑集群的表仅分布在其所属DN节点 |
| 资源竞争   | 高负载时仍可能互相影响    | 逻辑集群间无资源竞争（不跨集群访问时） |
| 适用场景   | 业务数量较少，资源竞争可控 | 业务数量多，需要强隔离          |
| 扩容方式  | 扩大集群规模      | 对特定逻辑集群扩容，按需扩展       |
   
