问题描述:
AWS DMS是一个popular的数据库迁移工具,可以选择Amazon托管的MSK或者自建Kafka作为目标端。
当我们测试过程中,如果CDC阶段Fail并遇到如下报错,应该如何解决呢?
00333879: 2024-06-29T02:09:21 [DMS_INTERNAL ]W: Payload size exceeds Kafka limit. Skip record: [partiton key] xxxxx.qqqqqqq_1_06 (kafka_records.c:106)
00333879: 2024-06-29T02:09:21 [TARGET_APPLY ]W: Payload size exceeds Kafka limit. Skip this record. (kafka_records.c:107)
00333879: 2024-06-29T02:09:21 [TARGET_APPLY ]E: Unable to send the message to the broker [1026800] (stream_record_utils.c:980)
00333879: 2024-06-29T02:09:21 [DMS_INTERNAL ]E: Failed sending record for table xxxxxx.qqqqqq_1_06 with partition key: xxxxx.qqqqq_1_06 operation: update [1026800] (stream_record_utils.c:980)
分析过程:
1. 首先,从日志来看,这个报错在[TARGET_APPLY]阶段出现。[TARGET_APPLY]意味着在这个迁移任务的CDC阶段,目标端出现报错[1].
因此,哪怕不看报错信息,我们也能够知道,报错是出现在目标端Kafka端的。
2. 再看日志中的报错信息:“Payload size exceeds Kafka limit”的原因是kafka生产者,也就是DMS发送的信息大小超过了 Kafka 所允许的最大限制。Kafka 默认的消息大小限制是 1MB,但是这个值可以根据需要调整。
这个问题通常发生在处理大型文档或者包含大量数据的记录时,尤其是当从像 DocumentDB 这样的 NoSQL 数据库迁移数据时,因为 NoSQL 数据库往往存储较大的文档。
解决方案:
此时我们不考虑优化DocumentDB数据模型,也不考虑用第三方工具,那么可以通过如下参数更改来进行排查:
-
在 Kafka 的服务器配置文件 (
server.properties
) 中,可以增加message.max.bytes
参数的值来提高消息大小的限制。例如,将其设置为 10MB:message.max.bytes=10485760
- 通过如下command调整Kafka topic参数:
-- 调整迁移的target topic的参数(2M):
bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name <my-topic> --alter --add-config max.message.bytes= 20000000
-- 查询调整后的configuration
kafka-configs.sh --bootstrap-server xxxxxxxx:9092 --entity-type topics --entity-name topicname --describe
- 在DMS Console上,Modify DMS target endpoint,更改Endpoint settings,添加如下[2]:
参考文档:
[1]https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.Logging.html
[2] 使用 Apache Kafka 作为目标 Amazon Database Migration Service - Amazon 数据库迁移服务