著者: ハン・シャンジエ
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 と必要な依存関係をダウンロードします。
- Flink 1.16.0をダウンロードし、ディレクトリに解凍します。
flink-1.16.0
- 以下にリストされている依存関係をダウンロードし、ディレクトリ
flink-1.16.0/lib/
に。 - ダウンロード リンクはリリースされたバージョンでのみ有効です。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 のセマンティック効果も実現できます。