所以有一点背景 - 我们有大量的数据源,从RDBMS到S3文件。我们希望将这些数据与其他各种数据仓库,数据库等同步并集成。
起初,这似乎是卡夫卡的典型模式。我们希望通过Kafka将数据更改流式传输到数据输出源。在我们的测试案例中,我们使用Oracle Golden Gate捕获更改并成功将更改推送到Kafka队列。但是,将这些更改推送到数据输出源已经证明具有挑战性。
我意识到,如果我们只是向Kafka主题和队列添加新数据,这将非常有效。我们可以缓存更改并将更改写入各种数据输出源。然而,这种情况并非如此。我们将更新,删除,修改分区等。处理这个问题的逻辑似乎要复杂得多。
我们尝试使用登台表和连接来更新/删除数据,但我觉得这很快就会变得非常笨拙。
这就是我的问题 - 我们可以采取哪些不同的方法处理这些操作?或者我们应该完全朝着不同的方向前进?
非常感谢任何建议/帮助。谢谢!
答案 0 :(得分:6)
您可以采取以下三种方法:
定期将RDBMS数据源表转储到文件中,然后将其加载到数据仓库中,替换以前的版本。这种方法主要用于小型表,但实现起来非常简单,并且支持轻松更新和删除数据。
定期获取自上次查询以来更改的记录,并将它们发送到数据仓库。
的内容SELECT *
FROM my_table
WHERE last_update > #{last_import}
这种方法实现起来稍微复杂一些,因为你必须维护状态(上面代码片段中的“last_import”),并且它不支持删除。它可以扩展为支持删除,但这使它更复杂。这种方法的另一个缺点是它要求您的表格具有last_update
列。
编写一个持续监听RDBMS binlog的程序,并将这些更新发送到数据仓库中的中间表,包含行的更新值,以及是删除操作还是更新/创建。然后编写一个定期合并这些更新的查询,以创建一个镜像原始表的表。此整合过程背后的想法是为每个ID选择所有更新或统一表格的先前版本中显示的最后(最高级)版本。
这种方法实现起来稍微复杂一些,但即使在大型表上也可以实现高性能,并支持更新和删除。
Kafka 与此方法相关,因为它可以用作binlog侦听器和加载到数据仓库中间表之间的行更新的管道。
您可以详细了解这些different replication approaches in this blog post。
披露:我在Alooma工作(一位同事写了上面链接的博客文章,我们提供数据管道作为服务,解决这样的问题)。