Flink CDC のベスト プラクティス (MySQL を例に挙げます)

1. 準備

1.1 MySQL binlog モードの確認

MySQL データベースの binlog モードが であるかどうかを確認しますROWMySQL コマンドラインで次のステートメントを実行して確認できます。

SHOW GLOBAL VARIABLES LIKE 'binlog_format';

返された結果のフィールドValueが の場合ROW、binlog モードは ですROW

1.2 Flinkをダウンロードしてインストールする

Flink をダウンロードしてインストールします。インストールについては公式ドキュメントを参照してください。

2. Flink CDC を設定する

2.1 MySQL データベース接続情報の構成

flink-conf.yamlMySQL データベース接続情報を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 コンバータの名前ですunwrapdatabase.hostnamedatabase.portdatabase.userdatabase.passwordはそれぞれ MySQL データベースの接続情報です。CDC の履歴データに記録されている Kafka および Kafka トピックdatabase.history.kafka.bootstrap.serversのアドレス情報です。は MySQL のサーバー ID、は CDC ソースの名前、および同期する必要がある MySQL テーブルの名前です。database.history.kafka.topicdatabase.server.iddatabase.server.namedatabase.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-jdbcflink-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 に変更される行があります。

おすすめ

転載: blog.csdn.net/lhyandlwl/article/details/129998737