双方向レプリケーション
v6.5.0 以降、TiCDC は 2 つの TiDB クラスター間の双方向レプリケーションをサポートします。この機能に基づいて、TiCDC を使用してマルチアクティブ TiDB ソリューションを作成できます。
このセクションでは、2 つの TiDB クラスターを例として、双方向レプリケーションの使用方法について説明します。
双方向レプリケーションをデプロイ
TiCDC は、指定されたタイムスタンプの後に発生する増分データ変更のみをダウンストリーム クラスターにレプリケートします。双方向レプリケーションを開始する前に、次の手順を実行する必要があります。
(オプション) 必要に応じて、データ エクスポート ツールDumplingとデータ インポート ツールTiDB Lightningを使用して、2 つの TiDB クラスターのデータを相互にインポートします。
2 つの TiDB クラスターの間に 2 つの TiCDC クラスターをデプロイ。クラスタのトポロジは以下のとおりです。図中の矢印はデータの流れの方向を示しています。
上流クラスターと下流クラスターのデータ複製の開始時点を指定します。
上流クラスターと下流クラスターの時点を確認します。 2 つの TiDB クラスターの場合は、2 つのクラスター内のデータが特定の時点で一貫していることを確認してください。たとえば、
ts=1
の TiDB A のデータとts=2
の TiDB B のデータは一致します。変更フィードを作成するときは、上流クラスターの変更フィードの
--start-ts
を、対応するtso
に設定します。つまり、上流クラスターが TiDB A の場合は--start-ts=1
を設定します。上流クラスターが TiDB B の場合は、--start-ts=2
を設定します。
--config
パラメータで指定された構成ファイルに、次の構成を追加します。# Whether to enable the bi-directional replication mode bdr-mode = true
構成が有効になると、クラスターは双方向レプリケーションを実行できるようになります。
DDLの実行
双方向レプリケーションが有効になった後は、TiCDC は DDL ステートメントを複製しません。 DDL ステートメントは、アップストリーム クラスターとダウンストリーム クラスターでそれぞれ実行する必要があります。
一部の DDL ステートメントは、テーブル構造の変更やデータ変更の時間順序の問題を引き起こす可能性があり、レプリケーション後にデータの不整合を引き起こす可能性があることに注意してください。したがって、双方向レプリケーションを有効にした後は、アプリケーションの書き込み操作を停止せずに、次の表の DDL ステートメントのみを実行できます。
イベント | チェンジフィードエラーの原因になりますか | 注記 |
---|---|---|
データベースを作成する | はい | アップストリーム クラスターとダウンストリーム クラスターで DDL ステートメントを手動で実行すると、エラーは自動的に回復できます。 |
データベースを削除する | はい | エラーを回復するには、変更フィードを手動で再起動し、DDL ステートメントのcommitTs として--overwrite-checkpoint-ts を指定する必要があります。 |
テーブルを作成する | はい | アップストリーム クラスターとダウンストリーム クラスターで DDL ステートメントを手動で実行すると、エラーは自動的に回復できます。 |
ドロップテーブル | はい | エラーを回復するには、変更フィードを手動で再起動し、DDL ステートメントのcommitTs として--overwrite-checkpoint-ts を指定する必要があります。 |
テーブルのコメントを変更する | いいえ | |
インデックスの名前を変更する | いいえ | |
テーブルインデックスの可視性を変更する | いいえ | |
パーティションを追加する | はい | アップストリーム クラスターとダウンストリーム クラスターで DDL ステートメントを手動で実行すると、エラーは自動的に回復できます。 |
パーティションを削除する | いいえ | |
ビューの作成 | いいえ | |
ドロップビュー | いいえ | |
列のデフォルト値を変更する | いいえ | |
パーティションを再編成する | はい | アップストリーム クラスターとダウンストリーム クラスターで DDL ステートメントを手動で実行すると、エラーは自動的に回復できます。 |
テーブルttlを変更する | いいえ | |
テーブルを変更して TTL を削除 | いいえ | |
一意ではないインデックスを追加する | いいえ | |
一意ではないインデックスを削除します | いいえ |
前の表にない DDL ステートメントを実行する必要がある場合は、次の手順を実行します。
- すべてのクラスターで DDL を実行する必要があるテーブルの書き込み操作を一時停止します。
- すべてのクラスター内の対応するテーブルの書き込み操作が他のクラスターにレプリケートされた後、各 TiDB クラスター内のすべての DDL ステートメントを手動で実行します。
- DDL ステートメントが実行された後、書き込み操作を再開します。
双方向レプリケーションを停止する
アプリケーションがデータの書き込みを停止した後、各クラスターに特別なレコードを挿入できます。 2 つの特別なレコードをチェックすることで、2 つのクラスター内のデータが一貫していることを確認できます。
チェックが完了したら、変更フィードを停止して双方向レプリケーションを停止できます。
制限事項
DDL の制限については、 DDLの実行を参照してください。
双方向レプリケーション クラスターは書き込み競合を検出できず、未定義の動作が発生する可能性があります。したがって、アプリケーション側から書き込み競合がないことを確認する必要があります。
双方向レプリケーションは 3 つ以上のクラスターをサポートしますが、カスケード モードでの複数のクラスター、つまり TiDB A -> TiDB B -> TiDB C -> TiDB A のような循環レプリケーションはサポートしません。このようなトポロジでは、1 つのクラスターが失敗すると、データ レプリケーション全体が影響を受けます。したがって、複数のクラスター間で双方向レプリケーションを有効にするには、各クラスターを他のすべてのクラスター (たとえば、
TiDB A <-> TiDB B
、TiDB B <-> TiDB C
、TiDB C <-> TiDB A
に接続する必要があります。