我正在阅读有关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吗?
此致
答案 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。