使用Flink CDC实现MySQL到StarRocks的实时数据同步
前言
在现代数据架构中,实时数据同步已成为企业数据集成和分析的关键需求。本文将详细介绍如何使用Flink CDC Connectors实现从MySQL到StarRocks的实时数据同步,包括全库同步、Schema变更同步以及分库分表合并等核心功能。
技术背景
Flink CDC Connectors是基于Apache Flink构建的变更数据捕获(CDC)解决方案,能够高效捕获数据库变更并实时同步到下游系统。StarRocks作为新一代MPP分析型数据库,与Flink CDC的结合能够实现从业务数据库到分析系统的实时数据管道。
环境准备
基础环境要求
- 操作系统:Linux或MacOS
- 已安装Docker环境
- 网络通畅,能够下载所需组件
Flink集群部署
- 下载Flink 1.18.0版本并解压
- 配置检查点间隔为3秒(在flink-conf.yaml中添加):
execution.checkpointing.interval: 3000
- 启动Flink集群:
./bin/start-cluster.sh
启动成功后,可通过8081端口访问Flink Web UI监控作业状态。
容器化服务部署
使用docker-compose部署MySQL和StarRocks服务:
version: '2.1'
services:
StarRocks:
image: starrocks/allin1-ubuntu:3.2.6
ports:
- "8080:8080"
- "9030:9030"
MySQL:
image: debezium/example-mysql:1.1
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqlpw
启动命令:
docker-compose up -d
初始化MySQL数据
进入MySQL容器并执行以下SQL初始化测试数据:
CREATE DATABASE app_db;
USE app_db;
CREATE TABLE `orders` (
`id` INT NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `orders` VALUES (1, 4.00),(2, 100.00);
CREATE TABLE `shipments` (
`id` INT NOT NULL,
`city` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `shipments` VALUES (1, 'beijing'),(2, 'xian');
CREATE TABLE `products` (
`id` INT NOT NULL,
`product` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `products` VALUES (1, 'Beer'),(2, 'Cap'),(3, 'Peanut');
同步作业配置与执行
组件准备
- 下载Flink CDC 3.0.0二进制包并解压
- 下载并放置以下Connector到lib目录:
- MySQL pipeline connector
- StarRocks pipeline connector
- MySQL Connector Java驱动
同步配置示例
创建mysql-to-starrocks.yaml配置文件:
source:
type: mysql
hostname: localhost
port: 3306
username: root
password: 123456
tables: app_db.\.*
server-id: 5400-5404
server-time-zone: UTC
sink:
type: starrocks
jdbc-url: jdbc:mysql://127.0.0.1:9030
load-url: 127.0.0.1:8080
username: root
password: ""
table.create.properties.replication_num: 1
pipeline:
name: Sync MySQL Database to StarRocks
parallelism: 2
关键配置说明:
tables: app_db.\.*
使用正则匹配同步app_db下所有表table.create.properties.replication_num
设置StarRocks副本数为1(单节点环境)
提交同步作业
执行以下命令提交作业:
bash bin/flink-cdc.sh mysql-to-starrocks.yaml --jar lib/mysql-connector-java-8.0.27.jar
成功提交后,可在Flink Web UI看到名为"Sync MySQL Database to StarRocks"的作业。
高级功能演示
Schema变更同步
Flink CDC能够实时同步源表的Schema变更,包括:
- 新增列:
ALTER TABLE app_db.orders ADD amount varchar(100) NULL;
- 修改列类型
- 删除列等操作
数据变更同步
支持完整的CRUD操作同步:
- INSERT:新增记录
- UPDATE:更新记录
- DELETE:删除记录
路由与表名映射
通过route配置可实现复杂的表映射关系:
route:
- source-table: app_db.orders
sink-table: ods_db.ods_orders
- source-table: app_db.shipments
sink-table: ods_db.ods_shipments
分库分表合并
使用正则表达式实现分表合并:
route:
- source-table: app_db.order\.*
sink-table: ods_db.ods_orders
此配置可将app_db.order01、app_db.order02等分表数据合并同步到ods_db.ods_orders。
注意事项
- 当前版本不支持多分表间存在相同主键数据的场景
- 生产环境建议配置更高的并行度和检查点间隔
- StarRocks集群建议配置多个BE节点以提高可靠性
环境清理
完成测试后,执行以下命令清理环境:
# 停止容器服务
docker-compose down
# 停止Flink集群
./bin/stop-cluster.sh
总结
通过本文的实践,我们实现了从MySQL到StarRocks的实时数据同步管道,展示了Flink CDC在实时数据集成中的强大能力。这种方案特别适合需要实时数据分析的业务场景,能够显著缩短数据从产生到分析的延迟,为企业决策提供更及时的数据支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考