基于Flink CDC构建MySQL和PostgreSQL的Streaming ETL
本文将展示如何基于Flink CDC快速构建MySQL和PostgreSQL的ETL。本教程的演示将在Flink SQL CLI中进行,只涉及 SQL,不需要 Java/Scala 代码,也不需要安装 IDE。
假设我们正在经营电子商务业务,商品和订单的数据存储在MySQL数据库中,订单的物流信息存储在 PostgreSQL数据库中。对于订单表,为了方便进行分析,我们希望找到的相关商品和物流信息上对应的商品和物流信息构成一张宽表,并且实时把它写到Elasticsearch中。
接下来的内容将介绍如何使用 Flink Mysql/PostgreSQL CDC来实现这个需求,系统的整体架构如下图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nw1GqSA9-1639730289994)(/Users/ylchou/Library/Application Support/typora-user-images/flink-cdc-streaming-etl.png)]
准备阶段
准备一台已经安装了Docker和Docker Compose的Linux或者MacOS电脑。
准备教程所需要的组件
后文以docker-compose
的方式准备所需要的组件。
使用下面的内容创建一个docker-compose.yml
文件:
version: '2.1'
services:
postgres:
image: debezium/example-postgres:1.1
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=1234
- 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
elasticsearch:
image: elastic/elasticsearch:7.6.0
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
ports:
- "9200:9200"
- "9300:9300"
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
kibana:
image: elastic/kibana:7.6.0
ports:
- "5601:5601"
该 Docker Compose 中包含的容器有:
- MySQL:商品表
products
和订单表orders
将存储在该数据库中,这两张表将和 Postgres 数据库中的物流表shipments
进行,得到一张包含更多信息的订单表enriched_orders
。 - PostgreSQL:物流表
shipments
将存储在该数据库中。 - Elasticsearch:最终的订单表
enriched_orders
将写到Elasticsearch。 - Kibana:支持可视化 ElasticSearch 的数据。
在docker-compose.yml
文件所在目录下执行下面的命令来启动本文需要的组件(MySQL、PostgreSQL、Elasticsearch、Kibana):
docker-compose up -d
该命令自动下载Docker Compose配置中定义的镜像(如果本地没有镜像的话)和启动Docker Compose配置中定义的所有容器。可以通过docker ps或docker-compose ps来观察上述的容器是否正常启动了,也可以通过访问http://localhost:5601/来查看Kibana是否运行正常。
执行docker ps可以看到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b099f347ea05 debezium/example-mysql:1.1 "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, 33060/tcp flinkdockercompose_mysql_1
1f5cf35b9b25 debezium/example-postgres:1.1 "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:5432->5432/tcp flinkdockercompose_postgres_1
363a1bad8e46 elastic/elasticsearch:7.6.0 "/usr/local/bin/do..." 2 hours ago Up 2 hours 0.0.0.0:9200->9200/tcp,