このトピックでは、ワークロード管理のベストプラクティスについて説明します。
前提条件
AnalyticDB for MySQL でワークロード管理ルールを設定する前に、以下の要件が満たされていることを確認してください。
AnalyticDB for MySQL Data Warehouse Edition クラスタが作成されている。
クラスタのマイナーバージョンが 3.1.6.3 以降である。
AnalyticDB for MySQL クラスタのマイナーバージョンの表示方法と更新方法については、「クラスタのマイナーバージョンを更新する」をご参照ください。
実行前: クエリを調整する
クエリが実行される前に、システムはワークロード管理ルールに基づいて各クエリの優先度を決定し、クエリを特定のキューに割り当て、各キューに設定した最大同時実行数に基づいてクエリを実行できます。
優先度付きキュー:
SQL パターンのハッシュ値に基づく調整
AnalyticDB for MySQL は、SQL パターンに基づいてクエリを調整できます。 wlm calc_pattern_hash
文を使用して、SQL パターンのハッシュ値を計算し、その SQL パターンのすべてのクエリを低優先度キューに割り当てるルールを作成できます。 この方法で、キューの最大同時実行数を設定して調整を実行できます。
SQL パターンのすべてのクエリを低優先度キューに割り当てるルールを作成します。
wlm add_rule name=confine_query type=query action=ADD_PROPERTIES predicate='pattern_hash=XXXXXXXXXXXXXX' attrs='{ "add_prop": { "query_priority": "low" } }'
説明wlm calc_pattern_hash
文の詳細については、「WLM」トピックの「クエリのハッシュ値を取得する」セクションをご参照ください。低優先度キューの最大同時実行数を設定して調整を実行します。 デフォルト値は 20 です。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;
履歴実行に基づく調整
次の条件を満たす SQL パターンのすべてのクエリを低優先度キューに割り当てるルールを作成します。SQL パターンの履歴実行時間の P50 が 2,000 ミリ秒より長い。
wlm add_rule name=confine_query type=query action=ADD_PROPERTIES predicate='PATTERN_EXECUTION_TIME_P50>2000' attrs='{ "add_prop": { "query_priority": "low" } }'
低優先度キューの最大同時実行数を設定して調整を実行します。 デフォルト値は 20 です。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;
実行中: パフォーマンスの問題を解決するためにクエリを終了する
AnalyticDB for MySQL クラスタで輻輳が発生した場合、KILL ALL 文を実行してすべての実行を終了できます。 この操作は書き込み操作も終了するため、データの不整合が発生する可能性があります。 この場合、ワークロード管理ルールを作成して、特定の種類のクエリのみを終了できます。
すべての SELECT クエリを終了する
predicate を query_task_type
=1 に設定して SELECT クエリを終了します。 この場合、システムは進行中の SELECT クエリと後続の SELECT クエリの両方を終了します。 システムの負荷が低いレベルに戻ったら、このルールを手動で削除または無効にする必要があります。 ルールの削除または無効化の方法については、「WLM」をご参照ください。
wlm add_rule
name=kill_select_query
type=query
action=KILL
predicate='query_task_type=1'
特定のリクエスタからのクエリを終了する
AnalyticDB for MySQL クラスタが使用不可になった原因となった特定のユーザーからのクエリが特定された場合は、そのユーザーに関連付けられているすべてのクエリを終了します。
wlm add_rule
name=kill_query_from_user
type=query
action=KILL
predicate='user=testuser1'
特定の IP アドレスからのクエリを終了する
AnalyticDB for MySQL クラスタが使用不可になった原因となったクエリが特定の IP アドレスにまで遡ることができる場合は、その IP アドレスからのすべてのクエリを終了します。
wlm add_rule
name=kill_query_from_ip
type=query
action=KILL
predicate='source_ip=10.10.XX.XX'
100 MB を超えるメモリを消費するクエリを終了する
AnalyticDB for MySQL クラスタの不安定性が大規模クエリの影響にまで遡ることができる場合は、SELECT クエリと書き込みクエリの両方を含む、100 MB を超えるメモリを使用するすべてのクエリを終了するようにルールを設定します。
wlm add_rule
name=kill_Big_query
type=query
action=KILL
predicate='QUERY_PEAK_MEMORY>=100'
100 MB を超えるメモリを消費する SELECT 文を終了する
AnalyticDB for MySQL クラスタの不安定性が大規模クエリの影響にまで遡ることができる場合は、書き込みジョブに影響を与えることなくこれらの大規模クエリを制限するために、100 MB を超えるメモリを使用する SELECT クエリを終了するようにルールを設定します。
wlm add_rule
name=kill_Big_query
type=query
action=KILL
predicate='QUERY_PEAK_MEMORY>100 && query_task_type=1'
特定のデータベースまたはテーブルのクエリを管理する
ワークロード管理ルールを使用して、特定のデータベースまたはテーブルに関連するクエリの調整、または優先度の向上を行うことができます。 このセクションでは、そのようなクエリを調整する方法の例を示します。
ルールを作成します。
wlm add_rule name=confine_query_in_table type=query action=ADD_PROPERTIES predicate='query_table_list in database.table1, database.table2' attrs='{ "add_prop": { "query_priority": "low" } }'
低優先度キューの最大同時実行数を設定して調整を実行します。 デフォルト値は 20 です。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;