searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Doris多租户与资源管理的介绍与实践

2023-05-24 02:42:55
188
0

功能介绍

  Doris 的多租户和资源隔离方案,主要目的是为了多用户在同一 Doris 集群内进行数据操作时,减少相互之间的干扰,能够将集群资源更合理的分配给各用户。

  在Doris的架构组成中,有Frontend(FE) 和 Backend(BE)两类节点。FE 不参与用户数据的处理计算等工作,因此是一个资源消耗较低的节点。而 BE 负责所有的数据计算、任务处理,属于资源消耗型的节点。因此,该功能所介绍的资源划分及资源限制方案,都是针对 BE 节点的。FE 节点因为资源消耗相对较低,并且还可以横向扩展,因此通常无需做资源上的隔离和限制,FE 节点由所有用户共享即可。

多租户和资源划分实现如下效果:

  1. 在默认情况下,Doris集群上所创建的多个租户共用所有BE节点资源;

  2. 当多个用户同时执行计算任务,使用的计算资源较多时,会出现资源的抢占;

  3. 资源划分可以通过分别对BE节点和租户打标签的方式,设定某标签租户在执行计算任务时仅使用对应标签的BE节点资源,通过这种方式,将BE节点进行了划分,既实现了资源的合理分配,也实现了不同租户间的资源隔离。

  4. 应用实践中可以给计算任务重的租户分配较多计算节点,任务相对较轻的租户分配较少计算节点,以保证每个租户任务的执行效率。

功能使用

1. 按照资源组分配数据分布

  节点资源划分,是指将一个 Doris 集群内的 BE 节点设置标签(Tag),标签相同的 BE 节点组成一个资源组(Resource Group)。资源组可以看作是数据存储和计算的一个管理单元。下面我们通过一个具体示例,来介绍资源组的使用方式。

  为 BE 节点设置标签:

  假设当前 Doris 集群有 6 个 BE 节点。分别为 host[1-6]。在初始情况下,所有节点都属于一个默认资源组(Default)。

  我们可以使用以下命令将这6个节点划分成3个资源组:group_a、group_b、group_c:

  alter system modify backend "host1:9050" set ("tag.location" = "group_a");
  alter system modify backend "host2:9050" set ("tag.location" = "group_a");
  alter system modify backend "host3:9050" set ("tag.location" = "group_b");
  alter system modify backend "host4:9050" set ("tag.location" = "group_b");
  alter system modify backend "host5:9050" set ("tag.location" = "group_c");
  alter system modify backend "host6:9050" set ("tag.location" = "group_c");

  这里我们将 host[1-2] 组成资源组 group_a,host[3-4] 组成资源组 group_b,host[5-6] 组成资源组 group_c。

2. 按照资源组分配数据分布

  资源组划分好后。我们可以将用户数据的不同副本分布在不同资源组内。假设一张用户表 UserTable。我们希望在3个资源组内各存放一个副本,则可以通过如下建表语句实现:

  create table UserTable
  (k1 int, k2 int)
  distributed by hash(k1) buckets 1
  properties(
    "replication_allocation"="tag.location.group_a:1,tag.location.group_b:1,tag.location.group_c:1"
  )

  这样一来,表 UserTable 中的数据,将会以3副本的形式,分别存储在资源组 group_a、group_b、group_c所在的节点中。group_a、group_b和group_c每个资源组下各存放1个副本。

  下图展示了当前的节点划分和数据分布:

 

3. 使用不同资源组进行数据查询

  在前两步执行完成后,我们就可以通过设置用户的资源使用权限,来限制某一用户的查询,只能使用指定资源组中的节点来执行。

  比如我们可以通过以下语句,限制 user1 只能使用 group_a 资源组中的节点进行数据查询,user2 只能使用 group_b 资源组,而 user3 可以同时使用 3 个资源组:

  set property for 'user1' 'resource_tags.location' = 'group_a';
  set property for 'user2' 'resource_tags.location' = 'group_b';
  set property for 'user3' 'resource_tags.location' = 'group_a, group_b, group_c';

  设置完成后,user1 在发起对 UserTable 表的查询时,只会访问 group_a 资源组内节点上的数据副本,并且查询仅会使用 group_a 资源组内的节点计算资源。而 user3 的查询可以使用任意资源组内的副本和计算资源。

4. 应用场景

  我们可以给不同的业务部门创建不同的用户,并限制每个用户使用不同的资源组,以避免不同业务部分之间使用资源干扰。比如集群内有一张业务表需要共享给所有9个业务部门使用,但是希望能够尽量避免不同部门之间的资源抢占。则我们可以为这张表创建3个副本,分别存储在3个资源组中。接下来,我们为9个业务部门创建9个用户,每3个用户限制使用一个资源组。这样,资源的竞争程度就由9降低到了3。

  另一方面,针对在线和离线任务的隔离。我们可以利用资源组的方式实现。比如我们可以将节点划分为 Online 和 Offline 两个资源组。表数据依然以3副本的方式存储,其中 2 个副本存放在 Online 资源组,1 个副本存放在 Offline 资源组。Online 资源组主要用于高并发低延迟的在线数据服务,而一些大查询或离线ETL操作,则可以使用 Offline 资源组中的节点执行。从而实现在统一集群内同时提供在线和离线服务的能力。

 

功能实践

  通过自研的MPP产品,我们实现了Doris资源管理功能的界面化操作。可以进行节点标签设置,用户标签设置和SQL查询。

1. 节点资源划分

说明:

节点的默认标签是default;

设置group_a资源组有2个节点;

设置group_b资源组上有1个节点。

2. 按照资源组分配数据分布

说明:

新建一张表,数据存3个副本;

group_a资源组有2个节点,每个节点上存放1个副本;

group_b资源组上有1个节点,单个节点上存放1个副本。

3. 设置用户标签

说明:

用户Beijing具有2个资源组,3个节点上数据副本的访问权限;

用户Shanghai具有资源组group_a,2个节点上数据副本的访问权限;

用户Shenzhen具有资源组group_b,1个节点上数据副本的访问权限。

4. 使用不同资源组进行数据查询

开启参数解析:set enable_profile=true;

Beijing用户:对应3个BEhost

Shanghai用户:对应2个BEhost

Shenzhen用户:对应1个BEhost

 

0条评论
0 / 1000
赵****媛
3文章数
0粉丝数
赵****媛
3 文章 | 0 粉丝