将MongoDb同步到ElasticSearch

时间:2019-10-11 13:56:47

标签: python-3.x mongodb elasticsearch

我正在寻找一种在MongoDB中将集合与Elastic Search(ES)同步的方法。目标是将MongoDB用作主要数据源,并将MongoDB用作全文本搜索引擎。 (我项目的业务逻辑是用python编写的。)

有几种在线方法。

但是,大多数建议都存在数年之久,我找不到支持当前版本的ES(ES 7.4.0)的任何解决方案。有人在使用这样的构造吗?你有什么建议吗?

我考虑过放弃MongoDB作为主要数据源,而只是使用ES进行存储和搜索。尽管我已经读过ES不应该用作主要数据源。


修改

谢谢@ gurdeep.sabarwal。我按照你的方法。但是,我无法将mongodb同步到ES。我的配置如下:

input {
    jdbc {
#        jdbc_driver_library => "/usr/share/logstash/mongodb-driver-3.11.0-source.jar"
        jdbc_driver_library => "/usr/share/logstash/mongojdbc1.5.jar"
#        jdbc_driver_library => "/usr/share/logstash/mongodb-driver-3.11.1.jar"

#        jdbc_driver_class => "mongodb.jdbc.MongoDriver"
#        jdbc_driver_class => "Java::com.mongodb.MongoClient"
        jdbc_driver_class => "Java::com.dbschema.MongoJdbcDriver"
        jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
#        jdbc_driver_class => ""

        jdbc_connection_string => "jdbc:mongodb://<myserver>:27017/<mydb>"
        jdbc_user => "user"
        jdbc_password => "pw"
        statement => "db.getCollection('mycollection').find({})"
    }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200/"]
        index => "myindex"
    }
}

这使我更接近目标。但是,出现以下错误:

  

错误:未加载Java :: com.dbschema.MongoJdbcDriver。您确定已在:jdbc_driver_library中包含正确的jdbc驱动程序吗?
  例外:LogStash :: ConfigurationError`

因为它不起作用,所以我也尝试了带注释的版本,但没有成功。

2 个答案:

答案 0 :(得分:1)

对于ELK堆栈,我已经使用(第1和第2)方法实现了,在进行研究时,我遇到了多个问题,因此您可以选择任何人。 但我个人的选择是第一或第二,因为它为您提供了很多自定义选项。

如果您需要代码,请告诉我,我可以分享它的摘要。我不想回答太久!。

1。使用dbSchemeJdbc jar(https://dbschema.com)将数据从mongodb流传输到ElasticSearch。

a.OpenSource dbSchemeJdbc jar

b。您可以直接在logstash中编写本机mongodb查询或聚合查询。

您的管道可能如下所示:

input {
  jdbc{
    jdbc_user => "user"
    jdbc_password => "pass"
    jdbc_driver_class => "Java::com.dbschema.MongoJdbcDriver"
    jdbc_driver_library => "mongojdbc1.2.jar"
    jdbc_connection_string => "jdbc:mongodb://user:pass@host1:27060/cdcsmb"
    statement => "db.product.find()"
  }
}
output {
  stdout {
    codec => rubydebug 
  }
  elasticsearch {
    hosts => "localhost:9200"
    index => "target_index"
    document_type => "document_type"
    document_id => "%{id}"
  }
}

2。使用unityJdbc jar(http://unityjdbc.com)将数据从mongodb流传输到ElasticSearch

a。您必须支付unityjdbc jar

b。您可以在logstash中编写SQL格式查询,以从mongodb获取数据。

您的管道可能如下所示:

input {
  jdbc{
    jdbc_user => "user"
    jdbc_password => "pass"
    jdbc_driver_class => "Java::mongodb.jdbc.MongoDriver"
    jdbc_driver_library => "mongodb_unityjdbc_full.jar"
    jdbc_connection_string => "jdbc:mongodb://user:pass@host1:27060/cdcsmb"
    statement=> "SELECT * FROM employee WHERE status = 'active'" 
  }
}
output {
  stdout {
    codec => rubydebug 
  }
  elasticsearch {
    hosts => "localhost:9200"
    index => "target_index"
    document_type => "document_type"
    document_id => "%{id}"
  }
}

3。使用logstash-input-mongodb(https://github.com/phutchins/logstash-input-mongodb)插件将数据从mongodb流式传输到ElasticSearch

a.opensource类

b。定制的选项很少,它将转储整个集合,不能编写查询或编写聚合查询等。

4。您可以使用python或java编写自己的程序,并在弹性搜索中连接mongodb和索引数据,然后可以使用cron对其进行调度。

5。您可以使用节点js Mongoosastic npm(https://www.npmjs.com/package/mongoosastic),它的唯一开销是它将在mongo和ES上提交更改以保持同步。

答案 1 :(得分:0)

  1. 下载https://dbschema.com/jdbc-drivers/MongoDbJdbcDriver.zip
  2. 解压缩所有文件并将其复制到路径(〜/ logstash-7.4.2 / logstash-core / lib / jars /)
  3. 修改以下配置文件(mongo-logstash.conf):
  4. 运行:〜/ logstash-7.4.2 / bin / logstash -f mongo-logstash.conf
  5. 成功,请尝试!

ps:这是我在stackoverflow中的第一个答案:-)

input {
  jdbc{
    # NOT THIS # jdbc_driver_class => "Java::mongodb.jdbc.MongoDriver"
    jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
    jdbc_driver_library => "mongojdbc1.5.jar"
    jdbc_user => "" #no user and pwd
    jdbc_password => ""
    jdbc_connection_string => "jdbc:mongodb://127.0.0.1:27017/db1"
    statement => "db.t1.find()"
  }
}

output {
    #stdout { codec => dots }
    stdout { }
}