📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

TiCDC Open Protocol



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

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

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

制限

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

メッセージ形式

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

キー:

オフセット(バイト)0~78~1516~(15+length1)......
パラメータプロトコルバージョンLength1Event Key1LengthNEvent KeyN

値:

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

イベント形式

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

行変更イベント

  • キー:

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

    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型説明
    Column Namestring列名。
    Column Typenumber列の種類。詳細はカラムタイプコードを参照してください。
    Where Handlebooleanこの列がWhere節のフィルター条件に使用できるかどうかを判断します。この列がテーブル上で一意の場合、 Where Handleはtrueになります。
    Flagnumber列のビットフラグ。詳細は列のビットフラグを参照してください。
    Column Valueanyカラムの値。

DDLイベント

  • キー:

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

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

解決されたイベント

  • キー:

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

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

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

アップストリームで次の 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は解決済みイベントです。解決済みイベントとは、このパーティションにおいて、Resolved 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 Open Protocol用の標準解析ライブラリを提供していませんが、 Golang版とJava版の解析例が提供されています。このドキュメントで提供されているデータ形式と以下の例を参考に、コンシューマー向けのプロトコル解析を実装できます。

カラムタイプコード

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

型コード出力例説明
TINYINT/BOOLEAN1{"t":1,"v":1}
SMALLINT2{"t":2,"v":1}
INT3{"t":3,"v":123}
FLOAT4{"t":4,"v":153.123}
DOUBLE5{"t":5,"v":153.123}
NULL6{"t":6,"v":null}
TIMESTAMP7{"t":7,"v":"1973-12-30 15:30:00"}
BIGINT8{"t":8,"v":123}
MEDIUMINT9{"t":9,"v":123}
DATE10/14{"t":10,"v":"2000-01-01"}
TIME11{"t":11,"v":"23:59:59"}
DATETIME12{"t":12,"v":"2015-12-20 23:58:58"}
YEAR13{"t":13,"v":1970}
VARCHAR/VARBINARY15/253{"t":15,"v":"test"} / {"t":15,"v":"\\x89PNG\\r\\n\\x1a\\n"}値はUTF-8でエンコードされます。アップストリームの型がVARBINARYの場合、非表示の文字はエスケープされます。
BIT16{"t":16,"v":81}
JSON245{"t":245,"v":"{\"key1\": \"value1\"}"}
DECIMAL246{"t":246,"v":"129012.1230000"}
ENUM247{"t":247,"v":1}
SET248{"t":248,"v":3}
TINYTEXT/TINYBLOB249{"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 でエンコードされます。
CHAR/BINARY254{"t":254,"v":"test"} / {"t":254,"v":"\\x89PNG\\r\\n\\x1a\\n"}値はUTF-8でエンコードされます。アップストリームの型がBINARYの場合、非表示の文字はエスケープされます。
TiDBVectorFloat32225{"t":225,"v":"[1.23, -0.4]"}
GEOMETRY255Unsupported

DDLタイプコード

DDL Type Code 、DDL イベントの DDL文 タイプを表します。

TypeCode
Create Schema1
Drop Schema2
Create Table3
Drop Table4
Add Column5
Drop Column6
Add Index7
Drop Index8
Add Foreign Key9
Drop Foreign Key10
Truncate Table11
Modify Column12
Rebase Auto ID13
Rename Table14
Set Default Value15
Shard RowID16
Modify Table Comment17
Rename Index18
Add Table Partition19
Drop Table Partition20
Create View21
Modify Table Charset And Collate22
Truncate Table Partition23
Drop View24
Recover Table25
Modify Schema Charset And Collate26
Lock Table27
Unlock Table28
Repair Table29
Set TiFlash Replica30
Update TiFlash Replica Status31
Add Primary Key32
Drop Primary Key33
Create Sequence34
Alter Sequence35
Drop Sequence36

列のビットフラグ

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

ビット値名前説明
10x01BinaryFlag列がバイナリエンコードされた列であるかどうか。
20x02HandleKeyFlag列がハンドル インデックス列であるかどうか。
30x04GeneratedColumnFlag列が生成列であるかどうか。
40x08PrimaryKeyFlag列が主キー列であるかどうか。
50x10UniqueKeyFlag列が一意インデックス列であるかどうか。
60x20MultipleKeyFlag列が複合インデックス列であるかどうか。
70x40NullableFlag列が NULL 可能列であるかどうか。
80x80UnsignedFlag列が符号なし列であるかどうか。

例:

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

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

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

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

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