このトピックでは、ワークロード管理のベストプラクティスについて説明します。
前提条件
お使いの AnalyticDB for MySQL クラスターのカーネルバージョンは 3.1.6.3 以降である必要があります。
AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
実行前: クエリのスロットリング
クエリが実行される前に、システムはワークロード管理ルールに基づいて各クエリの優先度を決定し、クエリを特定のキューに割り当て、各キューに設定した最大同時実行数に基づいてクエリを実行できます。
優先度付きキュー:
SQL パターンのハッシュ値に基づくスロットリング
AnalyticDB for MySQL は、SQL パターンに基づいてクエリをスロットリングできます。wlm calc_pattern_hash コマンドを使用して 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コマンドの詳細については、「pattern_hash 値を計算する」をご参照ください。低優先度キューの同時実行数を変更してスロットリングを実行します。デフォルトの同時実行数は 20 です。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE=20;
過去の実行情報に基づく large クエリのスロットリング
パターンの過去の 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 クエリの終了
SELECT クエリを終了するには、QUERY_TASK_TYPE を 1 に設定します。この設定を適用すると、すべてのアクティブな 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 を超えるメモリを使用するすべてのクエリの終了
large クエリが AnalyticDB for MySQL クラスターの不安定性を引き起こしている場合、100 MB を超えるメモリを使用するすべてのクエリを終了するルールを設定できます。これには SELECT クエリと書き込み操作が含まれます。
wlm add_rule
name=kill_Big_query
type=query
action=KILL
predicate='QUERY_PEAK_MEMORY>=100'100 MB を超えるメモリを使用する SELECT クエリの終了
large クエリが AnalyticDB for MySQL クラスターの不安定性を引き起こしている場合、100 MB を超えるメモリを使用する SELECT クエリを終了するルールを設定できます。このアプローチは、書き込みジョブに影響を与えることなく large クエリを制限します。
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;