FlinkCDC实时同步MySQL到ClickHouse

Flink CDC 捕获 MySQL 变更同步至 ClickHouse

环境准备

确保已部署以下组件:

  • Apache Flink(版本建议 1.13+)
  • Flink CDC Connectors(如 flink-connector-mysql-cdcflink-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 作为缓冲层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值