从Confluent Platform (Docker)开始,我进行了以下设置:
MySQL DB ----------> Debezium MySQL Source Connector --> Kafka (topic: X)
Kafka (topic: X) --> Confluent JDBC Sink Connector ----> Postgres DB
(我将docker-compose文件中的键和值转换器更改为Avro。)
我正在Confluent Schema Registry的帮助下测试架构的演变。我正在执行的步骤:
首先更新接收器数据库:将新列abc
添加到Postgres DB表X:alter table X add column abc int;
测试管道。好吧。
更新X的架构:在控制中心http:// localhost:9021 /上,添加默认值为abc
的{{1}}类型的可选字段int
。现在,主题X具有2个架构版本。我保留了默认的向后兼容性。
再次测试管道。好吧。
更新源数据库:将新列null
添加到MySQL数据库表X:abc
通过更新源表的记录来测试管道。我在Kafka Connect服务日志中看到堆栈跟踪。不好。
alter table X add column abc int;
我已经在Confluent Control Center上再次检查了[2020-08-11 05:58:45,014] INFO Unable to find fields
[SinkRecordField{schema=Schema{INT32}, name='abc', isPrimaryKey=false}]
among column names [... list of columns ...] (io.confluent.connect.jdbc.sink.DbStructure)
[2020-08-11 05:58:45,017] ERROR WorkerSinkTask{id=test-sink-0}
Task threw an uncaught and unrecoverable exception.
Task is being killed and will not recover until manually restarted.
Error: Table "X" is missing fields
([SinkRecordField{schema=Schema{INT32}, name='abc', isPrimaryKey=false}])
and auto-evolution is disabled (org.apache.kafka.connect.runtime.WorkerSinkTask)
的架构,现在有3个版本。版本2和版本3相同。更新源表后,新消息是否创建了新的相同架构版本?
关于自动进化的错误消息,我的理解是我们应该保持禁用状态,因为我们将依赖Schema Registry来控制进化。
能否请您帮助我理解为何即使在更新架构后Confluent JDBC连接器也无法找到新字段?我在这里想念什么?