合纵连横 – 以 Amazon Flink 和 Amazon MSK 构建 Amazon DocumentDB 之间的实时数据同步

合纵连横 – 以 Amazon Flink 和 Amazon MSK 构建 Amazon DocumentDB 之间的实时数据同步

💡 原文中文,约12700字,阅读约需31分钟。
📝

内容提要

在大数据时代,实时数据同步应用广泛,包括在线数据库构建实时数据仓库和跨区域数据复制。Amazon Web Services提供了多种数据同步方式,包括Amazon Zero-ETL、AWS Database Migration Service(DMS)和Flink + Kafka。选择合适的方案需要考虑数据源和目标的支持、架构稳定性、数据转换能力、实时性、复杂度和成本等因素。此外,还介绍了如何通过EMR Flink和Kafka构建跨区域DocumentDB之间的实时数据同步。方案可以实现高可用性和性能优化。

🔎

延伸解读

方案选型:从业务需求出发

文章对比了 Amazon Zero-ETL、DMS 和 Flink+Kafka 三种数据同步方案。Zero-ETL 操作简单、成本低,但仅支持特定数据源和目标,且无法在同步过程中转换数据;DMS 支持广泛的数据源,配置相对简单,适合跨区域复制;Flink+Kafka 灵活性最高,支持复杂数据转换,但架构复杂、成本最高。读者应根据自身的数据源支持、运维能力、实时性要求和预算进行权衡。

跨区域同步的挑战与应对

对于中国与海外之间的 DocumentDB 同步,Amazon 原生服务存在区域限制,因此文章推荐使用 DMS 或 Flink 方案。DMS 配置简单,但在高写入压力下可能延迟增加;Flink 方案通过 Kafka 解耦,能提供更高的处理能力。实施时需注意网络连通性(如专线或 SD-WAN),且 DocumentDB 仅支持内网访问,需确保网络架构满足要求。

Flink 方案的关键配置与限制

使用 Flink 实现 DocumentDB 同步时,需注意:Flink CDC MongoDB Connector 对 SSL 支持不足,需禁用 DocumentDB SSL;DocumentDB 分片模式不支持 Change Stream,必须选择实例模式。此外,Flink SQL 不支持 MongoDB 的 JSON 对象类型,需以 STRING 替代。Kafka Connector 应选择 debezium-json 格式,以便下游处理 Upsert 数据。

性能优化与高可用实践

性能测试表明,单分区时目标端写入约 600 条/秒,通过增加 Kafka 分区数(如 4 个)并设置 Flink 并行度与分区数一致,可提升至约 1400 条/秒。多分区下需注意消息顺序,可借助 Flink watermark 机制保证有序写入。高可用方面,EMR 主节点应使用高可用配置,Flink 需设置 Checkpoint(如存储于 S3),并配置 ZooKeeper 高可用,以确保任务失败后能自动恢复。

❓

Q&A

AWS 上实现实时数据同步有哪些方案可选?

主要有三种:Amazon Zero-ETL、AWS Database Migration Service(DMS)以及 Flink + Kafka。此外还有 Debezium、Canal 等开源方案。

Amazon Zero-ETL、DMS 和 Flink 三种方案在数据转换能力和复杂度上有什么区别?

数据转换能力:Zero-ETL 低(源和目标数据一致,不能转换或实时 JOIN),DMS 中(仅支持小部分数据类型和列过滤),Flink 高(实时聚合查询等能力丰富)。复杂度:Zero-ETL 最低(只需在数据库 Integration 功能创建管道),DMS 中等(需创建复制实例、设置源和目标、优化任务参数),Flink 最高(需创建 EMR 和 MSK Kafka,运行多个 Flink 任务,复杂转换还需编写程序)。

如何根据业务需求选择合适的数据同步方案?

运维力量薄弱且数据源和目标都支持时,选 Amazon Zero-ETL;数据源和目标不在 Zero-ETL 支持范围,或需要中国与海外跨区域复制且不想构建复杂管道时,选 DMS;有较强运维和开发能力、需要高性能和数据转换能力时,选 Flink。

用 Flink 和 Kafka 实现跨区域 DocumentDB 实时同步的整体架构是怎样的?

首先打通中国到海外的网络(如专线或 SD-WAN)。源和目标都是 DocumentDB,中间使用 EMR Flink:以 Flink MongoDB CDC Connector 拉取源 DocumentDB 数据,通过 Kafka connector 打入 MSK Kafka 消息队列;下游 EMR Flink 拉取 Kafka 消息,再通过 MongoDB connector 写入目标 DocumentDB。MSK Kafka 起到解耦作用,避免上下游速度不一致。EMR 可用两个单独集群,单集群性能足够时也可只用一个。

在 Flink 同步方案中,Kafka Connector 和 Upsert Kafka Connector 有什么区别?

Kafka Connector 从 Kafka topic 消费和写入数据,使用 CDC 格式(如 debezium、canal、maxwell)将变更事件解析为 Flink SQL 的 INSERT、UPDATE、DELETE 消息,下游可以处理 Upsert 数据。Upsert Kafka Connector 作为 sink 消费 changelog 流,将 INSERT/UPDATE_AFTER 作为正常消息写入,DELETE 以 value 为空的 Kafka 消息写入,但删除操作产生的 null 消息下游无法处理。本方案使用 Kafka Connector 加 debezium json 格式。

该方案在性能方面有哪些实测结果和优化建议?

实测源端批量写入约 1 万条/秒,目标端默认写入约 600 条/秒;将 Kafka 分区数提高到 4 后,目标端可达约 1400 条/秒。优化建议:EMR 主节点使用高可用配置;设置 Flink Checkpoint 以恢复失败任务(可用 HDFS 或 S3,后续可考虑 S3 Express One Zone);源业务量低(几百 QPS)时 Kafka 单分区即可,业务量高时使用多分区并结合 Flink watermark 保证有序写入;Flink 任务并行度最好与 Kafka 分区数一致,并保证足够 slot;同时监控源和目标数据库、EMR Flink/MSK Kafka 的性能指标及 Kafka 消息处理进度。

使用 Flink MongoDB CDC Connector 同步 DocumentDB 时有哪些限制?

Flink MongoDB CDC Connector 对 SSL 支持不足,方案中需禁用 DocumentDB SSL;DocumentDB 分片模式不支持 Change Stream,无法读取 CDC 变化数据,因此必须选择实例模式;此外该 connector 目前还不支持 DDL 操作(如 drop()),执行 DDL 会导致 Flink 任务失败。

🏷️

标签

➡️

继续阅读