用于同步数据库表的Apache Kafka Connect / Streams API

时间:2017-09-11 08:47:44

标签: java-8 apache-kafka-streams apache-kafka-connect

我正在阅读有关Connect API的Kafka文档,并尝试将其与我的问题域相关联。我有多个数据库,它们具有我需要在任何更新/插入/删除时同步的公共表。这是一个例子:

1)有人更新表" order_history"在DB1中 - 我希望将更新传递给DB2 / DB3等。

2)有人将记录插入" purchase_order" - 我希望将插入内容传递给DB2 / DB3等,以便在DB2 / DB3等中发生相同的插入。

3)表格将在所有数据库中 - 因此没有丢失表格问题。

这些只能在一组特定的表上完成,而不是整个数据库。我从Connect API文档中了解到,我需要提供以下内容:

1)Source Connector导入数据 - 从SQL / File系统到Kafka主题

2)Sink Connector导出数据 - 从kafka主题到SQL /文件系统/ Hadoop FS

但后来我试图理解这与在任何插入/更新/删除上同步多个数据库表有什么关系 - 因为Connect API仍然涉及对主题的写/读 - 这可能不一定是我的用例。我也看过Kafka Streams,但它在进行数据聚合和计数器管理方面似乎是一种有效的工具,同样不是我的用例。

有人能解释我的假设是否正确,我还应该探索Streams / Connect API吗?

此致

1 个答案:

答案 0 :(得分:2)

是的,您可以使用Kafka Connect将更改从一个数据库应用到另一个数据库。您通常会使用CDC工具直接从源数据库上的重做/事务日志中获取事件,这会将每个事件推送到Kafka主题。一个例子是Oracle GoldenGate,或Debezium项目。

在Kafka主题上,您可以使用Kafka Connect的JDBC Sink将这些更改推送到目标数据库。

如果你想要在目标中直接镜像删除,那么这可能不符合你的要求,因为通常CDC记录会有一个表示操作的列(例如" D"删除),你将使用此值在目标上获取行插入

但是,如果您希望将一组表从一个数据库镜像到另一个数据库,那么您应该查看数据库复制工具,而不是Kafka。

Kafka适合的地方是,如果您想将事件从一个地方流式传输到另一个地方(并希望存储删除事件,而不是从目标中删除它们),可以选择使用相同的数据降落到其他目标,或者驱动其他直接申请。这可能是Kafka Streams,一个Kafka消费者 - 或者与Kafka集成的任何其他众多技术和工具。

就Kafka Streams而言,如果您想对从源数据库中提取的数据进行一些处理(例如,连接/过滤/聚合),这将非常有用。除了直接使用Kafka Streams编写Java代码之外,您现在可以选择在Kafka之上使用类似SQL的界面,KSQL from Confluent