1. 为什么选择Flink CDC实现MySQL到ClickHouse同步
在数据仓库和实时分析场景中,MySQL到ClickHouse的数据同步是个经典需求。传统方案如DataX、Kettle等批处理工具已无法满足实时性要求,而Flink CDC(Change Data Capture)凭借其流式处理能力和Exactly-Once语义成为当前最优解。
Flink 1.20版本对CDC连接器做了重要增强:
- 新增Schema Evolution支持(自动适应源表结构变更)
- 并行度动态调整优化(大表同步效率提升40%+)
- Checkpoint容错机制强化(断点续传更可靠)
我曾为某电商平台实施过300+表的实时同步,实测Flink CDC相比Canal+Kafka方案:
- 端到端延迟从分钟级降至秒级
- 资源消耗减少60%(无需维护Kafka中间件)
- 运维复杂度直线下降(纯SQL配置)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与组件选型
2.1 基础软件版本要求
- Flink: 1.20.0+(必须包含flink-connector-jdbc和flink-connector-mysql-cdc)
- MySQL: 5.7+/8.0(需开启binlog且为ROW模式)
- ClickHouse: 22.3+(推荐使用ReplacingMergeTree引擎)
关键配置:MySQL的my.cnf中必须设置
properties复制log_bin=mysql-bin binlog_format=ROW binlog_row_image=FULL
2.2 集群资源规划建议
根据表数量和QPS,推荐以下配置:
- 10-50表:2个TaskManager(4CPU/8GB)
- 50-100表:4个TaskManager(8CPU/16GB)
- 100+表:需按表体积细分(大表单独分配并行度)
3. 零代码配置实战步骤
3.1 单表同步基础模板
sql复制CREATE TABLE mysql_source (
id INT,
name STRING,
update_time TIMESTAMP(3),
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'mysql-host',
'port' = '3306',
'username' = 'user',
'password' = 'pass',
'database-name' = 'db',
'table-name' = 'table1'
);
CREATE TABLE ck_sink (
id INT,
name STRING,
update_time DateTime
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:clickhouse://ck-server:8123/db',
'table-name' = 'table1',
'username' = 'default',
'password' = '',
'sink.buffer-flush.interval' = '1s'
);
INSERT INTO ck_sink SELECT * FROM mysql_source;
3.2 百表批量同步方案
通过SQL文件动态加载实现(保存为tables.sql):
sql复制-- 表1
CREATE TABLE mysql_source_1 (...) WITH (...);
CREATE TABLE ck_sink_1 (...) WITH (...);
INSERT INTO ck_sink_1 SELECT * FROM mysql_source_1;
-- 表2
CREATE TABLE mysql_source_2 (...) WITH (...);
-- 其余表结构类似...
执行命令:
bash复制#!/bin/bash
for i in {1..100}; do
sed "s/table1/table${i}/g" template.sql > table${i}.sql
flink run -d -sql file://table${i}.sql
done
4. 高级优化与避坑指南
4.1 性能调优三要素
- 并行度设置:
sql复制SET 'parallelism.default' = '8'; -- 根据CPU核心数调整 - Checkpoint间隔:
sql复制SET 'execution.checkpointing.interval' = '30s'; -- 频繁checkpoint影响吞吐 - 批量提交:
sql复制SET 'jdbc.sink.batch-size' = '500'; -- ClickHouse建议200-1000
4.2 常见故障排查
问题1:同步延迟越来越高
- 检查网络带宽(特别是跨境场景)
- 调整
server-id避免冲突(每个Flink作业需唯一)
问题2:DDL变更导致同步中断
- 开启
'scan.incremental.snapshot.chunk.key-column' = 'id' - 添加
'debezium.schema.history.internal'配置
问题3:ClickHouse写入瓶颈
- 改用
Distributed表引擎 - 增加
sink.buffer-flush.max-rows值
5. 监控与运维实践
5.1 关键监控指标
- 源表消费延迟:
source.numRecordsInPerSecond - 写入吞吐量:
sink.numRecordsOutPerSecond - Checkpoint耗时:
lastCheckpointDuration
通过Prometheus配置示例:
yaml复制metrics.reporters: prom
metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
metrics.reporter.prom.port: 9250-9260
5.2 自动化运维脚本
python复制# 自动重启失败任务
import requests
from pyflink.datastream import StreamExecutionEnvironment
env = StreamExecutionEnvironment.get_execution_environment()
jobs = requests.get("http://flink-jobmanager:8081/jobs").json()
for job in jobs["jobs"]:
if job["status"] == "FAILED":
env.execute_sql(f"INSERT INTO {job['name']} SELECT * FROM {job['source']}")
这套方案在某物流系统实现日均20亿数据的稳定同步,最关键的收获是:一定要给每张表设置合理的primary key,这对CDC的增量识别效率有决定性影响。另外建议在ClickHouse端增加物化视图,同步同时直接预聚合关键指标。
