暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Apache Doris 资源隔离详解

一臻数据 2023-09-26
259

  导读   本文主要分享 Apache Doris 的多租户和资源隔离方案实践。

全文目录:

  1. 简介

  2. 测试体验

  3. 优化配置

  4. 总结



简介

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

测试体验

1. BE节点设置标签

一个 Doris 集群内的 BE 节点可以设置标签(Tag,一个 BE 只支持设置一个 Tag),标签相同的 BE 节点组成一个资源组(Resource Group);资源组可以看作是数据存储和计算的一个管理单元。

(1)分组前

(2)开始分组

    -- 3个节点划分成2个资源组
    alter system modify backend "be01:9050" set ("tag.location" = "group_a");
    alter system modify backend "be02:9050" set ("tag.location" = "group_b");
    alter system modify backend "be03:9050" set ("tag.location" = "group_c");

    (3)分组后

    2. 根据资源组分布数据

    资源组划分好后,可以将用户数据的不同副本分布在不同资源组内。

    (1)创建测试表

      -- 以SQL99其中一张维表为例,每个资源组放一个副本
      create table tpcds.catalog_returns_duplicate
      (
      cr_item_sk integer not null,
      cr_order_number integer not null,
      cr_returned_date_sk integer ,
      cr_returned_time_sk integer ,
      cr_ship_date_sk integer ,
      cr_refunded_customer_sk integer ,
      cr_refunded_cdemo_sk integer ,
      cr_refunded_hdemo_sk integer ,
      cr_refunded_addr_sk integer ,
      cr_returning_customer_sk integer ,
      cr_returning_cdemo_sk integer ,
      cr_returning_hdemo_sk integer ,
      cr_returning_addr_sk integer ,
      cr_call_center_sk integer ,
      cr_catalog_page_sk integer ,
      cr_ship_mode_sk integer ,
      cr_warehouse_sk integer ,-- cr_reason_sk integer ,
      cr_return_quantity integer ,
      cr_return_amount decimal(7,2) ,
      cr_return_tax decimal(7,2) ,
      cr_return_amt_inc_tax decimal(7,2) ,
      cr_fee decimal(7,2) ,
      cr_return_ship_cost decimal(7,2) ,
      cr_refunded_cash decimal(7,2) ,
      cr_reversed_charge decimal(7,2) ,
      cr_store_credit decimal(7,2) ,
      cr_net_loss decimal(7,2)
      )ENGINE=olap
      DUPLICATE KEY(`cr_item_sk`,`cr_order_number`)
      DISTRIBUTED BY HASH(`cr_item_sk`,`cr_order_number`) BUCKETS 10
      PROPERTIES("replication_allocation"
          = "tag.location.default:1, tag.location.group_b:1, tag.location.group_c:1");

      (2)导入测试数据

        -- 随机测试写入几条数据验证
        insert into tpcds.catalog_returns_duplicate values
        (.....)


        3. 用户资源使用权限控制

        通过设置用户的资源使用权限,来限制某一用户的查询,只能使用指定资源组中的节点来执行。

        (1)创建测试用户

          -- 用户名@用户端连接所在的主机地址(测试不设置密码)
          -- 默认为 '%',即表示该用户可以从任意host连接到 DorisDB
          CREATE USER 't_rg_user01'@'%';
          CREATE USER 't_rg_user02'@'%';
          CREATE USER 't_rg_user03'@'%'; 

          (2)授权用户

            -- GRANT授权(授予所有库和表的权限给用户)
            GRANT SELECT_PRIV ON *.* TO 't_rg_user01'@'%';
            GRANT SELECT_PRIV ON *.* TO 't_rg_user02'@'%';
            GRANT SELECT_PRIV ON *.* TO 't_rg_user03'@'%';

            (3)设置用户资源使用权限

              set property for 't_rg_user01' 'resource_tags.location' = 'group_a';
              set property for 't_rg_user02' 'resource_tags.location' = 'group_b';
              set property for 't_rg_user03' 'resource_tags.location' = 'group_a, group_b, group_c';

              (4)验证权限

                   1. 准备测试查询SQL

                select * from (
                select * from catalog_returns_duplicate crd0402
                ) t1
                JOIN
                (
                select * from catalog_returns_duplicate crd0402
                ) t2 on t1.cr_item_sk = t2.cr_item_sk
                JOIN
                (
                select * from catalog_returns_duplicate crd0402
                ) t3 on t2.cr_item_sk = t3.cr_item_sk
                JOIN
                (
                select distinct cr_item_sk from catalog_returns_duplicate crd0402
                ) t4 on t3.cr_item_sk = t4.cr_item_sk

                     2. 查询测验

                    通过grafana中【be scan rows】图标可以清楚地看到,每个用户使用的资源都基于设置进行了对应的资源隔离

                4. 读写权限验证

                只读不写或只写不读权限验证。

                  -- 用户创建
                  CREATE USER 't_only_read_user'@'%';
                  CREATE USER 't_only_write_user'@'%';


                  -- 对指定的库或表的读取权限
                  GRANT SELECT_PRIV ON *.* TO 't_only_read_user'@'%';


                  -- 对指定的库或表的导入权限
                  GRANT LOAD_PRIV ON *.* TO 't_only_write_user'@'%';


                  优化配置

                  资源组方法是节点级别的资源隔离和限制。
                  而在资源组内,依然可能发生资源抢占问题;可以针对对单查询做资源限制功能

                  1. 内存限制

                    -- 设置会话变量 exec_mem_limit。则之后该会话内(连接内)的所有查询都使用这个内存限制。
                    set exec_mem_limit=1G;


                    -- 设置全局变量 exec_mem_limit。则之后所有新会话(新连接)的所有查询都使用这个内存限制。
                    set global exec_mem_limit=1G;


                    -- 在 SQL 中设置变量 exec_mem_limit。则该变量仅影响这个 SQL。
                    select /*+ SET_VAR(exec_mem_limit=1G) */ idname from tbl where xxx;

                    2. CPU限制

                      -- 设置会话变量 cpu_resource_limit。则之后该会话内(连接内)的所有查询都使用这个CPU限制。
                      set cpu_resource_limit = 2


                      -- 设置用户的属性 cpu_resource_limit,则所有该用户的查询情况都使用这个CPU限制。该属性的优先级高于会话变量 cpu_resource_limit
                      set property for 'user1' 'cpu_resource_limit' = '3';
                      总结

                      ① 数据存在哪个节点,资源就用哪个节点的。

                       可以对用户做到查询资源的物理隔离,写入不做资源隔离

                      可以对用户做到库表颗粒的权限控制参考用户账户管理

                      文章转载自一臻数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论