保姆级教程:Apache Flink CDC(standalone 模式)部署 MySQL CDC、PostgreSQL CDC 及使用方法

环境准备

|----------------------------------|------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 软件 | 版本 | 备注 |
| 操作系统 | centos7.9 | 一台 |
| flink | 1.18.1 | https://www.apache.org/dyn/closer.lua/flink/flink-1.18.1/flink-1.18.1-bin-scala_2.12.tgz |
| flink-cdc | 3.2.0 | https://github.com/apache/flink-cdc/releases |
| flink-connector-jdbc | 3.2.0-1.18 | https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc/3.2.0-1.18/ |
| flink-sql-connector-postgres-cdc | 3.2.0 | https://github.com/apache/flink-cdc/releases |
| flink-sql-connector-mysql-cdc | 3.2.0 | https://github.com/apache/flink-cdc/releases |
| mysql jdbc驱动 | 8.0.28 | https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.28 |
| postgresql jdbc驱动 | 42.6.0 | https://mvnrepository.com/artifact/org.postgresql/postgresql |
| mysql | 5+ | / |
| java | 1.8.0_421 | / |
| postgresql | 15+ | / |

1、安装包部署

1、mysql、pg自行安装(mysql -->pg)

安装完成后查看mysql是否开启binlog(数据库连接工具自行准备,我这里用的dbeaver)

复制代码
show variables like '%log_bin%';

如图,如果为OFF,则需要编辑my.cnf配置文件

编辑my.cnf配置文件(可以输入whereis my.cnf查询文件位置)

bash 复制代码
whereis my.cnf

vim /etc/my.cnf

增加下面内容

java 复制代码
server_id = 1
binlog_format = ROW
log-bin = mysql_log_bin

重启mysql,再次查看mysql是否开启 binlog

bash 复制代码
service mysql restart

2、部署flink环境以及cdc驱动包

官网下载flink安装包。(链接见上面环境准备)

下载flink-cdc所需的驱动jar包。(链接见上面环境准备)

放入linux环境中并解压缩

bash 复制代码
tar -zxvf flink-1.18.1-bin-scala_2.12.tgz

进入flink的lib目录上传四个依赖

bash 复制代码
cd flink-1.18.1/lib/

如图

修改flink配置文件

bash 复制代码
vim flink-1.18.1/conf/flink-conf.yaml

如图

进入到flink-1.18.1目录下执行

bash 复制代码
./bin/start-cluster.sh

如果没有防火墙可访问 ip:8081 (默认是8081端口 可在配置文件里修改)

创建mysql库和表,再库中添加几条数据

sql 复制代码
create database wjx;

use wjx

CREATE TABLE players (
	player_id INT NOT NULL AUTO_INCREMENT,
	team_id INT,
	player_name VARCHAR(255),
	height FLOAT(53),
	PRIMARY KEY (player_id)
);

insert into players (player_id,team_id,player_name,height) values 
(1001,1001,'韦德','1.93'),
(1002,1002,'雷吉','1.91'),
(1003,1003,'安德烈','2.11'),
(1004,1004,'索恩','2.16'),
(1005,1005,'兰斯顿','1.88'),
(1006,1006,'格伦','1.98'),
(1007,1007,'伊斯梅尔','1.83'),
(1008,1008,'扎扎','2.11'),
(1009,1009,'乔恩','2.08');
 
select * from players;

如图

在pg库中创建一个数据库,不插入数据

sql 复制代码
create database wjx;

\c wjx

CREATE TABLE players3 (
	player_id INT NOT NULL,
	team_id INT,
	player_name VARCHAR(255),
	height FLOAT(53),
	PRIMARY KEY (player_id)
);

进入到flink-1.18.1目录下,启动flink-sql

bash 复制代码
./bin/sql-client.sh embedded

创建flink-sql源表

sql 复制代码
CREATE TABLE nbaplayers (
	player_id INT,
	team_id INT,
	player_name VARCHAR,
	height FLOAT,
	PRIMARY KEY (player_id) NOT ENFORCED
) WITH (
	'connector' = 'mysql-cdc',
	'hostname' = '10.16.16.164',
	'port' = '3306',
	'username' = 'admin',
	'password' = '******',
	'database-name' = 'wjx',
	'table-name' = 'players',
	'server-time-zone' = 'Asia/Shanghai'
);

查看表

sql 复制代码
select * from nbaplayers;

创建flink-sql结果表

sql 复制代码
CREATE TABLE nba (
	player_id INT,
	team_id INT,
	player_name VARCHAR,
	height NUMERIC(3,2),
PRIMARY KEY (player_id) NOT ENFORCED
) WITH (
	'connector' = 'jdbc',
	'url' = 'jdbc:postgresql://10.16.16.164:1921/wjx??currentSchema=public&reWriteBatchedInserts=true',
	'username' = 'admin',
	'password' = '******',
	'table-name' = 'players3'
);

执行从源表插入表操作,生成同步作业

sql 复制代码
INSERT INTO nba
SELECT
player_id,
team_id,
player_name,
height
FROM nbaplayers;

测试一下是否同步

mysql执行

sql 复制代码
insert into players (player_id,team_id,player_name,height) values (9999,9999,'wjx','1.85');

mysql端

pg端:

2、源码部署

附:pg同步pg

1、安装pg(略)并配置wal日志

sql 复制代码
SHOW wal_level;

编辑配置文件postgresql.conf

sql 复制代码
# 找到对应配置并进行修改
# 更改wal日志方式为logical(方式有:minimal、replica 、logical  )
wal_level = logical  

# 更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots
max_replication_slots = 20

# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 20     

# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s,0表示禁用)
wal_sender_timeout = 180s

发布表并更改表的标识

sql 复制代码
# 发布表
-- 设置发布为true
update pg_publication set puballtables=true where pubname is not null;

-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;

-- 查询哪些表已经发布
select * from pg_publication_tables;

# 更改表的标识

-- 更改复制标识包含更新和删除之前值(目的是为了确保表 t_user 在实时同步过程中能够正确地捕获并同步更新和删除的数据变化。如果不执行这两条语句,那么 t_user 表的复制标识可能默认为 NOTHING,这可能导致实时同步时丢失更新和删除的数据行信息,从而影响同步的准确性)
ALTER TABLE players REPLICA IDENTITY FULL;

-- 查看复制标识(为f标识说明设置成功,f(表示 full),否则为 n(表示 nothing),即复制标识未设置)
select relreplident from pg_class where relname='players';

2、部署flink环境以及cdc驱动包

第二步配置flink环境与上面方法相同,略。

sql 复制代码
-- 源表
-- 创建数据库 wjx
CREATE DATABASE wjx;

-- 连接到新创建的数据库 wjx
\c wjx

-- 创建 players 表
CREATE TABLE public.players (
	player_id int4 NOT NULL,
	team_id int4 NULL,
	player_name varchar(255) NULL,
	height float8 NULL,
	CONSTRAINT players_pkey PRIMARY KEY (player_id)
);

-- 目标端表相同
sql 复制代码
CREATE TABLE table_source_pg (
	player_id INT,
	team_id INT,
	player_name VARCHAR,
	height NUMERIC(3,2),
	PRIMARY KEY(player_id) NOT ENFORCED
) WITH (
	'connector' = 'postgres-cdc',
	'hostname' = '10.16.16.164',
	'port' = '1921',
	'username' = 'dbadmin',
	'password' = '123456',
	'database-name' = 'wjx',
	'schema-name' = 'public',
	'table-name' = 'players',
	'slot.name' = 'flink',
  'decoding.plugin.name' = 'pgoutput'
);


CREATE TABLE table_sink_pg (
	player_id INT,
	team_id INT,
	player_name VARCHAR,
	height NUMERIC(3,2),
	PRIMARY KEY(player_id) NOT ENFORCED
) WITH (
	'connector' = 'jdbc',
	'url' = 'jdbc:postgresql://10.16.16.164:1922/wjx??currentSchema=public&reWriteBatchedInserts=true',
	'username' = 'dbadmin',
	'password' = '123456',
	'table-name' = 'players'
);

-- insert语句
INSERT INTO table_sink_pg
SELECT
player_id,
team_id,
player_name,
height
FROM table_source_pg;

可能用到的pg命令汇总

sql 复制代码
-- pg新建用户
CREATE USER test1 WITH PASSWORD 'test123';

-- 给用户复制流权限
ALTER ROLE ODPS_ETL replication;

-- 给用户数据库权限
GRANT CONNECT ON DATABASE test_db to test1;

-- 设置发布开关
update pg_publication set puballtables=true where pubname is not null;

-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;

-- 查询哪些表已经发布
select * from pg_publication_tables;

-- 给表查询权限
grant select on TABLE aa to ODPS_ETL;

-- 给用户读写权限
grant select,insert,update,delete ON  ALL TABLES IN SCHEMA public to bd_test;

-- 把当前库所有表查询权限赋给用户
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ODPS_ETL;

-- 把当前库以后新建的表查询权限赋给用户
alter default privileges in schema public grant select on tables to ODPS_ETL;

-- 更改复制标识包含更新和删除之前值
ALTER TABLE test0425 REPLICA IDENTITY FULL;

-- 查看复制标识
select relreplident from pg_class where relname='test0425';

-- 查看solt使用情况
SELECT * FROM pg_replication_slots;

-- 删除solt
SELECT pg_drop_replication_slot('zd_org_goods_solt');

-- 查询用户当前连接数
select usename, count(*) from pg_stat_activity group by usename order by count(*) desc;

-- 设置用户最大连接数
alter role odps_etl connection limit 200;
相关推荐
AI实战架构笔记1 小时前
大数据预测分析在房地产行业的市场动态监测
大数据·ai
追随者永远是胜利者1 小时前
(LeetCode-Hot100)49. 字母异位词分组
java·算法·leetcode·职场和发展·go
吴声子夜歌1 小时前
RxJava——Flowable与背压
android·java·rxjava
Thanwind1 小时前
大二上结束随笔
java
实时数据2 小时前
DPI深度数据包检测 监测用户浏览搜索行为 分析在线活动 频繁访问的购物网站或搜索的关键词 等判断其消费偏好
大数据·安全·big data
我是大猴子2 小时前
Java面经
java·开发语言
IT枫斗者2 小时前
MyBatis批量插入性能优化:从5分钟到3秒的工程化实践
前端·vue.js·mysql·mongodb·性能优化·mybatis
Coder_Boy_2 小时前
Java高级_资深_架构岗 核心知识点全解析(模块四:分布式)
java·spring boot·分布式·微服务·设计模式·架构
百锦再2 小时前
Java ForkJoin 框架全面解析:分而治之的并行编程艺术
java·开发语言·spring boot·spring cloud·kafka·tomcat·maven