
# 配置StarRocks租户
StarRocks的多租户管理，目的是为了多个用户在同一StarRocks集群内进行数据操作时，减少相互之间的干扰，能够将集群资源更合理的分配给各用户。且集成了租户生命周期管理、租户资源配置和租户资源使用统计等功能，为企业提供了成熟的多租户管理模型，实现集中式的租户和业务管理，减少对集群资源的消耗。
- 资源组：通过将 BE 节点划分为若干个资源组 (resource group)，系统在执行相应资源组的查询任务时，会按照为该资源组划分的资源配额（CPU 及内存）分配查询资源。
- 分类器：您可以为每个资源组关联一个或多个分类器。系统将会根据所有分类器中设置的条件，为每个查询任务选择一个匹配度最高的分类器，并根据生效的分类器所属的资源组为该查询任务分配资源。
#### 使用限制
- 新建用户默认绑定默认租户normal。
- 一个用户只能绑定一个租户。
- 一个租户可以被多个用户绑定。
- 最多只能创建一个SHORT_QUERY资源组。
- 租户NORMAL和SHOUT_QUERY，仅支持StarRocks 3.2.8版本。
- 租户名称不可修改。
- 租户管理目前只支持StarRocks存算一体集群。
- 资源组的user字段只能包含数字、字母和下划线，请使用纯用户名，不支持username@host格式的用户名。
 
#### 前提条件
- 已创建StarRocks集群，集群运行正常。
- 已安装MySQL客户端。
 
#### 新建StarRocks租户
1. 登录[表格存储服务控制台](https://console.huaweicloud.com/cloudtable)。
2. 选择目标集群，单击"集群名称 \> 租户管理"进入租户管理页面。
3. 单击页面右上角"新建租户"，弹出新建租户页面，参照[表1]为租户配置属性。
   
    表1新建租户参数描述 
   | 参数    | 取值范围    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   |:---|:---|:---|
   | 租户名   | -       | 指定当前的租户名称。以字母开头，长度为4-64位，只能输入大小写字母、数字和下划线。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | CPU限额 | \[1,4\] | 该资源组在当前BE节点可使用的CPU核数软上限，实际使用的CPU核数会根据节点资源空闲程度按比例弹性伸缩。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 内存限额  | 1\~99   | 该资源组在当前BE节点可使用于查询的内存（query_pool）占总内存的百分比（%）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 并发数   | -       | 资源组中并发查询数的上限，用以防止并发查询提交过多而导致的过载。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 租户类型  | -       | - 租户类型有NORMAL和SHOUT_QUERY，仅支持StarRocks 3.2.8版本。  - 默认租户，仅支持StarRocks 3.3.18版本。 - default_wg：如果普通查询受资源组管理，但是没有匹配到分类器，系统将默认为其分配default_wg。  - default_mv_wg：如果创建异步物化视图时没有通过resource_group属性指定资源组，该物化视图刷新时，系统将默认为其分配default_mv_wg。                                                                                                                                                                                                                                              |
   | 分类器   | -       | 可以为每个资源组关联一个或多个分类器。系统将会根据所有分类器中设置的条件，为每个查询任务选择一个匹配度最高的分类器，并根据生效的分类器所属的资源组为该查询任务分配资源。 - 角色：分类器中的用户所绑定的角色。请参考[步骤一：创建StarRocks角色](https://support.huaweicloud.com/usermanual-cloudtable/cloudtable_01_0599.html#cloudtable_01_0599__section171690911155)。  - 用户：分类器中的用户。请参考[步骤二：创建StarRocks用户](https://support.huaweicloud.com/usermanual-cloudtable/cloudtable_01_0599.html#cloudtable_01_0599__section18169159161518)。  - 数据库：查询所访问的数据库。  - 查询类型：查询类型包括SELECT、INSERT。   |
      
   
   
4. 参数配置后单击"保存"，确认新增分类器信息后，单击"确定"租户创建完成。 
   如果添加多条，单击"保存并继续添加"，分类器添加完成后单击"保存"，确认新增分类器信息后，单击"确定"租户创建完成。
   
   
 
#### 访问租户资源匹配规则
- 匹配度计算方式：
  - 如果user一致，则该分类器匹配度增加1。
  
  - 如果role一致，则该分类器匹配度增加1。
  
  - 如果query_type一致，则该分类器匹配度增加1 + 1/分类器的query_type数量。
  
  - 如果查询的db匹配，则匹配度加10。
   
- 示例1：多个与查询任务匹配的分类器中，分类器的条件数量越多，匹配度越高。
  分类器B的条件数量比分类器A多，所以B的匹配度比A的高。
  ```
  Classifiers A (user='admin')
  Classifiers A (user=admin',role='test')
  ```
  
- 示例2：如果分类器的条件数量相等，则分类器的条件描述越精确，其匹配度越高。 分类器C限定的查询类型为"select"，D限定的查询类型为"select"、"insert"，C限定的查询类型数量更少，所以C的匹配度比D高。
  ```
  classifier C (user='admin', query_type in ('select'))
  classifier D (user='admin', query_type in ('insert','select'))
  ```
  
- 示例3：如果多个分类器的匹配度相同，那么会随机选择其中一个分类器。 如果一个查询同时查询了db1和db2，并且命中的分类器中E和F的匹配度最高，那么会从E和F中随机选择一个。
  ```
  classifier E (db='db1')
  classifier F (db='db2')
  ```
  
 
#### StarRocks租户常用命令
- 创建租户和分类器。
  ```
  CREATE RESOURCE GROUP group_name 
  TO (
      user='string', 
      role='string', 
      query_type in ('select'), 
      db='db1'
  ) -- 创建分类器，多个分类器间用英文逗号（,）分隔。
  WITH (
      "cpu_core_limit" = "INT",
      "mem_limit" = "m%",
      "concurrency_limit" = "INT",
      "type" = "str" -- 资源组的类型，取值为 normal 或 short_query。
  );
  ```
  
- user：分类器中用户名。
- role：分类器中用户绑定的角色。
- query_type：查询类型包括select、insert。
- db：查询所访问的数据库。
- 示例：
  ```
  CREATE RESOURCE GROUP group_name1 
  TO (
      user='admin', 
      role='test_role', 
      query_type in ('select'), 
      db='sys'
  ) 
  WITH (
      "cpu_core_limit" = "2",
      "mem_limit" = "20%",
      "big_query_cpu_second_limit" = "100",
      "big_query_scan_rows_limit" = "1000",
      "type" = "normal" -- 资源组的类型，取值为 normal 或 short_query。
  );
  ```
  - cpu_core_limit：使用的CPU核心数。
  
  - mem_limit：最多使用系统总内存的20%。
  
  - big_query_cpu_second_limit：大查询最多使用100CPU秒。
  
  - big_query_scan_rows_limit：大查询最多扫描1000行数据。
   
- 指定资源组。 除通过分类器自动指定资源组外，也可以通过会话变量直接指定资源组。
  ```
  SET resource_group = 'group_name';
  ```
  
- 查看资源组和分类器。
  - 查询所有资源组和分类器。
    ```
    SHOW RESOURCE GROUPS ALL;
    ```
    
  
  - 查询和当前用户匹配的资源组和分类器。
    ```
    SHOW RESOURCE GROUPS;
    ```
    
  
  - 查询指定的资源组和分类器。
    ```
    SHOW RESOURCE GROUP group_name;
    ```
    
   
- 管理资源组配额和分类器。
  - 为已有的资源修改资源配额。
    ```
    ALTER RESOURCE GROUP group_name1 WITH (
        'cpu_core_limit' = '3',
        'mem_limit' = '30%'
    );
    ```
    
  
  - 删除指定资源组。
    ```
    DROP RESOURCE GROUP group_name1;
    ```
    
  
  - 添加新的分类器。
    ```
    ALTER RESOURCE GROUP group_name1 ADD (user='user1', role='test_role', query_type in ('select'));
    ```
    
  
  - 删除指定的分类器。
    ```
    ALTER RESOURCE GROUP <group_name> DROP (CLASSIFIER_ID_1, CLASSIFIER_ID_2, ...);
    ```
    示例：
    ```
    ALTER RESOURCE GROUP group_name1 DROP (51369);
    ```
    
  
  - 删除所有分类器。
    ```
    ALTER RESOURCE GROUP <group_name> DROP ALL;
    ```
    
   
 
