📣
TiDB Cloud Essential はパブリックプレビュー中です。このページは自動翻訳されたものです。原文はこちらからご覧ください。

TiCDCオープンプロトコル

TiCDCオープンプロトコルは、行レベルのデータ変更通知プロトコルであり、監視、キャッシュ、全文インデックス作成、分析エンジン、そして異なるデータベース間のプライマリ-セカンダリレプリケーションのためのデータソースを提供します。TiCDCはTiCDCオープンプロトコルに準拠しており、TiDBのデータ変更をMQ(メッセージキュー)などのサードパーティのデータメディアに複製します。

TiCDCオープンプロトコルは、データ変更イベントを下流に複製するための基本単位としてイベントを使用します。イベントは以下の3つのカテゴリに分類されます。

  • 行変更イベント:行のデータ変更を表します。行が変更されると、このイベントが送信され、変更された行に関する情報が含まれます。
  • DDLイベント:DDLの変更を表します。このイベントは、上流でDDL文が正常に実行された後に送信されます。DDLイベントはすべてのMQパーティションにブロードキャストされます。
  • 解決されたイベント: 受信したイベントが完了する特別な時点を表します。

制限

  • ほとんどの場合、バージョンの行変更イベントは 1 回だけ送信されますが、ノード障害やネットワーク パーティションなどの特別な状況では、同じバージョンの行変更イベントが複数回送信されることがあります。
  • 同じテーブルで、最初に送信された各バージョンの行変更イベントは、イベント ストリーム内のタイムスタンプ (TS) の順に増加します。
  • 解決済みイベントは、各MQパーティションに定期的にブロードキャストされます。解決済みイベントとは、解決済みイベントTSよりも前のTSを持つイベントがダウンストリームに送信されたことを意味します。
  • DDL イベントは各 MQ パーティションにブロードキャストされます。
  • 1 つの行の複数の行変更イベントが同じ MQ パーティションに送信されます。

メッセージ形式

メッセージには、次の形式で配置された 1 つ以上のイベントが含まれます。

鍵:

オフセット(バイト)0~78~1516~(15+長さ1)......
パラメータプロトコルバージョン長さ1イベントキー1長さNイベントキーN

価値:

オフセット(バイト)0~78~(7+長さ1)......
パラメータ長さ1イベント値1長さNイベント値N
  • LengthN N番目のキー/値の長さを表します。
  • 長さとプロトコルバージョンはビッグエンディアンint64型です。
  • 現在のプロトコルのバージョンは1です。

イベント形式

このセクションでは、行変更イベント、DDL イベント、解決イベントの形式について説明します。

行変更イベント

  • 鍵:

    { "ts":<TS>, "scm":<Schema Name>, "tbl":<Table Name>, "t":1 }
    パラメータタイプ説明
    TS番号行の変更を引き起こしたトランザクションのタイムスタンプ。
    スキーマ名行が含まれているスキーマの名前。
    Table Name行が含まれているテーブルの名前。
  • 価値:

    Insertイベント。新しく追加された行データが出力されます。

    { "u":{ <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> }, <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> } } }

    Updateイベント。新しく追加された行データ("u")と更新前の行データ("p")が出力されます。

    { "u":{ <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> }, <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> } }, "p":{ <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> }, <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> } } }

    Deleteイベント。削除された行データが出力されます。

    { "d":{ <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> }, <Column Name>:{ "t":<Column Type>, "h":<Where Handle>, "f":<Flag>, "v":<Column Value> } } }
    Parameterタイプ説明
    カラム名列名。
    カラムタイプ番号列の種類。詳細はカラムタイプコード参照してください。
    ハンドルブール値この列がWhere節のフィルター条件に使用できるかどうかを判断します。この列がテーブル上で一意の場合、 Where Handletrueになります。
    フラグ番号列のビットフラグ。詳細は列のビットフラグ参照。
    カラムの値どれでもカラムの値。

DDLイベント

  • 鍵:

    { "ts":<TS>, "scm":<Schema Name>, "tbl":<Table Name>, "t":2 }
    パラメータタイプ説明
    TS番号DDL 変更を実行するトランザクションのタイムスタンプ。
    スキーマ名DDL 変更のスキーマ名。空の文字列になる場合があります。
    テーブル名DDL 変更のテーブル名。空の文字列になる場合があります。
  • 価値:

    { "q":<DDL Query>, "t":<DDL Type> }
    パラメータType説明
    DDLクエリDDLクエリSQL
    DDLタイプDDLタイプ。詳細はDDLタイプコード参照してください。

解決されたイベント

  • 鍵:

    { "ts":<TS>, "t":3 }
    パラメータタイプ説明
    TS番号解決されたタイムスタンプ。このイベントより前のTSは送信済みです。
  • Value: None

イベントストリーム出力の例

このセクションでは、イベント ストリームの出力ログを表示します。

アップストリームで次の SQL ステートメントを実行し、MQ パーティション番号が 2 であるとします。

CREATE TABLE test.t1(id int primary key, val varchar(16));

次のログ 1 とログ 3 から、DDL イベントがすべての MQ パーティションにブロードキャストされ、解決されたイベントが各 MQ パーティションに定期的にブロードキャストされていることがわかります。

1. [partition=0] [key="{\"ts\":415508856908021766,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":2}"] [value="{\"q\":\"CREATE TABLE test.t1(id int primary key, val varchar(16))\",\"t\":3}"] 2. [partition=0] [key="{\"ts\":415508856908021766,\"t\":3}"] [value=] 3. [partition=1] [key="{\"ts\":415508856908021766,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":2}"] [value="{\"q\":\"CREATE TABLE test.t1(id int primary key, val varchar(16))\",\"t\":3}"] 4. [partition=1] [key="{\"ts\":415508856908021766,\"t\":3}"] [value=]

アップストリームで次の SQL ステートメントを実行します。

BEGIN; INSERT INTO test.t1(id, val) VALUES (1, 'aa'); INSERT INTO test.t1(id, val) VALUES (2, 'aa'); UPDATE test.t1 SET val = 'bb' WHERE id = 2; INSERT INTO test.t1(id, val) VALUES (3, 'cc'); COMMIT;
  • 次のログ 5 とログ 6 から、同じテーブル上の行変更イベントは主キーに基づいて異なるパーティションに送信される可能性がありますが、同じ行への変更は同じパーティションに送信されるため、ダウンストリームでイベントを簡単に同時に処理できることがわかります。
  • ログ 6 以降、トランザクション内の同じ行に対する複数の変更は、1 つの行変更イベントでのみ送信されます。
  • ログ 8 は、ログ 7 の繰り返しイベントです。行変更イベントは繰り返される可能性がありますが、各バージョンの最初のイベントは順番に送信されます。
5. [partition=0] [key="{\"ts\":415508878783938562,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":1},\"val\":{\"t\":15,\"v\":\"aa\"}}}"] 6. [partition=1] [key="{\"ts\":415508878783938562,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":2},\"val\":{\"t\":15,\"v\":\"bb\"}}}"] 7. [partition=0] [key="{\"ts\":415508878783938562,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":3},\"val\":{\"t\":15,\"v\":\"cc\"}}}"] 8. [partition=0] [key="{\"ts\":415508878783938562,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":3},\"val\":{\"t\":15,\"v\":\"cc\"}}}"]

アップストリームで次の SQL ステートメントを実行します。

BEGIN; DELETE FROM test.t1 WHERE id = 1; UPDATE test.t1 SET val = 'dd' WHERE id = 3; UPDATE test.t1 SET id = 4, val = 'ee' WHERE id = 2; COMMIT;
  • ログ9は、 Deleteタイプの行変更イベントです。このタイプのイベントには、主キー列または一意のインデックス列のみが含まれます。
  • ログ13とログ14は解決済みイベントです。解決済みイベントとは、このパーティションにおいて、解決済みTSよりも小さいイベント(行変更イベントとDDLイベントを含む)が送信されたことを意味します。
9. [partition=0] [key="{\"ts\":415508881418485761,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"d\":{\"id\":{\"t\":3,\"h\":true,\"v\":1}}}"] 10. [partition=1] [key="{\"ts\":415508881418485761,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"d\":{\"id\":{\"t\":3,\"h\":true,\"v\":2}}}"] 11. [partition=0] [key="{\"ts\":415508881418485761,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":3},\"val\":{\"t\":15,\"v\":\"ZGQ=\"}}}"] 12. [partition=0] [key="{\"ts\":415508881418485761,\"scm\":\"test\",\"tbl\":\"t1\",\"t\":1}"] [value="{\"u\":{\"id\":{\"t\":3,\"h\":true,\"v\":4},\"val\":{\"t\":15,\"v\":\"ZWU=\"}}}"] 13. [partition=0] [key="{\"ts\":415508881038376963,\"t\":3}"] [value=] 14. [partition=1] [key="{\"ts\":415508881038376963,\"t\":3}"] [value=]

消費者向けプロトコル解析

現在、TiCDCはTiCDCオープンプロトコル用の標準解析ライブラリを提供していませんが、 Golang版とJava版の解析例が提供されています。このドキュメントで提供されているデータ形式と以下の例を参考に、コンシューマー向けのプロトコル解析を実装できます。

カラムタイプコード

Column Type Code 、行変更イベントの列データ型を表します。

タイプコード出力例説明
TINYINT/ブール値1{"t":1,"v":1}
スモールイント2{"t":2,"v":1}
INT3{"t":3,"v":123}
フロート4{"t":4,"v":153.123}
ダブル5{"t":5,"v":153.123}
ヌル6{"t":6,"v":null}
タイムスタンプ7{"t":7,"v":"1973-12-30 15:30:00"}
ビッグイント8{"t":8,"v":123}
ミディアムミント9{"t":9,"v":123}
日付10月14日{"t":10,"v":"2000-01-01"}
時間11{"t":11,"v":"23:59:59"}
日時12{"t":12,"v":"2015-12-20 23:58:58"}
13{"t":13,"v":1970}
VARCHAR/VARBINARY15/253{"t":15,"v":"テスト"} / {"t":15,"v":"\x89PNG\r\n\x1a\n"}値はUTF-8でエンコードされます。アップストリームの型がVARBINARYの場合、非表示の文字はエスケープされます。
少し16{"t":16,"v":81}
JSON245{"t":245,"v":"{\"キー1\": \"値1\"}"}
DECIMAL246{"t":246,"v":"129012.1230000"}
列挙型247{"t":247,"v":1}
セット248{"t":248,"v":3}
タイニーテキスト/タイニーブロブ249{"t":249,"v":"5rWL6K+VdGV4dA=="}値は Base64 でエンコードされます。
MEDIUMTEXT/MEDIUMBLOB250{"t":250,"v":"5rWL6K+VdGV4dA=="}値は Base64 でエンコードされます。
LONGTEXT/LONGBLOB251{"t":251,"v":"5rWL6K+VdGV4dA=="}値は Base64 でエンコードされます。
TEXT/BLOB252{"t":252,"v":"5rWL6K+VdGV4dA=="}値は Base64 でエンコードされます。
文字/バイナリ254{"t":254,"v":"テスト"} / {"t":254,"v":"\x89PNG\r\n\x1a\n"}値はUTF-8でエンコードされます。アップストリームの型がBINARYの場合、非表示の文字はエスケープされます。
TiDBベクターフロート32225{"t":225,"v":"[1.23, -0.4]"}
幾何学255Unsupported

DDLタイプコード

DDL Type Code 、DDL イベントの DDL ステートメント タイプを表します。

タイプコード
スキーマの作成1
スキーマの削除2
テーブルを作成3
ドロップテーブル4
カラムを追加5
カラムのドロップ6
インデックスを追加7
ドロップインデックス8
外部キーの追加9
外部キーの削除10
テーブルを切り捨て11
カラムの変更12
自動IDのリベース13
テーブル名の変更14
デフォルト値を設定する15
シャード行ID16
テーブルコメントの変更17
インデックスの名前変更18
テーブルパーティションの追加19
テーブルパーティションの削除20
ビューを作成21
表の文字セットと照合順序を変更する22
テーブルパーティションの切り捨て23
ドロップビュー24
テーブルの回復25
スキーマ文字セットと照合を変更する26
ロックテーブル27
テーブルのロックを解除28
修理テーブル29
TiFlashレプリカを設定する30
TiFlashレプリカのステータスを更新31
主キーの追加32
主キーの削除33
シーケンスを作成34
シーケンスの変更35
ドロップシーケンス36

列のビットフラグ

ビット フラグは列の特定の属性を表します。

少し価値名前説明
10x01バイナリフラグ列がバイナリエンコードされた列であるかどうか。
20x02ハンドルキーフラグ列がハンドル インデックス列であるかどうか。
30x04生成された列フラグ列が生成された列であるかどうか。
40x08プライマリキーフラグ列が主キー列であるかどうか。
50x10ユニークキーフラグ列が一意のインデックス列であるかどうか。
60x20複数キーフラグ列が複合インデックス列であるかどうか。
70x40NullableFlag列が NULL 可能列であるかどうか。
80x80符号なしフラグ列が符号なし列であるかどうか。

例:

列フラグの値が85の場合、その列は NULL 可能列、一意のインデックス列、生成された列、およびバイナリ エンコード列になります。

85 == 0b_101_0101 == NullableFlag | UniqueKeyFlag | GeneratedColumnFlag | BinaryFlag

列の値が46の場合、その列は複合インデックス列、主キー列、生成列、およびハンドル キー列になります。

46 == 0b_010_1110 == MultipleKeyFlag | PrimaryKeyFlag | GeneratedColumnFlag | HandleKeyFlag

注記:

  • BinaryFlag 、列の型が BLOB/ TEXT (TINYBLOB/TINYTEXT、BINARY/CHAR を含む)の場合にのみ意味を持ちます。上流の列が BLOB 型の場合、 BinaryFlag値は1に設定されます。上流の列がTEXT型の場合、 BinaryFlag値は0に設定されます。
  • TiCDCは、上流からテーブルを複製するために、ハンドルインデックスとして有効なインデックス選択します。ハンドルインデックス列のHandleKeyFlagの値は1に設定されます。

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