flink-cdc是一款专用于数据库增量数据监控的插件。基于flink计算引擎提供的高性能,高可用性,高扩展性的数据监控功能。当前flink-cdc支持读取例如mysql,oracle,mongodb,tidb,postgres等常见的数据库类型,具体支持版本见官方 Support Version。
之前大多数公司会单独部署一些数据同步服务,例如当前flink-cdc的内核产品 Debezium,阿里开源的canal,开源软件datalink(目前我司就是基于这个产品实现的各个业务数据库的binlog监控)。flink-cdc出现之后,用户可以脱离这些繁重的中间产品,使用基于flink部署轻量化的同步服务。更可以对同步的数据再进行进一步加工实现各种业务需求。
公司环境flink-cdc运行依赖大数据基础组件 yarn或者k8s部署flink任务,但是个人体验最低要求仅需要下载flink客户端运行即可。
下面基于mysql-cdc 介绍三种任务运行方式
使用flink自带的sql客户端,可以便捷无代码部署任务。
例如需要将一张业务mysql表同步至其他存储介质(hive,es,hbase等支持sql-connector组件)
建两张表分别映射源表和目标表,直接提交insert语句即可生成flink-job。
如果本地没有测试环境可以使用docker部署 当前镜像架构为arm64,使用于mac M芯片,windows x86机器需使用官方镜像
docker pull gsw/mysql-cdc:5.7
启动镜像后初始化表环境
CREATE DATABASE mydb;
USE mydb;
--创建源表
CREATE TABLE `orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`order_date` datetime NOT NULL,
`customer_name` varchar(255) NOT NULL,
`price` decimal(10,5) NOT NULL,
`product_id` int(11) NOT NULL,
`order_status` tinyint(1) NOT NULL,
PRIMARY KEY (`order_id`)
);
--创建sink表
CREATE TABLE `orders_sink` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`order_date` datetime NOT NULL,
`customer_name` varchar(255) NOT NULL,
`price` decimal(10,5) NOT NULL,
`product_id` int(11) NOT NULL,
`order_status` tinyint(1) NOT NULL,
PRIMARY KEY (`order_id`)
);
--源表插入测试数据
INSERT INTO mydb.orders (order_id, order_date, customer_name, price, product_id, order_status) VALUES
(10001, '2020-07-30 10:08:22', 'Jark', 50.50000, 102, 0),
(10002, '2020-07-30 10:11:09', 'Sally', 15.00000, 105, 0),
(10003, '2020-07-30 12:00:30', 'Edward', 25.25000, 106, 0),
(10004, '2020-07-30 15:22:00', 'Jark', 29.71000, 106, 1);
sh ./bin/start-cluster.sh
进入bin目录下,启动sql客户端
./sql-client.sh
建立mysql表映射关系
注意mysql字段与flink sql字段的转换关系 data-type-mapping
--源表映射指定mysql-cdc连接,以便获取binlog变更,server-id指定为mysql配置的id
CREATE TABLE `cdc_orders` (
`order_id` int NOT NULL,
`order_date` TIMESTAMP ,
`customer_name` STRING,
`price` decimal(10,5),
`product_id` INT,
`order_status` BOOLEAN,
PRIMARY KEY (`order_id`) NOT ENFORCED
) with (
'connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '3306',
'username' = 'root',
'password' = '123456',
'database-name' = 'mydb',
'table-name' = 'orders',
'server-id' = '1'
);
--sink表映射指定jdbc连接
CREATE TABLE `cdc_orders_sink` (
`order_id` int NOT NULL,
`order_date` TIMESTAMP ,
`customer_name` STRING,
`price` decimal(10,5),
`product_id` INT,
`order_status` BOOLEAN,
PRIMARY KEY (`order_id`) NOT ENFORCED
) with (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC',
'username' = 'root',
'password' = '123456',
'table-name' = 'orders_sink'
);
--提交数据同步任务从orders向orders_sink同步数据
insert into orders_sink select * from orders;
强烈推荐使用docker desktop运行docker环境。MAC机器支持一键安装相关依赖环境,window环境需要在docker桌面版安装完成后手动安装linux内核。
windows安装注意一定要安装WSL2内核,如果不指定版本默认安装的是WSL,当然如果不小心装错了,也可以进行版本转义。具体安装步骤见官方文档windows安装WSL2
docker环境准备完成,就可以参照flink-cdc官方文档体验基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL
源码模式同样依赖docker环境,适合学习的时候debug源码。
同样已MysqlE2elTCase为例。代码实现原理等同于sql-clinet模式。使用代码启动容器并执行相关环境命令。
错误解决方案:
1、mysqlw未设置时区,具体方法自行搜索2、mac M1机器会出现如下错误
需要添加以下依赖
com.github.docker-java
docker-java-api
3.2.8
test
com.github.docker-java
docker-java-transport-zerodep
3.2.8
test
3、arm芯片机器需要更改FlinkContainerTestEnvironment
中mysql版本为8.0,低版本官方镜像不支持arm架构,或者使用其他非官方镜像