TiDB 分散実行フレームワーク (DXF)
注記:
この機能はTiDB Cloudサーバーレスクラスターでは利用できません。
TiDBは、優れたスケーラビリティと弾力性を備えたコンピューティングとストレージの分離アーキテクチャを採用しています。v7.1.0以降、TiDBは分散アーキテクチャのリソースの利点をさらに活用するために、分散実行フレームワーク(DXF)を導入しました。DXFの目標は、タスクの統一されたスケジューリングと分散実行を実装し、全体タスクと個別タスクの両方に対して統一されたリソース管理機能を提供することで、ユーザーのリソース利用に対する期待をより適切に満たすことです。
このドキュメントでは、DXF の使用例、制限事項、使用方法、実装原則について説明します。
ユースケース
データベース管理システムでは、コアとなるトランザクション処理(TP)と分析処理(AP)のワークロードに加えて、DDL操作、 IMPORT INTO
ANALYZE
バックアップ/リストアといった重要なタスクが存在します。これらのタスクTTL 、データベースオブジェクト(テーブル)内の大量のデータを処理する必要があるため、一般的に次のような特徴があります。
- スキーマまたはデータベース オブジェクト (テーブル) 内のすべてのデータを処理する必要があります。
- 定期的に実行する必要があるかもしれませんが、頻度は低くなります。
- リソースが適切に制御されていない場合、TP および AP タスクに影響を与え、データベース サービスの品質が低下する可能性があります。
DXF を有効にすると上記の問題が解決され、次の 3 つの利点があります。
- このフレームワークは、高いスケーラビリティ、高可用性、高パフォーマンスを実現する統合機能を提供します。
- DXF はタスクの分散実行をサポートしており、TiDB クラスター全体の利用可能なコンピューティング リソースを柔軟にスケジュールできるため、TiDB クラスター内のコンピューティング リソースをより有効に活用できます。
- DXF は、全体的なタスクと個々のタスクの両方に対して、統合されたリソースの使用および管理機能を提供します。
現在、DXF はADD INDEX
とIMPORT INTO
ステートメントの分散実行をサポートしています。
ADD INDEX
インデックスを作成するために使用されるDDL文です。例:ALTER TABLE t1 ADD INDEX idx1(c1); CREATE INDEX idx1 ON table t1(c1);IMPORT INTO
、CSV、SQL、Parquet などの形式のデータを空のテーブルにインポートするために使用されます。
制限
DXF では、最大 16 個のタスク ( ADD INDEX
タスクとIMPORT INTO
タスクを含む) を同時にスケジュールできます。
前提条件
DXF を使用してADD INDEX
タスクを実行する前に、 高速オンラインDDLモードを有効にする必要があります。
高速オンライン DDL に関連する次のシステム変数を調整します。
tidb_ddl_enable_fast_reorg
: 高速オンラインDDLモードを有効にするために使用されます。TiDB v6.5.0以降ではデフォルトで有効になっています。tidb_ddl_disk_quota
: 高速オンライン DDL モードで使用できるローカル ディスクの最大クォータを制御するために使用されます。
使用法
DXFを有効にするには、
tidb_enable_dist_task
の値をON
に設定します。v8.1.0以降では、この変数はデフォルトで有効になっています。v8.1.0以降のバージョンで新しく作成されたクラスターでは、この手順をスキップできます。SET GLOBAL tidb_enable_dist_task = ON;DXFタスクの実行中、フレームワークでサポートされているステートメント(
ADD INDEX
やIMPORT INTO
など)が分散的に実行されます。すべてのTiDBノードはデフォルトでDXFタスクを実行します。一般に、DDL タスクの分散実行に影響を与える可能性のある次のシステム変数については、デフォルト値を使用することをお勧めします。
tidb_ddl_reorg_worker_cnt
: デフォルト値4
を使用します。推奨される最大値は16
です。tidb_ddl_reorg_priority
tidb_ddl_error_count_limit
tidb_ddl_reorg_batch_size
: デフォルト値を使用します。推奨される最大値は1024
です。
タスクのスケジュール
デフォルトでは、DXFはすべてのTiDBノードを分散タスクの実行対象としてスケジュールします。v7.4.0以降、TiDBセルフマネージドクラスターでは、 tidb_service_scope
設定することで、DXFが分散タスクの実行対象としてスケジュールするTiDBノードを制御できます。
バージョンv7.4.0からv8.0.0までの場合、
tidb_service_scope
のオプション値は''
またはbackground
です。現在のクラスターにtidb_service_scope = 'background'
のTiDBノードがある場合、DXFはこれらのノードにタスクの実行をスケジュールします。障害または通常のスケールインにより、現在のクラスターにtidb_service_scope = 'background'
のTiDBノードがない場合、DXFはtidb_service_scope = ''
のノードにタスクの実行をスケジュールします。v8.1.0以降では、
tidb_service_scope
任意の有効な値に設定できます。分散タスクが送信されると、タスクは現在接続されているTiDBノードのtidb_service_scope
値にバインドされ、DXFは同じtidb_service_scope
値を持つTiDBノードにのみタスクの実行をスケジュールします。ただし、以前のバージョンとの設定互換性を保つため、分散タスクがtidb_service_scope = ''
ノードに送信され、現在のクラスターにtidb_service_scope = 'background'
のTiDBノードがある場合、DXFはタスクをtidb_service_scope = 'background'
のTiDBノードに実行をスケジュールします。
v8.1.0以降、タスク実行中に新しいノードが追加された場合、DXFは前述のルールに基づいて、新しいノードにタスクを実行するかどうかを決定しました。新しく追加されたノードにタスクを実行させたくない場合は、事前にそれらのノードに異なるtidb_service_scope
設定することをお勧めします。
注記:
- バージョンv7.4.0からv8.0.0まで、複数のTiDBノードを持つクラスターでは、2つ以上のTiDBノードで
tidb_service_scope
からbackground
設定することを強くお勧めします。この変数を1つのTiDBノードにのみ設定した場合、そのノードが再起動または障害を起こした場合、タスクはtidb_service_scope = ''
が設定されているTiDBノードに再スケジュールされ、これらのTiDBノードで実行されているアプリケーションに影響を及ぼします。- 分散タスクの実行中、
tidb_service_scope
構成への変更は現在のタスクには適用されませんが、次のタスクからは適用されます。
実施原則
DXF のアーキテクチャは次のとおりです。
上の図に示すように、DXF でのタスクの実行は主に次のモジュールによって処理されます。
- ディスパッチャ: 各タスクの分散実行プランを生成し、実行プロセスを管理し、タスクの状態を変換し、実行時のタスク情報を収集してフィードバックします。
- スケジューラ: TiDB ノード間で分散タスクの実行を複製し、タスク実行の効率を向上させます。
- サブタスクエグゼキュータ:分散サブタスクの実際の実行者。また、サブタスクエグゼキュータはサブタスクの実行状況をスケジューラに返し、スケジューラはサブタスクの実行状況を一元的に更新します。
- リソース プール: 上記のモジュールのコンピューティング リソースをプールすることにより、リソースの使用状況と管理を定量化するための基礎を提供します。