Flink CDC 捕获 MySQL 变更同步至 ClickHouse
环境准备
确保已部署以下组件:
- Apache Flink(版本建议 1.13+)
- Flink CDC Connectors(如
flink-connector-mysql-cdc
和flink-connector-clickhouse
) - MySQL(开启 binlog)
- ClickHouse(配置允许外部连接)
MySQL 配置
在 MySQL 中启用 binlog 并配置相关参数:
[mysqld]
server_id=1
log_bin=mysql-bin
binlog_format=ROW
binlog_row_image=FULL
依赖引入
在 Flink 项目中添加 Maven 依赖:
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>
创建 Flink CDC 源表
使用 Flink SQL 定义 MySQL 源表:
CREATE TABLE mysql_source (
id INT,
name STRING,
description STRING,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'mysql_host',
'port' = '3306',
'username' = 'user',
'password' = 'password',
'database-name' = 'test_db',
'table-name' = 'source_table'
);
创建 ClickHouse 目标表
在 ClickHouse 中创建目标表:
CREATE TABLE ck_target (
id Int32,
name String,
description String
) ENGINE = MergeTree()
ORDER BY id;
定义 Flink Sink 表
使用 JDBC 连接器定义 ClickHouse 目标表:
CREATE TABLE clickhouse_sink (
id INT,
name STRING,
description STRING
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:clickhouse://clickhouse_host:8123/default',
'table-name' = 'ck_target',
'username' = 'default',
'password' = ''
);
启动同步任务
执行 Flink SQL 插入语句:
INSERT INTO clickhouse_sink
SELECT * FROM mysql_source;
任务提交
打包 Flink 作业并提交至集群:
flink run -c com.example.MainJob target/your-job.jar
监控与优化
- 通过 Flink UI 监控作业状态
- 调整并行度参数
parallelism.default
提升性能 - 在 ClickHouse 配置中调整
max_insert_block_size
控制批量写入大小
异常处理
- 在 Flink 配置中设置
restart-strategy
实现自动恢复 - 对 ClickHouse 连接配置
socket_timeout
避免超时中断 - 启用 Flink Checkpoint 保证 Exactly-Once 语义
数据一致性验证
通过比对 MySQL 和 ClickHouse 的计数统计验证同步完整性:
-- MySQL
SELECT COUNT(*) FROM source_table;
-- ClickHouse
SELECT COUNT(*) FROM ck_target;
性能调优建议
- 在 ClickHouse 端启用
async_insert
提升写入吞吐 - 调整 Flink 的
checkpoint.interval
平衡性能与可靠性 - 在资源允许的情况下增加 Kafka 作为缓冲层