使用Apache Flink CDC实现MySQL到StarRocks的实时数据同步
前言
在现代数据架构中,实时数据同步已成为企业数据集成的重要需求。本文将详细介绍如何使用Apache Flink CDC(Change Data Capture)技术,构建从MySQL到StarRocks的实时数据同步管道。这种方案特别适合需要实时分析MySQL数据的场景,能够实现秒级延迟的数据同步。
环境准备
基础环境要求
- 操作系统:Linux或MacOS系统
- Docker环境:用于快速部署MySQL和StarRocks服务
- Flink集群:需要准备Flink 1.18.0版本
Flink集群配置
-
下载并解压Flink 1.18.0发行版
-
修改
conf/flink-conf.yaml
配置文件,增加检查点配置:execution.checkpointing.interval: 3000
这表示每3秒执行一次检查点,确保数据一致性
-
启动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容器并初始化测试数据:
-- 创建数据库
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`)
);
-- 创建产品表
CREATE TABLE `products` (
`id` INT NOT NULL,
`product` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
Flink CDC任务配置
组件准备
- 下载Flink CDC 3.1.0二进制包并解压
- 下载并放置必要的连接器JAR包:
- MySQL CDC连接器
- StarRocks连接器
- MySQL JDBC驱动
任务配置文件
创建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下的所有表replication_num: 1
:由于测试环境只有单节点,设置副本数为1
任务提交
使用Flink CDC CLI提交任务:
bash bin/flink-cdc.sh mysql-to-starrocks.yaml
提交成功后,可以在Flink Web UI中看到运行中的任务。
数据同步验证
初始数据同步
任务启动后,app_db数据库下的所有表结构和数据都会被同步到StarRocks中。可以通过StarRocks的查询接口验证数据是否完整同步。
实时变更测试
-
数据插入:
INSERT INTO app_db.orders (id, price) VALUES (3, 100.00);
-
表结构变更:
ALTER TABLE app_db.orders ADD amount varchar(100) NULL;
-
数据更新:
UPDATE app_db.orders SET price=100.00, amount=100.00 WHERE id=1;
-
数据删除:
DELETE FROM app_db.orders WHERE id=2;
每次操作后,StarRocks中的数据都会实时更新,验证同步管道的实时性。
高级功能:数据路由
Flink CDC支持灵活的数据路由配置,可以实现表名映射、分库分表合并等功能:
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单表中。
环境清理
完成测试后,按顺序执行以下清理操作:
-
停止Docker容器:
docker-compose down
-
停止Flink集群:
./bin/stop-cluster.sh
总结
通过本文的实践,我们完成了从MySQL到StarRocks的实时数据同步管道搭建。这种方案具有以下优势:
- 实时性:秒级数据延迟,满足实时分析需求
- 完整性:支持全量+增量的一体化同步
- 灵活性:支持表结构变更的自动同步
- 扩展性:支持分库分表合并等复杂场景
对于企业级应用,可以考虑增加监控、告警等机制,确保同步管道的稳定运行。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考