メインコンテンツまでスキップ

Resource group

リソースグループ

このトピックでは、StarRocksのリソースグループ機能について説明します。

resource group

この機能を使用すると、複数のワークロード(ショートクエリ、アドホッククエリ、ETLジョブなど)を1つのクラスタで同時に実行できるため、複数のクラスタを展開する余分なコストを節約できます。技術的には、実行エンジンはユーザーの指定に基づいて同時にワークロードをスケジュールし、それらの間の干渉を分離します。

リソースグループのロードマップ:

  • StarRocks v2.2以降、StarRocksはクエリのリソース消費を制限し、同じクラスタ内のテナント間でリソースの分離と効率的な使用を実現します。
  • StarRocks v2.3では、大規模なクエリのリソース消費をさらに制限し、オーバーサイズのクエリリクエストによるクラスタリソースの枯渇を防いでシステムの安定性を保証します。
  • StarRocks v2.5では、データローディング(INSERT)の計算リソース消費を制限します。

内部テーブル

外部テーブル

大規模クエリ制限

ショートクエリ

データインジェクション

スキーマ変更

INSERT

2.2

×

×

×

×

×

×

2.3

×

×

×

2.4

×

×

×

2.5

×

用語

このセクションでは、リソースグループの機能を使用する前に理解する必要のある用語について説明します。

リソースグループ

各リソースグループは、特定のBEからの計算リソースのセットです。クラスタの各BEを複数のリソースグループに分割することができます。クエリがリソースグループに割り当てられると、StarRocksはリソースグループに対して指定したリソースクォータに基づいてCPUとメモリのリソースを割り当てます。

以下のパラメータを使用して、BE上のリソースグループに対してCPUとメモリのリソースクォータを指定できます。

  • cpu_core_limitこのパラメータは、BE上のリソースグループに割り当てることができるCPUコアのソフトリミットを指定します。有効な値: 0以外の正の整数。実際のビジネスシナリオでは、CPUコアは、BE上のCPUコアの利用可能性に比例してリソースグループに割り当てられます。

    注記

    たとえば、16個のCPUコアを提供するBE上に3つのリソースグループrg1、rg2、rg3を設定した場合、3つのリソースグループのcpu_core_limitの値はそれぞれ268です。

    BEのCPUコアがすべて占有されている場合、3つのリソースグループに割り当てることができるCPUコアの数は、次の計算に基づいて、それぞれ2、6、8になります。

    • rg1のCPUコア数 = BEのCPUコアの合計数 × (2/16) = 2
    • rg2のCPUコア数 = BEのCPUコアの合計数 × (6/16) = 6
    • rg3のCPUコア数 = BEのCPUコアの合計数 × (8/16) = 8

    BEのCPUコアがすべて占有されていない場合、たとえばrg1とrg2がロードされており、rg3はロードされていない場合、rg1およびrg2に割り当てることができるCPUコアの数は、次の計算に基づいてそれぞれ4、12になります。

    • rg1のCPUコア数 = BEのCPUコアの合計数 × (2/8) = 4
    • rg2のCPUコア数 = BEのCPUコアの合計数 × (6/8) = 12
  • mem_limitこのパラメータは、BEが提供する総メモリのうち、クエリに使用できるメモリの割合を指定します。有効な値: (0, 1)。

    注記

    クエリに使用できるメモリの量は、query_poolパラメータで示されます。パラメータの詳細については、メモリ管理を参照してください。

  • concurrency_limitこのパラメータは、リソースグループ内の同時クエリの上限を指定します。クエリの数が多すぎてシステムが過負荷になるのを防ぐために使用されます。このパラメータは、0より大きい場合にのみ効果を発揮します。デフォルト値: 0。

上記のリソース消費制限を基に、以下のパラメータで大規模なクエリのリソース消費をさらに制限できます:

  • big_query_cpu_second_limit:このパラメータは、大規模なクエリのCPU占有時間の上限を指定します。複数のクエリを同時に実行した場合、時間が加算されます。単位は秒です。このパラメータは、0より大きい場合にのみ効果を発揮します。デフォルト値: 0。
  • big_query_scan_rows_limit:このパラメータは、大規模なクエリがスキャンできる行数の上限を指定します。このパラメータは、0より大きい場合にのみ効果を発揮します。デフォルト値: 0。
  • big_query_mem_limit:このパラメータは、大規模なクエリのメモリ使用量の上限を指定します。単位はバイトです。このパラメータは、0より大きい場合にのみ効果を発揮します。デフォルト値: 0。

注記

リソースグループで実行中のクエリが上記の大規模なクエリ制限を超える場合、クエリはエラーで終了します。また、FEノードのfe.audit.logErrorCode列にエラーメッセージが表示されます。

リソースグループのtypeshort_queryまたはnormalに設定できます。

  • デフォルト値はnormalです。パラメータtypenormalを指定する必要はありません。
  • クエリがshort_queryリソースグループにヒットする場合、BEノードはshort_query.cpu_core_limitで指定されたCPUリソースを予約します。normalリソースグループをヒットするクエリのCPUリソースは、BEのコア数 - short_query.cpu_core_limitに制限されます。
  • short_queryリソースグループにクエリがヒットしない場合、normalリソースグループのリソースに制限は課されません。

注意

  • StarRocksクラスタには、最大で1つのshort_queryリソースグループを作成できます。
  • StarRocksはshort_queryリソースグループのCPUリソースに対するハードな上限を設定していません。

クラシファイア

各クラシファイアは、クエリのプロパティに一致する1つ以上の条件を保持します。StarRocksは、クエリと一致する最良のクラシファイアをマッチング条件に基づいて特定し、クエリの実行にリソースを割り当てます。

クラシファイアは以下の条件をサポートしています:

  • user: ユーザー名
  • role: ユーザーの役割
  • query_type: クエリのタイプ。SELECTINSERT(v2.5以降)がサポートされます。query_typeinsertのリソースグループにINSERTタスクがヒットした場合、BEノードはタスクに指定されたCPUリソースを予約します。
  • source_ip: クエリが開始されたCIDRブロック
  • db: クエリがアクセスするデータベース。カンマ(,)で区切られた文字列で指定できます。

クラシファイアは、クエリに関する情報と1つまたはすべての条件がクラシファイアの条件と一致する場合にのみクエリに一致します。複数のクラシファイアがクエリに一致する場合、StarRocksはクエリと各クラシファイアの一致度を計算し、最も一致度の高いクラシファイアを特定します。

注記

クエリが属するリソースグループは、FEノードのfe.audit.logResourceGroup列で確認できます。

クエリがどのクラシファイアにもヒットしない場合、デフォルトのリソースグループdefault_wgが使用されます。default_wgのリソース制限は次のとおりです:

  • cpu_core_limit: 1(<= v2.3.7)またはBE内のCPUコア数(> v2.3.7)
  • mem_limit: 100%
  • concurrency_limit: 0
  • big_query_cpu_second_limit: 0
  • big_query_scan_rows_limit: 0
  • big_query_mem_limit: 0

StarRocksは、クエリとクラシファイアの一致度を次のルールを使用して計算します:

  • クラシファイアのuserの値がクエリと同じ場合、クラシファイアの一致度が1増加します。
  • クラシファイアのroleの値がクエリと同じ場合、クラシファイアの一致度が1増加します。
  • クラシファイアのquery_typeの値がクエリと同じ場合、クラシファイアの一致度が1 + クラシファイアのquery_typeフィールド数の逆数で得られる数増加します。
  • クラシファイアのsource_ipの値がクエリと同じ場合、クラシファイアの一致度が1 + (32 - cidr_prefix) / 64で得られる数増加します。
  • クラシファイアのdbの値がクエリと同じ場合、クラシファイアの一致度が10増加します。

複数のクラシファイアがクエリに一致する場合、条件の数が多いクラシファイアの方が一致度が高くなります。

-- クラシファイアBはクラシファイアAよりも条件が多いため、クラシファイアBの一致度がクラシファイアAよりも高くなります。

クラシファイアA (user='Alice')


クラシファイアB (user='Alice', source_ip = '192.168.1.0/24')

一致度の数が同じでも、条件がより正確に記述されたクラシファイアの方が一致度が高くなります。

-- クラシファイアBで指定されているCIDRブロックの範囲がクラシファイアAよりも小さいため、クラシファイアBの一致度がクラシファイアAよりも高くなります。
クラシファイアA (user='Alice', source_ip = '192.168.1.0/16')
クラシファイアB (user='Alice', source_ip = '192.168.1.0/24')

-- クラシファイアCはクラシファイアDよりも指定されているクエリタイプが少ないため、クラシファイアCの一致度がクラシファイアDよりも高くなります。
クラシファイアC (user='Alice', query_type in ('select'))
クラシファイアD (user='Alice', query_type in ('insert','select'))

コンピューティングリソースの分離

リソースグループとクラシファイアを設定することで、クエリ間のコンピューティングリソースを分離することができます。

リソースグループの有効化

リソースグループを使用するには、まずStarRocksクラスタでパイプラインエンジンを有効にする必要があります。

-- 現在のセッションでパイプラインエンジンを有効にします。
SET enable_pipeline_engine = true;
-- グローバルでパイプラインエンジンを有効にします。
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" = "str" --リソースグループのタイプ。値をnormalに設定します。
);

例:

CREATE RESOURCE GROUP rg1
TO
(user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.x.x/24'),
(user='rg1_user2', query_type in ('select'), source_ip='192.168.x.x/24'),
(user='rg1_user3', source_ip='192.168.x.x/24'),
(user='rg1_user4'),
(db='db1')
WITH (
'cpu_core_limit' = '10',
'mem_limit' = '20%',
'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 group_name;

例:

mysql> SHOW RESOURCE GROUPS ALL;
+------+--------+--------------+----------+------------------+--------+------------------------------------------------------------------------------------------------------------------------+
| Name | Id | CPUCoreLimit | MemLimit | ConcurrencyLimit | Type | Classifiers |
+------+--------+--------------+----------+------------------+--------+------------------------------------------------------------------------------------------------------------------------+
| rg1 | 300039 | 10 | 20.0% | 11 | NORMAL | (id=300040, weight=4.409375, user=rg1_user1, role=rg1_role1, query_type in (SELECT), source_ip=192.168.2.1/24) |
| rg1 | 300039 | 10 | 20.0% | 11 | NORMAL | (id=300041, weight=3.459375, user=rg1_user2, query_type in (SELECT), source_ip=192.168.3.1/24) |
| rg1 | 300039 | 10 | 20.0% | 11 | NORMAL | (id=300042, weight=2.359375, user=rg1_user3, source_ip=192.168.4.1/24) |
| rg1 | 300039 | 10 | 20.0% | 11 | NORMAL | (id=300043, weight=1.0, user=rg1_user4) |
+------+--------+--------------+----------+------------------+--------+------------------------------------------------------------------------------------------------------------------------+

注記

前の例では、weightは一致度を示しています。

リソースグループとクラシファイアの管理

各リソースグループのリソースクォータを変更できます。また、リソースグループからクラシファイアを追加または削除することもできます。

次のステートメントを実行して、既存のリソースグループのリソースクォータを変更します。

ALTER RESOURCE GROUP group_name WITH (
'cpu_core_limit' = 'INT',
'mem_limit' = 'm%'
);

次のステートメントを実行して、リソースグループを削除します。

DROP RESOURCE GROUP group_name;

次のステートメントを実行して、リソースグループにクラシファイアを追加します。

ALTER RESOURCE GROUP <group_name> ADD (user='string', role='string', query_type in ('select'), source_ip='cidr');

次のステートメントを実行して、リソースグループからクラシファイアを削除します。

ALTER RESOURCE GROUP <group_name> DROP (CLASSIFIER_ID_1, CLASSIFIER_ID_2, ...);

次のステートメントを実行して、リソースグループのすべてのクラシファイアを削除します。

ALTER RESOURCE GROUP <group_name> DROP ALL;

リソースグループの監視

監視およびアラートを設定することで、リソースグループを監視できます。

監視できるリソースグループに関するメトリックスは次のとおりです:

  • FE
    • starrocks_fe_query_resource_group: 各リソースグループ内のクエリ数。
    • starrocks_fe_query_resource_group_latency: 各リソースグループのクエリレイテンシのパーセンタイル。
    • starrocks_fe_query_resource_group_err: 各リソースグループ内のエラーで終了したクエリ数。
  • BE
    • starrocks_be_resource_group_cpu_limit_ratio: リソースグループのCPUクオータの瞬時値の比率。
    • starrocks_be_resource_group_cpu_use_ratio: リソースグループのCPU使用率の瞬時値の比率。
    • starrocks_be_resource_group_mem_limit_bytes: リソースグループのメモリクォータの瞬時値。
    • starrocks_be_resource_group_mem_allocated_bytes: リソースグループのメモリ使用量の瞬時値。

次の手順

リソースグループを設定した後、メモリリソースとクエリを管理できます。詳細については、次のトピックを参照してください: