MySQL 实时入湖零运维?S3 Tables 两种方案实战

MySQL 实时入湖零运维?S3 Tables 两种方案实战

做数据分析的都知道痛:MySQL 里的业务数据想实时同步到数据湖,Apache Iceberg 是好选择------ACID 事务、Schema Evolution、Time Travel 都支持。但问题来了:小文件合并、快照清理、孤立文件删除这些运维活谁来干?

亚马逊云科技的 Amazon S3 Tables 就是来解决这个问题的------专为 Iceberg 优化的全托管存储,自动帮你做 Compaction、清快照、删孤儿文件。你只管写数据,运维的事它包了。

这篇走两条路线把 MySQL 数据实时搬进 S3 Tables:MSK Connect 方案和 Flink CDC 方案,各有适用场景。

Iceberg 数据湖的运维之痛

先说为什么需要 S3 Tables。用 Iceberg 做数据湖,实时写入场景下这些问题躲不掉:

  1. 小文件爆炸 :高频写入产生大量小文件,查询性能直线下降。得定期跑 Spark 做 rewrite_data_files
  2. 快照堆积 :历史快照越来越多,占存储空间。得写脚本做 expire_snapshots
  3. 孤立文件 :被删除的数据文件残留在存储里。得跑 remove_orphan_files
  4. Manifest 膨胀 :元数据文件越来越大。得做 rewrite_manifests

这四件事每件都需要额外的计算资源和调度系统。折腾半天,你的 Spark 集群一半时间在做运维而不是跑业务。

S3 Tables 怎么解决的

S3 Tables 是亚马逊云科技推出的 Iceberg 专属存储方案,核心卖点:

  • 查询性能提升 3 倍:底层针对 Iceberg 格式做了存储优化
  • 10 万次/秒事务写入:流式场景扛得住
  • 全托管表维护:Compaction 约 3 分钟执行一次,快照清理和孤立文件删除自动搞定
  • REST Catalog 标准接口:任何支持 REST Catalog 的引擎都能直接连

一句话:你把数据写进来,剩下的 S3 Tables 全管了。

方案一:MSK Connect + Iceberg Kafka Connect

适合已有 Amazon MSK 集群的团队,全托管不用管服务器。

架构

scss 复制代码
MySQL → Debezium(binlog捕获) → Amazon MSK → Iceberg Kafka Connect → S3 Tables

核心步骤

1. 创建 S3 Table Bucket

bash 复制代码
aws s3tables create-table-bucket \
  --name iceberg-data-${ACCOUNT_ID} \
  --region us-east-1

2. 创建 Namespace

bash 复制代码
aws s3tables create-namespace \
  --table-bucket-arn "<s3table-bucket-ARN>" \
  --namespace "mydb"

3. 配置 Debezium MySQL Connector

在 MSK Connect 创建 Connector,关键配置:

properties 复制代码
connector.class=io.debezium.connector.mysql.MySqlConnector
tasks.max=1
database.hostname=<mysql-host>
database.port=3306
database.user=<username>
database.password=<password>
topic.prefix=mydb
database.include.list=<database-name>
snapshot.mode=when_needed
# Kafka Topic 自动创建
topic.creation.enable=true
topic.creation.default.replication.factor=3
topic.creation.default.partitions=3

4. 配置 S3 Tables Sink Connector(核心)

这里是和传统 Glue Catalog 不一样的地方------用 REST Catalog + SigV4 签名:

properties 复制代码
connector.class=io.tabular.iceberg.connect.IcebergSinkConnector
tasks.max=2
# S3 Tables REST Catalog
iceberg.catalog.type=rest
iceberg.catalog.uri=https://s3tables.us-east-1.amazonaws.com/iceberg
iceberg.catalog.warehouse=<table-bucket-arn>
iceberg.catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
# SigV4 签名(必须)
iceberg.catalog.rest.sigv4-enabled=true
iceberg.catalog.rest.signing-name=s3tables
iceberg.catalog.rest.signing-region=us-east-1
# 自动建表 + Schema 演进
iceberg.tables.auto-create-enabled=true
iceberg.tables.evolve-schema-enabled=true
# CDC 配置
iceberg.tables.cdc-field=_cdc.op
iceberg.tables.dynamic-enabled=true

MSK Connect 的好处

  • 零基础设施:不用管 Kafka Connect 集群
  • 自动扩缩:根据 CPU 自动调 Worker 数量
  • 断点续传:Worker 挂了自动恢复,offset 不丢
  • 省 70% 运维:比自建 Kafka Connect 集群省事多了

适合需要多表动态路由、复杂 ETL 逻辑的场景。

架构

scss 复制代码
MySQL → Flink CDC(binlog) → Flink SQL → Iceberg Dynamic Sink → S3 Tables

核心代码

1. 配置 Flink SQL Catalog

sql 复制代码
CREATE CATALOG s3tables_catalog WITH (
  'type' = 'iceberg',
  'catalog-impl' = 'org.apache.iceberg.rest.RESTCatalog',
  'uri' = 'https://s3tables.us-east-1.amazonaws.com/iceberg',
  'warehouse' = '<table-bucket-arn>',
  'rest.sigv4-enabled' = 'true',
  'rest.signing-name' = 's3tables',
  'rest.signing-region' = 'us-east-1'
);

2. 定义 MySQL CDC Source

sql 复制代码
CREATE TABLE mysql_source (
  id INT,
  name STRING,
  amount DECIMAL(10,2),
  update_time TIMESTAMP(3),
  PRIMARY KEY (id) NOT ENFORCED
) WITH (
  'connector' = 'mysql-cdc',
  'hostname' = '<mysql-host>',
  'port' = '3306',
  'username' = 'flink_cdc',
  'password' = '<password>',
  'database-name' = 'mydb',
  'table-name' = 'orders'
);

3. 写入 S3 Tables

sql 复制代码
INSERT INTO s3tables_catalog.mydb.orders
SELECT * FROM mysql_source;
  • 多表动态路由:一个 Flink 作业同步多张表,Iceberg 1.10+ Dynamic Sink 自动路由
  • Schema Evolution:源表加字段,目标表自动跟着加
  • 复杂 ETL:可以在同步过程中做数据清洗、转换
  • Exactly-once:配合 Flink Checkpoint 保证精确一次语义

两种方案怎么选

维度 MSK Connect Flink CDC
适用场景 已有 MSK,简单同步 需要 ETL、多表路由
运维成本 全托管,几乎为零 需管理 Flink 集群
灵活性 配置驱动 代码驱动,更灵活
多表支持 支持 支持(Dynamic Sink 更强)
Schema Evolution 支持 支持
学习成本 低(配置即可) 中(需懂 Flink SQL)

我的建议:

  • 团队已有 MSK → 方案一,30 分钟就能跑起来
  • 需要复杂数据处理 → 方案二,Flink 的灵活性值得投入

S3 Tables 自动维护实测

配好数据同步后,S3 Tables 的自动维护是真的香:

  • Compaction:约 3 分钟执行一次,默认合并到 512MB 大文件
  • 快照清理:自动清过期快照
  • 孤立文件删除:自动干掉没人引用的文件

⚠️ 注意:用了 S3 Tables 就不能再手动调 rewrite_data_files 了,维护全交给平台。

查询用 Amazon Athena 或 Amazon EMR 都行:

sql 复制代码
-- Athena 查询 S3 Tables
SELECT * FROM s3tables_catalog.mydb.orders
WHERE update_time > current_timestamp - interval '1' hour;

踩坑记录

  1. REST Catalog URI 别写错 :格式是 https://s3tables.<region>.amazonaws.com/iceberg,少个 /iceberg 就连不上
  2. SigV4 签名必须开signing-names3tables 不是 s3
  3. Iceberg V3 兼容性:S3 Tables 支持 V3,但 Athena 目前(2026-03)还不支持 V3 查询,用 EMR 可以
  4. IAM 权限 :MSK Connect 的执行角色需要 s3tables:*s3:* 权限

亚马逊云科技官博原文:aws.amazon.com/cn/blogs/ch... Amazon S3 Tables 文档:docs.aws.amazon.com/AmazonS3/la... Iceberg Kafka Connect:github.com/databricks/...

相关推荐
tech讯息15 小时前
商业化内容生产适用企业级视频生成模型云平台推荐|从模型生成至审核分发全链路 AWS 选型方案
人工智能·音视频·aws
测试运维日常笔记4 天前
AWS EKS 集群部署与清理手顺
云计算·aws
故乡dee云4 天前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
翼龙云_cloud6 天前
亚马逊云代理商:VPC网络ACL和安全组配置实践 从网络层到实例层的双重防护
运维·网络·安全·云计算·aws
Freed&11 天前
阿里云 OSS 至 AWS S3 跨云迁移实施指南
阿里云·云计算·aws
故乡dee云12 天前
AWS CloudFront 使用教程:CDN 加速功能和网站部署优化
云计算·aws
国际云,接待17 天前
AWS RDS 备份与 PITR 恢复演练:从保留期、恢复命令到应用切换验证
运维·云计算·aws·灾难恢复·数据库备份·rds
国际云,接待19 天前
AWS账单防爆雷实战:Budgets、Cost Anomaly Detection与预算动作联动
人工智能·aws·twitter·finops·云成本·budgets
故乡dee云19 天前
AWS 月度账单怎么看?费用明细、扣款时间和结算规则说明
云计算·aws
xywww16821 天前
Claude Opus 5 API 接入实战:国内项目上线前的网络、Key、限流和排错清单
大数据·linux·网络·数据库·云计算·aws