将PostgreSQL数据与ElasticSearch同步

39

我希望最终能够拥有可扩展的搜索方案来处理PostgreSql中的数据。我的研究指向使用Logstash将写入事件从Postgres运输到ElasticSearch,但我没有找到可用的解决方案。我找到的解决方案涉及使用jdbc-input在一定时间间隔内查询所有数据,并且删除事件无法被捕获。

我认为这是一个常见的用例,所以我希望你们能与我分享你们的经验,或给我一些进一步的提示。


1
这个答案可能会有所帮助(在我提到Go/Python binlog解决方案的结尾处):https://dev59.com/sVsW5IYBdhLWcg3w4qiw#34477639 - Val
感谢Val提供的指引。在提问之前,我已经找到了那篇文章。但是现在我认为我可以使用input-jdbc并进行一些额外的工作来处理删除的数据。您知道如何设置Logstash以从Postgres捕获事件吗? - Khanetor
嗯...我认为要解决DELETE问题,我将不会在我的主数据库中删除任何记录,而只是将记录标记为“已删除”,然后这将在ElasticSearch中反映出来。当我想要删除东西时,我会设置一个计划,在主数据库和ES中删除所有带有删除标记的内容。 - Khanetor
没错,我也建议采用后一种方法,只需将其标记为已删除并更新时间戳,jdbc输入就会处理它。 - Val
如果您愿意编写答案,我很乐意将其标记为答案 :) - Khanetor
3个回答

20
如果您需要在删除时收到通知并删除Elasticsearch中的相应记录,则真正的情况是Logstash jdbc输入将无法帮助。您必须使用围绕binlog工作的解决方案,如这里建议的
但是,如果您仍然想使用Logstash jdbc输入,您可以简单地在PostgreSQL中软删除记录,即创建一个新的BOOLEAN列,以标记记录为deleted。 Elasticsearch中将存在相同的标志,您可以通过对deleted字段进行简单的term查询来从搜索中排除它们。
每当您需要执行一些清理操作时,可以在PostgreSQL和Elasticsearch中删除所有标记为deleted的记录。

15
你也可以看一下PGSync
它类似于Debezium,但更容易上手。
PGSync是一个变更数据捕获工具,用于将数据从Postgres移动到Elasticsearch。 它允许您将Postgres作为源头,并在Elasticsearch中公开结构化的去规范化文档。
你只需定义一个JSON模式,描述Elasticsearch中数据的结构即可。
以下是一个示例模式:(您还可以拥有嵌套对象)

e.g

{
    "nodes": {
        "table": "book",
        "columns": [
            "isbn",
            "title",
            "description"
        ]
    }
}

PGsync可以即时生成你的文档查询语句。无需像Logstash一样编写查询语句。它还支持并跟踪删除操作。

它同时运行轮询和事件驱动模型,以捕获对日期所做的更改,并通知在某个时间点发生的更改。初始同步轮询数据库自上次守护程序运行以来的更改,此后基于触发器并由pg-notify处理的事件通知会对数据库进行更改。

它几乎没有开发开销。

  • 按照上述说明创建架构
  • 将pgsync指向您的Postgres数据库和Elasticsearch集群
  • 启动守护进程。

您可以轻松地创建包含多个关系作为嵌套对象的文档。PGSync会跟踪任何更改。

请查看github repo获取更多详细信息。

您可以从PyPI安装该软件包。


你好,欢迎!您能否详细介绍一下PGSync的作用以及如何帮助解决原始问题?最佳答案应尽量减少对外部链接的依赖。 - Z4-tier
PGSync是一款非常棒的工具。它运行良好。您甚至可以指定子表/列和关系,并将它们合并为单个索引。 - Damien Roche
PGSync对我们来说效果不是很好。当我们在带有数据的现有表中创建新列时,它不会将数据迁移到ES。那么我们应该寻找替代方案吗? - Khushal Vyas
@KhushalVyas,你能分享更多关于这个问题的细节或者在GitHub上开一个issue吗?通常情况下,当你向schema.json中添加新列时,最好重新索引。 - taina

8
请查看Debezium。它是一个变更数据捕获(CDC)平台,可让您实时流式传输数据。
我创建了一个简单的Github存储库,展示了它如何工作。

enter image description here


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