TiDB 分散実行フレームワーク (DXF)
注記:
この機能はTiDB サーバーレスクラスターでは使用できません。
TiDB は、優れたスケーラビリティと弾力性を備えたコンピューティングとストレージの分離アーキテクチャを採用しています。v7.1.0 以降、TiDB は分散アーキテクチャのリソースの利点をさらに活用するために、分散実行フレームワーク (DXF) を導入しています。DXF の目標は、タスクの統一されたスケジュールと分散実行を実装し、全体と個々のタスクの両方に統一されたリソース管理機能を提供することです。これにより、リソース使用に関するユーザーの期待をよりよく満たすことができます。
このドキュメントでは、DXF の使用例、制限事項、使用方法、実装の原則について説明します。
ユースケース
データベース管理システムには、コアとなるトランザクション処理 (TP) と分析処理 (AP) のワークロードに加えて、DDL 操作、IMPORT INTO、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
などの形式のデータを空のテーブルにインポートするために使用されます。詳細については、IMPORT INTO
を参照してください。
制限
DXF では、最大 16 個のタスク ( ADD INDEX
タスクとIMPORT INTO
タスクを含む) を同時にスケジュールできます。
ADD INDEX
制限
- 各クラスターでは、一度に 1 つ
ADD INDEX
タスクのみを分散実行できます。現在のADD INDEX
の分散タスクが完了する前に新しいADD INDEX
タスクが送信された場合、新しいADD INDEX
タスクは DXF によってスケジュールされるのではなく、トランザクションを通じて実行されます。 - DXF を介して
TIMESTAMP
データ型の列にインデックスを追加することは、インデックスとデータの間に不整合が生じる可能性があるため、サポートされていません。
前提条件
DXF を使用してADD INDEX
タスクを実行する前に、 高速オンラインDDLモードを有効にする必要があります。
高速オンライン DDL に関連する次のシステム変数を調整します。
tidb_ddl_enable_fast_reorg
: 高速オンライン DDL モードを有効にするために使用されます。TiDB v6.5.0 以降ではデフォルトで有効になっています。tidb_ddl_disk_quota
: 高速オンライン DDL モードで使用できるローカル ディスクの最大クォータを制御するために使用されます。
高速オンライン DDL に関連する次の構成項目を調整します。
temp-dir
: 高速オンライン DDL モードで使用できるローカル ディスク パスを指定します。
注記:
TiDB
temp-dir
ディレクトリ用に少なくとも 100 GiB の空き領域を用意することをお勧めします。
使用法
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 ノードにタスクの実行をスケジュールします。
タスク実行中に新しいノードが追加された場合、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 ノード間で分散タスクの実行を複製し、タスク実行の効率を向上させます。
- サブタスク エグゼキュータ: 分散サブタスクの実際の実行者。また、サブタスク エグゼキュータはサブタスクの実行ステータスをスケジューラに返し、スケジューラはサブタスクの実行ステータスを統一的に更新します。
- リソース プール: 上記のモジュールのコンピューティング リソースをプールすることにより、リソースの使用状況と管理を定量化するための基礎を提供します。