【问题标题】:Apache Kafka Connect/Streams API for synchronising database tables用于同步数据库表的 Apache Kafka Connect/Streams API
【发布时间】:2018-02-19 10:51:16
【问题描述】:

我正在阅读有关 Connect API 的 Kafka 文档,并试图将其与我的问题域联系起来。我有多个数据库,其中包含需要在任何更新/插入/删除时同步的公用表。一个例子是这样的:

1) 有人更新 DB1 中的表“order_history” - 我希望将更新传达给 DB2/DB3 等。

2) 有人在“purchase_order”中插入了一条记录——我希望将插入传递给 DB2/DB3 等,以便在那些 DB2/DB3 等中进行相同的插入。

3) 表将在所有数据库中 - 因此不会出现缺少表的问题。

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

1) 源连接器导入数据 - 从 SQL/文件系统到 Kafka 主题

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

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

谁能解释我的假设是否正确,我仍然应该探索 Streams/Connect API?

问候,

【问题讨论】:

  • 您真正想要解决什么问题? “我需要同步任何更新/插入/删除”可能有很多用途:) 如果您想要直接表复制,那么有特定于数据库的产品(例如 Oracle GoldenGate)。如果这是您想要共享和传播的应用程序数据,那么 Kafka 可能会有所帮助。你需要更好地描述what为什么你想做某事,然后我们可以帮助how :)
  • @RobinMoffatt 从问题中很清楚 - 插入/更新/删除到数据库(某些表)是不言自明的。 db 表可以将应用程序数据与其他一些元数据混合在一起。如果这对您有意义,我已经更新了问题
  • 自从我发表评论后,您的问题发生了变化 :) 让我问一个问题:您为什么要使用 Kafka 而不是标准的数据库/表复制工具?这些是相同的数据库,还是不同的技术?
  • @RobinMoffatt 因为我们已经为一些消息传递活动实现了 Kafka,除非 Kafka 能够以最小的努力做到这一点,否则使用新工具是没有意义的——这不是“为什么”的问题,而是“可以/不能”。

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


【解决方案1】:

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

一旦涉及 Kafka 主题,您就可以使用 Kafka Connect 的 JDBC Sink 将这些更改推送到目标数据库。

如果您还想直接在目标中镜像删除,这可能不符合您的要求,因为通常 CDC 记录将有一个指示操作的列(例如“D”表示删除)并且您会得到一行 插入具有此值的目标。

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

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

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

【讨论】:

  • 好的 - 如果事件(插入/更新/删除)在 DB1、DB2、DB3 上(按顺序)发生在同一个表中,例如,table1 - 如果我想维护Kafka Connect 将设法做到这一点,还是我需要使用普通的客户端 API?此外,Debezium 远没有 Kafka 成熟——所以这不是一个解决方案。
  • 是的 Kafka(以及因此 Kafka Connect)保证分区内排序。你对 Debezium 有什么顾虑?它已经在许多地方用于生产。
  • 我需要 SQL Server 连接器,但没有人提供,即使 SQL Server 是最可靠和最安全的企业解决方案。我的问题是这个 Connect API 不像基本客户端 API 那样简化,并且要求开发人员编写大量代码,坦率地说,这不是必需的。这不是批评,而是事实。我应该只提供一个表列表、目标 JDBC url 和操作类型 (CRUD),而 Kafka 应该这样做——不应该有任何其他样板编码。目前它需要太多的摆弄。这就是为什么我想知道是否有可行的解决方法。
  • 您说得对,开发人员不应该编写不必要的代码——而有了 Connect API,您就不必这样做了!它是一个配置文件驱动的 API。如果你想编写一个连接器插件,你只需要编写代码。现有Connector plugins 的大型社区。对于 SQL Server,您可以使用 JDBC Connector,或者尝试使用 this one。可能还有其他商业选择。
猜你喜欢
  • 2018-11-06
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2019-06-12
相关资源
最近更新 更多