Flink CDC に基づく MySQL から Databend へのリアルタイム データ同期

著者: ハン・シャンジエ

Databend クラウド R&D エンジニアhttps://github.com/hantmachttps://github.com/hantmac

このチュートリアルでは、Flink CDC に基づいて MySQL から Databend へのリアルタイム データ同期を迅速に構築する方法を説明します。このチュートリアルのデモはすべて Flink SQL CLI で実行され、SQL のみが関与し、Java/Scala コードを 1 行も必要とせず、IDE をインストールする必要もありません。

電子商取引ビジネスを行っており、製品データが MySQL に保存されており、それをリアルタイムで Databend に同期する必要があるとします。

次のコンテンツでは、この要件を達成するために Flink Mysql/Databend CDC を使用する方法を紹介します。システムの全体的なアーキテクチャを次の図に示します。

準備段階

Docker と docker-compose がインストールされた Linux または MacOS を準備します。

チュートリアルの準備に必要なコンポーネント

次のチュートリアルでは、docker-compose同じ。

デベジウム-MySQL

docker-compose.yaml

version: '2.1'
services:
  postgres:
    image: debezium/example-postgres:1.1
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  mysql:
    image: debezium/example-mysql:1.1
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_USER=mysqluser
      - MYSQL_PASSWORD=mysqlpw

データベンド

docker-compose.yaml

version: '3'
services:
  databend:
    image: datafuselabs/databend
    volumes:
      - /Users/hanshanjie/databend/local-test/databend/databend-query.toml:/etc/databend/query.toml
    environment:
      QUERY_DEFAULT_USER: databend
      QUERY_DEFAULT_PASSWORD: databend
      MINIO_ENABLED: 'true'
    ports:
      - '8000:8000'
      - '9000:9000'
      - '3307:3307'
      - '8124:8124'

docker-compose.yml同じディレクトリで次のコマンドを実行して、このチュートリアルに必要なコンポーネントを起動します。

ocker-compose up -d

このコマンドは、Docker Compose 構成で定義されたすべてのコンテナーをデタッチ モードで自動的に起動します。docker ps を使用して、上記のコンテナーが正常に起動するかどうかを観察できます。

Flink と必要な依存関係をダウンロードします。

  1. Flink 1.16.0をダウンロードし、ディレクトリに解凍します。flink-1.16.0
  2. 以下にリストされている依存関係をダウンロードし、ディレクトリflink-1.16.0/lib/に。
  3. ダウンロード リンクはリリースされたバージョンでのみ有効です。SNAPSHOT バージョンはローカルでコンパイルする必要があります。

flink-connector-databend をコンパイルする

git clone https://github.com/databendcloud/flink-connector-databend
cd flink-connector-databend
mvn clean install -DskipTests

target/flink-connector-databend-1.16.0-SNAPSHOT.jar をディレクトリflink-1.16.0/lib/に。

データを準備する

MySQL データベース にデータを準備する

MySQLコンテナに入る

docker-compose exec mysql mysql -uroot -p123456

データベース mydb と tables を作成しproducts、データを挿入します。

CREATE DATABASE mydb;
USE mydb;

CREATE TABLE products (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,description VARCHAR(512));
ALTER TABLE products AUTO_INCREMENT = 10;

INSERT INTO products VALUES (default,"scooter","Small 2-wheel scooter"),
(default,"car battery","12V car battery"),
(default,"12-pack drill bits","12-pack of drill bits with sizes ranging from #40 to #3"),
(default,"hammer","12oz carpenter's hammer"),
(default,"hammer","14oz carpenter's hammer"),
(default,"hammer","16oz carpenter's hammer"),
(default,"rocks","box of assorted rocks"),
(default,"jacket","water resistent black wind breaker"),
(default,"cloud","test for databend"),
(default,"spare tire","24 inch spare tire");

Databend でテーブルを作成する

CREATE TABLE bend_products (id INT NOT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(512) );

Flink クラスターと Flink SQL CLIを開始する

次のコマンドを使用して Flink ディレクトリにジャンプします

cd flink-16.0

次のコマンドで Flink クラスターを起動します。

./bin/start-cluster.sh

起動に成功すると、次のようにhttp://localhost:8081/でFlink Web UI にアクセスできます。

次のコマンドで Flink SQL CLI を起動します。

./bin/sql-client.sh

Flink SQL CLI Flink DDLを使用して テーブルを作成する

まず、チェックポイントをオンにして、3 秒ごとにチェックポイントを実行します

-- Flink SQL              
Flink SQL> SET execution.checkpointing.interval = 3s;

次に、データベース内のテーブルに対してproducts、Flink SQL CLI を使用して対応するテーブルを作成し、基礎となるデータベース テーブルのデータを同期します。

-- Flink SQL
Flink SQL> CREATE TABLE products (id INT,name STRING,description STRING,PRIMARY KEY (id) NOT ENFORCED) 
WITH ('connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '3306',
'username' = 'root',
'password' = '123456',
'database-name' = 'mydb',
'table-name' = 'products',
'server-time-zone' = 'UTC'
);

最後に、注文データを Databend に書き込むための d_products テーブルを作成します。

-- Flink SQL
create table d_products (id INT,name String,description String, PRIMARY KEY (`id`) NOT ENFORCED) 
with ('connector' = 'databend',
'url'='databend://localhost:8000',
'username'='databend',
'password'='databend',
'database-name'='default',
'table-name'='bend_products',
'sink.batch-size' = '5',
'sink.flush-interval' = '1000',
'sink.max-retries' = '3');

Flink SQL を使用して、products テーブルのデータを Databend の d_products テーブルに同期します。

insert into d_products select * from products;

この時点で、flink ジョブは正常に送信されます。flink UI を開くと、次の内容が表示されます。

同時に、MySQL のデータがデータベンドで同期されていることがわかります。

データの挿入/更新を同期する

この時点で、さらに 10 個のデータを MySQL に挿入します。

INSERT INTO products VALUES 
(default,"scooter","Small 2-wheel scooter"),
(default,"car battery","12V car battery"),
(default,"12-pack drill bits","12-pack of drill bits with sizes ranging from #40 to #3"),        
(default,"hammer","12oz carpenter's hammer"),        
(default,"hammer","14oz carpenter's hammer"),        
(default,"hammer","16oz carpenter's hammer"),        
(default,"rocks","box of assorted rocks"),        
(default,"jacket","water resistent black wind breaker"),
(default,"cloud","test for databend"),        
(default,"spare tire","24 inch spare tire");

これらのデータはすぐに Databend に同期されます。

この時点で MySQL でデータが更新された場合:

次に、id=10 のデータがデータベンドですぐに更新されます。

環境浄化

操作が終了したら、docker-compose.ymlファイルがすべてのコンテナを停止します。

docker-compose down

Flink が存在するディレクトリflink-1.16.0で次のコマンドを実行して、Flink クラスターを停止します。

./bin/stop-cluster.sh

結論は

上記は、Flink CDC に基づいて MySQL から Databend へのリアルタイム データ同期を構築するプロセス全体です。Flink CDC コネクタは、Debezium+Kafka のデータ取得モジュールを置き換えることができ、Flink SQL 取得 + 計算 + 送信の統合を実現し、メンテナンスを削減します。これにより、展開コストを削減しながら、Exactly Once のセマンティック効果も実現できます。

{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5489811/blog/10084237