本文為您介紹StarRocks資源隔離的功能、基本概念和使用方式。
使用限制
該功能適用于EMR-5.7.0及后續版本的集群。
功能介紹
資源隔離功能可以限制查詢任務對計算資源的消耗,目標是讓不同租戶的查詢任務在同一集群執行能兼顧資源隔離并且保證集群資源利用率。
當您發起查詢任務時,分類器會根據查詢任務的信息進行匹配。匹配度最高的分類器才會生效,最終該分類器所屬資源組為這次查詢任務的資源組。
基本概念
資源組(Resource Group)
資源組包括BE(Backend)節點計算資源(CPU和內存)的配額,并且一個資源組可以綁定一個或多個分類器。 資源配額的計算方式如下:
cpu_core_limit:該資源組分配到的CPU核數占BE節點CPU核數的比例,取值為正整數。按照比例,向各個資源組分配執行線程和IO線程的CPU時間片。
例如,16核的機器,設置三個資源組rg1、rg2和rg3。三個資源組分別對應的cpu_core_limit為2、6和8,則資源組rg1、rg2和rg3分別能分配到的CPU核數為
BE節點CPU核數×(2/16)
、BE節點CPU 核數×(6/16)
、BE節點CPU核數×(8/16)
。如果資源空閑,rg1和rg2有負載,但是rg3沒有請求,則rg1、rg2分配到的CPU核數分別為BE節點CPU核數×(2/8)
和BE節點CPU 核數×(6/8)
。mem_limit:使用query_pool(BE節點中用于查詢的內存)的上限,取值范圍為0.0~1.0。
query_pool的查看方式請參見內存管理。
分類器(Classifier)
分類器用于匹配查詢任務的信息。 匹配度最高的分類器才會生效,最終該分類器所屬資源組為查詢任務的資源組。一個資源組可以綁定一個或多個分類器。
分類器的條件如下:
user:用戶名。
role:用戶所屬的角色。
query_type:查詢類型,目前僅支持SELECT。
source_ip:發起查詢的IP地址,類型為CIDR。
分類器與查詢任務的匹配方式
分類器與查詢任務匹配時, 分類器的條件需要與查詢任務的信息完全匹配。
如果存在多個分類器的條件與查詢任務完全匹配,則需要計算不同分類器的匹配度。只有匹配度最高的分類器才會生效。匹配度的計算方式如下:
如果用戶名一致,則匹配度加1。
如果用戶所屬Role一致,則匹配度加1。
如果查詢類型一致,則該部分匹配度為
1 + 1/分類器的query_type數量
。如果發起查詢的IP地址一致,則該部分匹配度為
1 + (32-cidr_prefix)/64
。
示例如下:
多個與查詢任務匹配的分類器中,分類器的條件數量越多,則其匹配度越高。
--B的匹配度比A高,因為B的條件數量多。 classifier A (user='Alice') classifier B (user='Alice', source_ip = '192.168.**.**/24')
如果分類器的條件數量相等,則分類器的條件描述越精確,其匹配度越高。
--B的匹配度比A高, 因為192.168.**.**/24相對于192.168.**.**/16限定的source_ip地址范圍更小。 classifier A (user='Alice', source_ip = '192.168.**.**/16') classifier B (user='Alice', source_ip = '192.168.**.**/24') --C的匹配度比D高, 因為('select')比('insert','select', 'ctas')限定的查詢類型數量少。 classifier C (user='Alice', query_type in ('select')) classifier D (user='Alice', query_type in ('insert','select', 'ctas'))
功能使用
開啟資源組
使用資源組時,需通過設置相應會話變量來啟用Pipeline引擎。設置方式如下。
-- 當前會話啟用Pipeline引擎以及資源組功能。
SET enable_pipeline_engine = true;
-- 全局啟用Pipeline引擎以及資源組功能。
SET GLOBAL enable_pipeline_engine = true;
自v3.1.0起,默認啟用資源組功能。會話變量enable_resource_group
棄用。
創建資源組和分類器
語法
CREATE RESOURCE GROUP group_name TO ( user='string', role='string', query_type in ('select'), source_ip='cidr' ) --創建分類器,多個分類器間用英文逗號(,)分隔。 WITH ( "cpu_core_limit" = "INT", "mem_limit" = "m%", "concurrency_limit" = "INT", "type" = "normal" --資源組的類型,固定取值為normal。 );
示例
CREATE RESOURCE GROUP rg1 TO (user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.**.**/24'), (user='rg1_user2', query_type in ('select'), source_ip='192.168.**.**/24'), (user='rg1_user3', source_ip='192.168.**.**/24'), (user='rg1_user4'), (db='db1') WITH ( 'cpu_core_limit' = '10', 'mem_limit' = '20%', 'type' = 'normal', 'big_query_cpu_second_limit' = '100', 'big_query_scan_rows_limit' = '100000', 'big_query_mem_limit' = '1073741824' );
指定資源組(可選)
除通過分類器自動指定資源組外,您也可以通過會話變量直接指定資源組。
SET resource_group = 'group_name';
查看資源組和分類器
語法如下:
查詢所有的資源組和分類器。
SHOW RESOURCE GROUPS ALL;
查詢和當前用戶匹配的資源組和分類器。
SHOW RESOURCE GROUPS;
查詢指定的資源組和分類器。
SHOW RESOURCE GROUP <yourResourceName>;
管理資源組配額和分類器
修改資源組的配額
語法如下。
ALTER RESOURCE GROUP <yourResourceName> WITH ( 'cpu_core_limit' = '10', 'mem_limit' = '20%' );
增加或刪除分類器
語法如下:
添加新的分類器。
ALTER RESOURCE GROUP <yourResourceName> ADD CLASSIFIER[,...];
刪除指定的分類器。
ALTER RESOURCE GROUP <yourResourceName> DROP (CLASSIFER_ID_1, CLASSIFIER_ID_2, ...);
刪除所有的分類器。
ALTER RESOURCE GROUP <yourResourceName> DROP ALL;
刪除資源組
語法如下。
DROP RESOURCE GROUP <yourResourceName>;