如何正确地将PostgreSQL数据库中的表同步/导入到Elasticsearch?

6
我想从一个Postgres数据库中导入一些表到Elasticsearch,并且还要与Elasticsearch中的数据保持同步。我看了Udemy上的一门课程,并且与有很多经验的同事交流,了解最好的处理方法。令我惊讶的是,无论是他们两个人,似乎最好的方法是用Python、Java或其他语言编写代码来处理导入和同步。这就引出了我的问题。这是真正处理这种情况的最佳方法吗?似乎应该有一个库、插件或其他东西来处理将数据导入到Elasticsearch并将其与外部数据库保持同步的情况。如何处理这种情况才是最好的方式?

要求我们推荐或寻找书籍、工具、软件库、教程或其他外部资源的问题在 Stack Overflow 上是不适合的,因为它们往往会吸引主观的答案和垃圾邮件。相反,请描述问题以及已经采取的解决方法。 - Mickael
抱歉,我知道我很自私,所以提出这个问题。 - slipperypete
我投反对票是因为这个问题没有展示出任何研究努力 (http://idownvotedbecau.se/noresearch/)。我在谷歌上搜索了 "elasticsearch postgresql",并在顶部结果中发现了 ElasticSearch JDBC 的存在。然后我搜索了 "elasticsearch jdbc postgresql",并找到了 alkis 在他的回答中提到的链接。这只花了我1分钟... - Mickael
3个回答

9
这取决于您的用例。通常做法是在应用程序层处理此问题。基本上,您要做的就是将一个数据库的操作复制到另一个数据库中。例如,如果您在PostgreSQL中保存一个条目,则在Elasticsearch中也要保存相同的内容。
但是,如果您这样做,就必须建立一个排队系统。可以将队列集成在应用程序层中,例如,如果在Elasticsearch中保存失败,则可以重放该操作。此外,在排队系统中,您还将实现限流机制,以避免过度使用Elasticsearch。另一种方法是向另一个应用程序发送事件(例如logstash等),因此限流和持久性将由该系统而不是您的应用程序处理。
另一种方法是使用https://www.elastic.co/blog/logstash-jdbc-input-plugin。您可以使用另一个系统“轮询”数据库并将更改发送到elasticsearch。在这种情况下,logstash非常理想,因为它是ELK堆栈的一部分,并且具有出色的集成性。也可以查看https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
另一种方法是使用postgres的NOTIFY机制将事件发送到某个队列,该队列将处理将更改保存在elasticsearch中。

3

有一种更近期的工具名为 "abc",由 appbase.io 开发。 它的性能无法与 logstash 相比较: - abc 基于 go 语言 - logstash 基于 jruby

任何曾经使用过 logstash 的人都知道它至少需要 20 秒才能启动。

从 PostgreSQL 到 Elasticsearch 的相同基本表格导入任务在 logstash 上需要约 1 分钟,而在 abc 上只需要 5 秒。

优点

  • 性能
  • 性能
  • 简单(无需配置)

缺点

  • 更适合一次性导入,守护进程模式受限
  • 中间件(logstash 过滤器)较少,需要编写 transform.js 文件来手动更改事件

1
作为生活中的任何事情,最好是主观的。 你的同事喜欢编写和维护代码以保持同步。这没有错。 我会说最好的方法是使用一些数据管道。有很多选择,确实令人不知所措,你可以探索支持Postgres和ElasticSearch的各种解决方案。以下是我熟悉的选项。
请注意,这些是您解决方案的工具/平台,而不是解决方案本身。您必须配置、定制和增强它们以适应您对“同步”的定义。
- LogStash - Apachi Nifi - Kafka Connect

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接