1. 準備
1.1 MySQL binlog モードの確認
MySQL データベースの binlog モードが であるかどうかを確認しますROW
。MySQL コマンドラインで次のステートメントを実行して確認できます。
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
返された結果のフィールドValue
が の場合ROW
、binlog モードは ですROW
。
1.2 Flinkをダウンロードしてインストールする
Flink をダウンロードしてインストールします。インストールについては公式ドキュメントを参照してください。
2. Flink CDC を設定する
2.1 MySQL データベース接続情報の構成
flink-conf.yaml
MySQL データベース接続情報をFlink の構成ファイルに追加します。例:
# MySQL connection configuration
mysql.server-id: 12345
mysql.hostname: localhost
mysql.port: 3306
mysql.username: root
mysql.password: 123456
mysql.database-name: test
2.2 CDC ジョブの構成
Flink の CDC ジョブ構成ファイルmysql-cdc.properties
に次の構成を追加します。
# Flink CDC Job Configuration
name: mysql-cdc-job
flink.parallelism: 1
flink.checkpoint.interval: 60000
flink.checkpoint.mode: EXACTLY_ONCE
# MySQL CDC Source Configuration
debezium.transforms: unwrap
debezium.transforms.unwrap.type: io.debezium.transforms.ExtractNewRecordState
database.hostname: localhost
database.port: 3306
database.user: root
database.password: 123456
database.history.kafka.bootstrap.servers: localhost:9092
database.history.kafka.topic: mysql-cdc-history
database.server.id: 12345
database.server.name: test
database.whitelist: test.user
その中で、name
は CDC ジョブの名前、flink.parallelism
は Flink の並列度、flink.checkpoint.interval
は Flink のチェックポイント時間間隔、flink.checkpoint.mode
はチェックポイント モードであり、ここで設定されますEXACTLY_ONCE
。
debezium.transforms
ここで設定する Debezium コンバータの名前ですunwrap
。database.hostname
、database.port
、database.user
、database.password
はそれぞれ MySQL データベースの接続情報です。CDC の履歴データに記録されている Kafka および Kafka トピックdatabase.history.kafka.bootstrap.servers
のアドレス情報です。は MySQL のサーバー ID、は CDC ソースの名前、および同期する必要がある MySQL テーブルの名前です。database.history.kafka.topic
database.server.id
database.server.name
database.whitelist
ステップ 1: MySQL データベースを作成する
まず、MySQL データベースをローカルまたはクラウドに作成し、読み取りおよび書き込み権限を持つユーザーを追加する必要があります。test_db
以下は、という名前のデータベースと という名前のユーザーを作成するflink_cdc_user
サンプル SQL コードです。
CREATE DATABASE test_db;
CREATE USER 'flink_cdc_user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON test_db.* TO 'flink_cdc_user'@'%';
ステップ 2: Flink クラスターを開始する
Flink クラスターを起動して CDC アプリケーションを実行します。Flink 独自のbin/start-cluster.sh
スクリプトを使用して Flink クラスターを起動できます。実行時に Flink クラスターに Kafka と MySQL の依存関係が含まれていることを確認してください。
ステップ 3: MySQL テーブルと CDC テーブルを作成する
MySQL では、まず CDC を必要とするテーブルと CDC テーブルを作成する必要があります。CDC テーブルは、キャプチャする必要がある変更データを保存するシステム テーブルです。という名前のテーブルtest_table
とそれに関連付けられた CDC テーブルは、次のコードで作成できます。
CREATE TABLE test_db.test_table (
id INT PRIMARY KEY,
name VARCHAR(30),
age INT,
email VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE test_db.test_table_cdc (
`database` VARCHAR(100),
`table` VARCHAR(100),
`type` VARCHAR(10),
`ts` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
`before` JSON,
`after` JSON
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
ステップ 4: Flink CDC アプリケーションを作成する
次に、MySQL テーブルの変更を Kafka トピックにプッシュする Flink CDC アプリケーションを作成する必要があります。これを実現するには、Flinkflink-connector-jdbc
とflink-connector-kafka
ライブラリを使用できます。
基本的な Flink CDC アプリケーションのコード例を次に示します。
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test-group");
JdbcSource<RowData> source = JdbcSource.<RowData>builder()
.setDrivername("com.mysql.jdbc.Driver")
.setDBUrl("jdbc:mysql://localhost:3306/test_db")
.setUsername("flink_cdc_user")
.setPassword("password")
.setQuery("SELECT id, name, age, email FROM test_table")
.setRowTypeInfo(Types.ROW(Types.INT, Types.STRING, Types.INT, Types.STRING))
.setFetchSize(1000)
.build();
DataStream<RowData> stream = env.addSource(source);
簡単な実行例と結果を次に示します。
$ bin/flink run -c com.example.MyCDCJob ./my-cdc-job.jar --database.server=mysql.example.com --database.port=3306 --database.name=mydb --database.username=myuser --database.password=mypassword --table.name=mytable --debezium.plugin.name=mysql --debezium.plugin.property.version=1.3.1.Final
[INFO] Starting CDC process for table: mytable.
[INFO] Initializing CDC source...
[INFO] CDC source successfully initialized.
[INFO] Starting CDC source...
[INFO] CDC source successfully started.
[INFO] Adding CDC source to Flink job topology...
[INFO] CDC source successfully added to Flink job topology.
[INFO] Starting Flink job...
[INFO] Flink job started successfully.
[INFO] Change data for table: mytable.
[INFO] Record key: {"id": 1}, record value: {"id": 1, "name": "Alice", "age": 25}.
[INFO] Record key: {"id": 2}, record value: {"id": 2, "name": "Bob", "age": 30}.
[INFO] Record key: {"id": 3}, record value: {"id": 3, "name": "Charlie", "age": 35}.
[INFO] Change data for table: mytable.
[INFO] Record key: {"id": 1}, record value: {"id": 1, "name": "Alice", "age": 27}.
データが変更されると、Flink CDC ジョブは変更されたテーブル名、レコードの主キー、および変更されたデータを出力することがわかります。たとえば、この例では、年齢フィールドが 25 から 27 に変更される行があります。