我正在寻找一种在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`
因为它不起作用,所以我也尝试了带注释的版本,但没有成功。
答案 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)
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 { }
}