双方向レプリケーション
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 のデータは一致しています。changefeed を作成するときは、アップストリーム クラスターの changefeed の
--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(オプション) データ ソースを追跡する必要がある場合は、
tidb_source_id
システム変数を使用して各クラスターに一意のデータ ソース ID を設定します。
構成が有効になると、クラスターは双方向のレプリケーションを実行できます。
DDLを実行
双方向レプリケーションは、DDL ステートメントのレプリケートをサポートしていません。
DDL ステートメントを実行する必要がある場合は、次の手順を実行します。
- すべてのクラスターで DDL を実行する必要があるテーブルの書き込み操作を一時停止します。 DDL ステートメントが一意ではないインデックスを追加している場合は、この手順をスキップしてください。
- すべてのクラスター内の対応するテーブルの書き込み操作が他のクラスターに複製された後、各 TiDB クラスター内のすべての DDL ステートメントを手動で実行します。
- 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
など) に接続する必要があります。