双方向レプリケーション

v6.5.0 以降、TiCDC は 2 つの TiDB クラスター間の双方向レプリケーションをサポートします。この機能に基づいて、TiCDC を使用してマルチアクティブ TiDB ソリューションを作成できます。

このセクションでは、2 つの TiDB クラスターを例として、双方向レプリケーションの使用方法について説明します。

双方向レプリケーションをデプロイ

TiCDC は、指定されたタイムスタンプの後に発生する増分データ変更のみをダウンストリーム クラスターにレプリケートします。双方向レプリケーションを開始する前に、次の手順を実行する必要があります。

  1. (オプション) 必要に応じて、データ エクスポート ツールDumplingとデータ インポート ツールTiDB Lightningを使用して、2 つの TiDB クラスターのデータを相互にインポートします。

  2. 2 つの TiDB クラスターの間に 2 つの TiCDC クラスターをデプロイ。クラスタのトポロジは以下のとおりです。図中の矢印はデータの流れの方向を示しています。

    TiCDC bidirectional replication

  3. 上流クラスターと下流クラスターのデータ複製の開始時点を指定します。

    1. 上流クラスターと下流クラスターの時点を確認します。 2 つの TiDB クラスターの場合は、2 つのクラスター内のデータが特定の時点で一貫していることを確認してください。たとえば、 ts=1の TiDB A のデータとts=2の TiDB B のデータは一致します。

    2. 変更フィードを作成するときは、上流クラスターの変更フィードの--start-tsを、対応するtsoに設定します。つまり、上流クラスターが TiDB A の場合は--start-ts=1を設定します。上流クラスターが TiDB B の場合は、 --start-ts=2を設定します。

  4. --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 ステートメントを実行する必要がある場合は、次の手順を実行します。

  1. すべてのクラスターで DDL を実行する必要があるテーブルの書き込み操作を一時停止します。
  2. すべてのクラスター内の対応するテーブルの書き込み操作が他のクラスターにレプリケートされた後、各 TiDB クラスター内のすべての DDL ステートメントを手動で実行します。
  3. DDL ステートメントが実行された後、書き込み操作を再開します。

双方向レプリケーションを停止する

アプリケーションがデータの書き込みを停止した後、各クラスターに特別なレコードを挿入できます。 2 つの特別なレコードをチェックすることで、2 つのクラスター内のデータが一貫していることを確認できます。

チェックが完了したら、変更フィードを停止して双方向レプリケーションを停止できます。

制限事項

  • DDL の制限については、 DDLの実行を参照してください。

  • 双方向レプリケーション クラスターは書き込み競合を検出できず、未定義の動作が発生する可能性があります。したがって、アプリケーション側から書き込み競合がないことを確認する必要があります。

  • 双方向レプリケーションは 3 つ以上のクラスターをサポートしますが、カスケード モードでの複数のクラスター、つまり TiDB A -> TiDB B -> TiDB C -> TiDB A のような循環レプリケーションはサポートしません。このようなトポロジでは、1 つのクラスターが失敗すると、データ レプリケーション全体が影響を受けます。したがって、複数のクラスター間で双方向レプリケーションを有効にするには、各クラスターを他のすべてのクラスター (たとえば、 TiDB A <-> TiDB BTiDB B <-> TiDB CTiDB C <-> TiDB Aに接続する必要があります。

このページは役に立ちましたか?