【问题标题】:Avoid duplicates while syncing MongoDB and Elasticsearch with Logstash JDBC plugin使用 Logstash JDBC 插件同步 MongoDB 和 Elasticsearch 时避免重复
【发布时间】:2020-09-14 11:24:53
【问题描述】:

我正在尝试使用 Logstash 使 MongoDB 集合与 Elasticsearch 索引保持同步。

为此,我正在使用带有 DBSchema JDBC 驱动程序库的 Logstash JDBC 插件。

这是我用于 logstash 的配置文件:-

input {
  jdbc{
    jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
    jdbc_driver_library => "/path/to/mongojdbc1.8.jar"
    jdbc_user => ""
    jdbc_password => ""
    jdbc_connection_string => "jdbc:mongodb://127.0.0.1:27017/db1"
    statement => "db.collection1.find({ }, { '_id': false })"
  }
}

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "testing"
    user => ""
    password => ""
  }
}

这没问题,但是当我多次运行 logstash 时,记录会多次插入 Elasticsearch。我不希望记录被重写。此外,如果我修改文档并再次运行 logstash,它应该会更改 Elasticsearch 中的相同记录,而无需创建新文档。我该如何实现这一目标?

【问题讨论】:

  • 如果你在你的logstash输出中使用选项document_id并带有来自你的源的一些唯一标识符,它只会更新elasticsearch中的同一个文档,如果你不使用它,elasticsearch将生成一个唯一的id对于每个文档,您的源中是否有唯一标识符字段?
  • 尝试将record_last_run => truelast_run_metadata_path => "/usr/share/logstash/bin/since" 添加到logstash 中的jdbc 部分。你可以在这里阅读更多信息:elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html
  • @leandrojmp 知道了,我需要先为每个文档设置一个唯一标识符
  • @eladyanai 这是另一个很好的解决方案,谢谢

标签: mongodb elasticsearch jdbc logstash mongo-jdbc-driver


【解决方案1】:

您可以通过 ID 同步您的文档。 这是Logstash Elasticsearch output plugin 的链接,部分包含您需要的选项。

因此,对于文档,您必须将 doc_as_upsert 设置为 true,并在输出中传递 document_id。

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "testing"
    user => ""
    password => "",
    doc_as_upsert => true,
    document_id => "%{id}"
  }
}

注意document_id => "%{id}" - id 这里是你的 doc id 字段名称。

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2018-08-14
    • 2015-10-29
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多