上流および下流のクラスタデータ検証とスナップショット読み取り
TiCDC を使用して TiDB の上流および下流クラスターを構築する場合、レプリケーションを停止せずに上流および下流で一貫性のあるスナップショット読み取りまたはデータ一貫性検証を実行する必要がある場合があります。通常のレプリケーション モードでは、TiCDC はデータの最終的な一貫性を保証するだけで、レプリケーション プロセス中のデータの一貫性は保証できません。そのため、動的に変化するデータの一貫性のある読み取りを実行することは困難です。このようなニーズを満たすために、TiCDC は Syncpoint 機能を提供します。
Syncpoint は、TiDB が提供するスナップショット機能を使用し、レプリケーション プロセス中に TiCDC が上流と下流のスナップショット間で一貫性のあるts-map
維持できるようにします。これにより、動的データの一貫性の検証の問題が静的スナップショット データの一貫性の検証の問題に変換され、ほぼリアルタイムの検証の効果が得られます。
同期ポイントを有効にする
Syncpoint 機能を有効にすると、 一貫性のあるスナップショットの読み取りとデータ一貫性検証使用できるようになります。
Syncpoint 機能を有効にするには、レプリケーション タスクを作成するときに、TiCDC 構成項目の値をenable-sync-point
からtrue
設定します。Syncpoint を有効にすると、TiCDC は次の情報をダウンストリーム TiDB クラスターに書き込みます。
- レプリケーション中、TiCDC は定期的に (
sync-point-interval
で設定) アップストリームとダウンストリームの間でスナップショットを調整し、アップストリームとダウンストリームの TSO 対応をダウンストリームtidb_cdc.syncpoint_v1
テーブルに保存します。 - レプリケーション中、TiCDC は定期的に (
sync-point-interval
で設定)SET GLOBAL tidb_external_ts = @@tidb_current_ts
実行し、バックアップ クラスターにレプリケートされた一貫性のあるスナップショット ポイントを設定します。
次の TiCDC 構成例では、レプリケーション タスクの作成時に Syncpoint を有効にします。
# Enables SyncPoint.
enable-sync-point = true
# Aligns the upstream and downstream snapshots every 5 minutes
sync-point-interval = "5m"
# Cleans up the ts-map data in the downstream tidb_cdc.syncpoint_v1 table every hour
sync-point-retention = "1h"
一貫性のあるスナップショットの読み取り
注記:
一貫性のあるスナップショット読み取りを実行する前に、 同期ポイント機能を有効にしましたがあることを確認してください。複数のレプリケーション タスクが同じダウンストリーム TiDB クラスターを使用し、同期ポイントが有効になっている場合、これらの各タスクは、それぞれのレプリケーションの進行状況に基づいて
tidb_external_ts
とts-map
更新します。この場合、ts-map
テーブルからレコードを読み取ることによって、レプリケーション タスク レベルで一貫性のあるスナップショット読み取りを設定する必要があります。一方、複数のレプリケーション タスクが互いに干渉し、一貫性のない結果になる可能性があるため、ダウンストリーム アプリケーションがtidb_enable_external_ts_read
使用してデータを読み取ることは避ける必要があります。
バックアップ クラスターからデータを照会する必要がある場合は、アプリケーションがバックアップ クラスター上でトランザクション的に一貫性のあるデータを取得するようにSET GLOBAL|SESSION tidb_enable_external_ts_read = ON;
設定できます。
さらに、 ts-map
クエリすることで、スナップショット読み取りの以前の時点を選択することもできます。
データ一貫性検証
注記:
データ一貫性検証を実行する前に、 同期ポイント機能を有効にしましたあることを確認してください。
アップストリーム クラスターとダウンストリーム クラスターのデータを検証するには、sync-diff-inspector でsnapshot
設定するだけです。
ステップ1: ts-map
取得する
ダウンストリームTiDBクラスタで次のSQL文を実行すると、アップストリームTSO( primary_ts
)とダウンストリームTSO( secondary_ts
)を取得できます。
select * from tidb_cdc.syncpoint_v1;
+------------------+----------------+--------------------+--------------------+---------------------+
| ticdc_cluster_id | changefeed | primary_ts | secondary_ts | created_at |
+------------------+----------------+--------------------+--------------------+---------------------+
| default | test-2 | 435953225454059520 | 435953235516456963 | 2022-09-13 08:40:15 |
+------------------+----------------+--------------------+--------------------+---------------------+
前述のsyncpoint_v1
の表のフィールドの説明は次のとおりです。
ticdc_cluster_id
: このレコード内の TiCDC クラスターの ID。changefeed
: このレコード内の変更フィードの ID。異なる TiCDC クラスターに同じ名前の変更フィードが存在する可能性があるため、変更フィードによって挿入されたts-map
を TiCDC クラスター ID と変更フィード ID で確認する必要があります。primary_ts
: アップストリーム データベース スナップショットのタイムスタンプ。secondary_ts
: ダウンストリーム データベース スナップショットのタイムスタンプ。created_at
: このレコードが挿入された時刻。
ステップ2: スナップショットを構成する
次に、 ステップ1で取得したts-map
情報を使用して、上流データベースと下流データベースのスナップショット情報を設定します。
セクションDatasource config
の構成例を次に示します。
######################### Datasource config ########################
[data-sources.uptidb]
host = "172.16.0.1"
port = 4000
user = "root"
password = ""
snapshot = "435953225454059520"
[data-sources.downtidb]
host = "172.16.0.2"
port = 4000
user = "root"
snapshot = "435953235516456963"
注記
TiCDC が changefeed を作成する前に、TiCDC 構成項目
enable-sync-point
の値がtrue
に設定されていることを確認してください。この方法でのみ、同期ポイントが有効になり、ts-map
ダウンストリームに保存されます。構成項目sync-point-interval
のデフォルトの形式は"h m s"
です (例:"1h30m30s"
)。最小値は"30s"
です。完全な構成情報については、 TiCDC タスク構成ファイル参照してください。Syncpoint を使用してデータ検証を実行する場合、データ チェック中にスナップショットに対応する履歴データが GC によって収集されないように、TiKV のガベージ コレクション (GC) 時間を変更する必要があります。GC 時間を 1 時間に変更し、チェック後に設定を復元することをお勧めします。
上記の例では
Datasource config
の部分のみを示しています。完全な設定についてはsync-diff-inspector ユーザーガイドを参照してください。v6.4.0 以降では、権限
SYSTEM_VARIABLES_ADMIN
またはSUPER
持つ changefeed のみが TiCDC Syncpoint 機能を使用できます。v8.2.0 以降、TiCDC は
primary_ts
値の生成ルールに次の調整を加えます。- TiCDC が新しい
primary_ts
生成するときは常に、その値はsync-point-interval
の整数倍でなければなりません。 - 新しいチェンジフィードごとに、TiCDC は初期
primary_ts
を計算します。この初期値はチェンジフィードの開始時刻 (startTs
) 以上であり、sync-point-interval
の最小の整数倍です。
この設定は、データ レプリケーション中に異なる変更フィードの同期ポイントを揃えるために使用されます。たとえば、複数のダウンストリーム クラスターは、
FLASHBACK TABLE
ステートメントを実行することで、同じprimary_ts
の同期ポイントのsecondary_ts
に復元でき、ダウンストリーム クラスター間でデータの一貫性が実現されます。- TiCDC が新しい