このトピックでは、PolarDB-XのDDL文の並列度 (DOP) を制御する方法について説明します。
前提条件
物理的に実行されるDDLステートメントのDOPを制御する場合、PolarDB-XインスタンスのカーネルバージョンはV5.4.15-16715927またはそれ以降です。
論理的に実行されたDDLステートメントのDOPを制御する場合、PolarDB-XインスタンスのカーネルバージョンはV5.4.16-16825599またはそれ以降です。
使用状況ノート
このトピックで説明するパラメーターを使用してDDLステートメントのリソース使用量を増やすと、ビジネストラフィックが影響を受ける可能性があります。 DOPを調整する前に、ビジネス要件に基づいてDOP調整が必要であり、クラスターリソース仕様が要件を満たしていることを確認してください。
概要
PolarDB-XのDDLステートメントは、物理的または論理的に実行できます。 上記の2つの実行モードの特性と、さまざまな種類のDDLステートメントの実行モードの詳細については、「Online DDL」をご参照ください。 さまざまなモードで実行されるDDLステートメントの場合、PolarDB-Xには、DDLステートメントによって占有されるリソースとデータ処理のスループットを制御するために使用できるさまざまなパラメーターが用意されています。
物理的に実行されるDDL文の場合、計算ノード (CN) は、物理テーブル上で実行される物理DDL文を転送する。 主なリソースのオーバーヘッドは、データノード (DN) にあります。 PolarDB-Xは、物理DDLステートメントを転送するDOPに関連する制御パラメータを提供します。
論理的に実行されたDDLステートメントの場合、CNは、プロセス全体で、データバックフィル、マルチ書き込み、検証、およびメタデータ管理を含むすべてのロジックを処理します。 データのバックフィルは、ほとんどのリソースと時間を占めます。 PolarDB-Xは、論理実行中のデータバックフィルDOPに関連する制御パラメータを提供します。
物理的に実行されるDDLステートメントのDOPコントロール
物理的に実行されるDDL文の場合、次の表に示すパラメーターを使用して、物理DDL文を転送するDOPを制御できます。
パラメーター | タイプ | レベル | の説明 | デフォルト値 | 推奨される最大設定 |
MERGE_DDL_CONCURRENT | bool | セッションまたはグローバル | 物理DDLステートメントを並列に送信するかどうかを指定します。 | false | このパラメーターは true に設定することを推奨します。 |
MERGE_CONCURRENT | bool | セッションまたはグローバル | データベースシャードと並行して接続を確立するかどうかを指定します。 | false | このパラメーターは true に設定することを推奨します。 |
PREFETCH_SHARDS | int | セッションまたはグローバル | 物理DDLステートメントをすべての物理データベースに送信する場合の最大DOP。 | 1 × DNの数 | 最大値は、DN上のCPUコアの数にDNの数 ① を掛けた結果に設定することを推奨します。 |
① デフォルトでは、単一の物理DDLステートメントは単一のCPUコアで高い使用率を実現できます。 したがって、PREFETCH_SHARDSパラメーターの値がすべてのDNのCPUコア数を超えている場合、値を増やしても効果は大きくありません。
たとえば、インスタンスに2つのCNと2つのDNがあり、それぞれ16のCPUコアと64 GBのメモリがあり、Transaction Processing Performance CouncilベンチマークC (TPC-C) 10000ウェアハウスのbmsql_order_lineテーブルにローカルインデックスを追加する場合。 インスタンスに十分なリソースがある場合、次の方法でパラメーターを設定できます。
/* + TDDL:cmd_extra(MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=32)* /
ALTER TABLE 'bmsql_order_line 'ADD LOCAL INDEX 'i_ol_d_id'('ol_d_id ');
show physical processlist where info like "% i_ol_d_id %;
コマンドを実行して、DNでの物理DDLステートメントの同時実行を表示できます。
論理的に実行されたDDLステートメントのDOP制御
論理的に実行されたDDLステートメントの場合、次の表に示すパラメーターを使用して、データバックフィルとリソース制限のDOPを制御できます。 show ddl status
コマンドを実行して、論理実行の進行状況を表示することもできます。
次の表に、GSIの追加、テーブルの再分割、およびOMCの実行のために実行されるDDLステートメントのDOP制御パラメーターを示します。
パラメーター | タイプ | レベル | の説明 | デフォルト値 | 推奨される最大設定 |
BACKFILL_PARALLELISM | int | グローバル | グローバルに許可される同時バックフィルスレッドの最大数。 | max(CPU_cores, 8) * 4 | 通常、このパラメーターを調整する必要はありません。 |
SLIDE_WINDOW_TIME_INTERVAL | int | セッションまたはグローバル | 大規模な物理テーブルの同時バックフィルの開始の遅延。 単位は秒です。 | 60 | リソースが十分な場合は、値を0に設定できます。 |
GSI_BACKFILL_PARALLELISM | int | セッションまたはグローバル | 単一のDDLタスクで許可される同時バックフィルスレッドの最大数。 | -1 | 通常、このパラメーターを調整する必要はありません。 |
PHYSICAL_TABLE_BACKFILL_PARALLELISM | int | セッションまたはグローバル | 単一の物理テーブルに許可される同時バックフィルスレッドの最大数。 | 4 | CN上のCPUコアの数に負荷に基づいて2を掛けた結果に最大値を設定することを推奨します。 |
GSI_BACKFILL_SPEED_LIMITATION | int | セッションまたはグローバル | 許可される最大バックフィル率。 単位: row/s。 | 150000 | 負荷に基づいて最大値を-1に設定することを推奨します。 |
次の表に、パーティションとスケールテーブルを移動するために実行されるDDLステートメントのDOP制御パラメーターを示します。
パラメーター | タイプ | レベル | の説明 | デフォルト値 | 推奨される最大設定 |
BACKFILL_PARALLELISM | int | グローバル | グローバルに許可される同時バックフィルスレッドの最大数。 | max(CPU_cores, 8) * 4 | 通常、このパラメーターを調整する必要はありません。 |
SLIDE_WINDOW_TIME_INTERVAL | int | セッションまたはグローバル | 大規模な物理テーブルの同時バックフィルの開始の遅延。 単位は秒です。 | 60 | リソースが十分な場合は、値を0に設定できます。 |
SCALEOUT_BACKFILL_PARALLELISM | int | セッションまたはグローバル | 単一のDDLタスクで許可される同時バックフィルスレッドの最大数。 | -1 | 通常、このパラメーターを調整する必要はありません。 |
PHYSICAL_TABLE_BACKFILL_PARALLELISM | int | セッションまたはグローバル | 単一の物理テーブルに許可される同時バックフィルスレッドの最大数。 | 4 | CN上のCPUコアの数に負荷に基づいて2を掛けた結果に最大値を設定することを推奨します。 |
SCALEOUT_BACKFILL_SPEED_LIMITATION | int | セッションまたはグローバル | 許可される最大バックフィル率。 単位: row/s。 | 300000 | 負荷に基づいて最大値を-1に設定することを推奨します。 |
たとえば、インスタンスに2つのCNと2つのDNがあり、それぞれに16のCPUコアと64 GBのメモリがあり、TPC-C 10000ウェアハウスのbmsql_order_lineテーブルにグローバルインデックスを追加する場合。 デフォルトのパラメーター設定が使用されている場合、次のステートメントが実行されます。
/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true)* /
ALTER TABLE 'bmsql_order_line 'ADD GLOBAL INDEX 'g_i_ol_d_id'('ol_d_id ') partition by hash('ol_d_id') partition 32;
show ddl status
コマンドを実行して、DDLステートメントの実行ステータスを表示できます。
ショーのddlの状態;
+ ---------------------------------- + ----------
| メトリック | 値 |
+ ---------------------------------- + ----------
| BACKFILL_PARALLELISM | 32 |
| BACKFILL_ROWS_FINISHED | 288679866 |
| BACKFILL_ROWS_SPEED | 150186 |
| BACKFILL_TASK_FAILED | 0 |
| BACKFILL_TASK_FINISHED | 1 |
| BACKFILL_TASK_TOTAL | 0 |
| BACKFILL_TIME_MILLIS | 3450 |
| CHANGESET_APPLY_PARALLELISM | 0 |
| CHANGESET_APPLY_ROWS_SPEED | 0 |
| CHECKER_ROWS_FINISHED | 0 |
| CHECKER_TIME_MILLIS | 0 |
| 696412 | |
| DDL_JOBS_FINISHED | 5 |
| DDL_JOBS_TOTAL | 6 |
| DDL_TASK_FAILED | 4 |
| DDL_TASK_FINISHED | 107 |
| DDL_TASK_TOTAL | 63 |
| FASTCHECKER_TASK_RUNNING | 0 |
| FASTCHECKER_TASK_WAITING | 0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE | 1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE | 0 |
| FASTCHECKER_THREAD_POOL_NUM | 2 |
| THROTTLE_RATE | 150000 |
+ ---------------------------------- + ----------
あなたが注意を払う必要があるパラメータ:
BACKFILL_PARALLESIM: アクティブなバックフィルスレッドの総数。
BACKFILL_ROWS_SPEED: 行ごとの現在の埋め戻しレート。
THROTTLE_RATE: レート制限。
この場合、DDLバックフィルレートはTHROTTLE_RATEパラメーターで指定された値の影響を受け、約150,000行 /秒に制限されます。 最大DOPを使用してスロットリングをキャンセルする場合は、次の方法で論理実行用のDDLステートメントを送信できます。
/* + TDDL:cmd_extra(SLIDE_WINDOW_TIME_INTERVAL=0,PURE_ASYNC_DDL_MODE=true,PHYSICAL_TABLE_BACKFILL_PARALLELISM=8,GSI_BACKFILL_PARALLELISM=32,GSI_BACKFILL_SPEED_LIMITATION=-1)* /
ALTER TABLE bmsql_order_line ADDグローバルインデックスg_i_ol_d_id('ol_d_id ') partition by hash('ol_d_id') partition 32;
show ddl status
コマンドを実行して、DDLステートメントの実行ステータスを表示できます。
ショーのddlの状態;
+ ---------------------------------- + ---------
| メトリック | 値 |
+ ---------------------------------- + ---------
| BACKFILL_PARALLELISM | 32 |
| BACKFILL_ROWS_FINISHED | 37272038 |
| BACKFILL_ROWS_SPEED | 867669 |
| BACKFILL_TASK_FAILED | 0 |
| BACKFILL_TASK_FINISHED | 1 |
| BACKFILL_TASK_TOTAL | 0 |
| BACKFILL_TIME_MILLIS | 3450 |
| CHANGESET_APPLY_PARALLELISM | 0 |
| CHANGESET_APPLY_ROWS_SPEED | 0 |
| CHECKER_ROWS_FINISHED | 0 |
| CHECKER_TIME_MILLIS | 0 |
| 112397 | |
| DDL_JOBS_FINISHED | 3 |
| DDL_JOBS_TOTAL | 4 |
| DDL_TASK_FAILED | 2 |
| DDL_TASK_FINISHED | 75 |
| DDL_TASK_TOTAL | 42 |
| FASTCHECKER_TASK_RUNNING | 0 |
| FASTCHECKER_TASK_WAITING | 0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE | 1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE | 0 |
| FASTCHECKER_THREAD_POOL_NUM | 2 |
| THROTTLE_RATE | -1 |
+ ---------------------------------- + ---------
セットの23行 (0.02秒)
この場合、DDLバックフィル率は制限されない。 32スレッドすべてが実行されている場合、バックフィル率は860,000行 /秒に達します。
パフォーマンステスト
テスト用のPolarDB-Xインスタンスの仕様: 2つのCNと2つのDN。それぞれが16のCPUコアと64 GBのメモリを備えています。
テーブルスキーマ: TPC-CからAUTOモードのデータベースのbmsql_order_lineテーブル。
CREATE TABLE 'bmsql_order_line '( 'ol_w_id 'int(11) NOT NULL、 'ol_d_id 'tinyint (4) NOT NULL, 'ol_o_id 'int(11) NOT NULL、 'ol_number' tinyint (4) NOT NULL, 'ol_i_id 'int(11) NOT NULL、 'ol_delivery_d 'タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、 'ol_amount decimal (6,2) DEFAULT NULL、 'ol_supply_w_id 'int(11) DEFAULT NULL、 'ol_quantity' int(11) DEFAULT NULL、 'ol_dist_info 'char (24) COLLATE latin1_bin DEFAULT NULL、 PRIMARYキー ('ol_w_id ', 'ol_d_id', 'ol_o_id ', 'ol_number') ) エンジン=InnoDB DEFAULT CHARSET = latin1 DEFAULT COLLATE = latin1_bin PARTITION BY KEY('ol_w_id ') パーティー32
テストデータ: Benchmark Bootを使用して、TPC-C 10000ウェアハウスのデータをインポートできます。 合計で約30億行のデータが使用され、そのサイズは230 GBです。
テスト1: ローカルインデックスの追加
DOPパラメーターを設定し、次のステートメントを実行します。 show ddl status
コマンドを実行して、DDLステートメントの実行ステータスを表示します。
/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true,ENABLE_TWO_PHASE_DDL=false,ENBALE_DRDS_MULTI_PHASE_DDL=false,MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=xxx)* /
ALTER TABLE 'bmsql_order_line 'ADD LOCAL INDEX i_ol_o_id(ol_o_id);
次の表に、パラメーター設定ごとの実行時間とリソース使用量を示します。
パラメーター設定 | 実行時間 (秒) | 同時実行のスピードアップ | 平均DN CPU使用率 (≤ CPUコア数) | 平均DN IOPS使用量 (≤ 1) |
PREFETCH_SHARDS=2 (デフォルト設定、DNあたりのDOP: 1) | 6,880 | 1 | 135% | 55% |
PREFETCH_SHARDS=4 (DNあたりのDOP: 2) | 3,503 | 1.96 | 240% | 95% |
PREFETCH_SHARDS=8 (DNあたりのDOP: 4) | 2,514 | 2.69 | 470% | 100% |
PREFETCH_SHARDS=16 (DNあたりのDOP: 8) | 2,152 | 3.19 | 896% | 100% |
PREFETCH_SHARDS=32 (DNあたりのDOP: 16) | 1,954 | 3.52 | 1,590% | 100% |
テスト2: グローバルインデックスの追加
DOPパラメーターを設定し、次のステートメントを実行します。 show ddl status
コマンドを実行して、DDLステートメントの実行ステータスを表示します。
/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true、SLIDE_WINDOW_TIME_INTERVAL=0、PHYSICAL_TABLE_BACKFILL_PARALLELISM=xxx、GSI_BACKFILL_SPEED_LIMITATION=xxx)*
パラメーター設定 | 実行時間 (秒) | 同時実行のスピードアップ | 平均DN CPU使用率 (≤ CPUコア数) | 平均DN IOPS使用量 (≤ 1) | 平均CN CPU使用率 (≤ CPUコア数) |
PHYSICAL_TABLE_BACKFILL_PARALLELISM=1、GSI_BACKFILL_SPEED_LIMITATION=150000 (物理テーブルごとの同時実行なし、自動スロットリング) | 17,441 | 1 | 190% | 8% | 357% |
SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=4, GSI_BACKFILL_SPEED_LIMITATION=-1 (デフォルト設定、スロットリングなし) | 7,124 | 2.45 | 594% | 23% | 723% |
SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=8, GSI_BACKFILL_SPEED_LIMITATION=-1 (物理テーブルごとに8つの同時スレッド、スロットリングなし) | 4,020 | 4.34 | 1,175% | 54% | 1,476% |