Синхронизировать MongoDb с ElasticSearch - PullRequest
0 голосов
/ 11 октября 2019

Я ищу способ синхронизации коллекций в 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 в: jdbc_driver_library?
Исключение: LogStash :: ConfigurationError`

Так как это не сработало, я попробовал также закомментированную версию, но неуспех.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Для стека ELK я реализовал с использованием (1-го и 2-го) подхода, и, проводя исследования, я столкнулся с несколькими оценками, чтобы вы могли выбрать любого. но мой личный выбор - 1-й или 2-й, потому что он дает вам много возможностей для настройки.

если вам нужен код, дайте мне знать, я могу поделиться фрагментом его. я не хочу отвечать долго*

b. Вы можете написать собственный запрос mongodb или запрос агрегации непосредственно в logstash.

ваш конвейер может выглядеть следующим образом:

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. Вы должны заплатить за jar unityjdbc

b. Вы можете написать запрос формата SQL в logstash для получения данных из 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 и index data в упругом поиске, тогда вы можете использовать cron, чтобы запланировать его.

5.Вы можете использовать узел js Mongoosastic npm (https://www.npmjs.com/package/mongoosastic), единственные накладные расходы - это принятие изменений на Mongo и ESи то и другое синхронизировано.

0 голосов
/ 14 ноября 2019
  1. скачать https://dbschema.com/jdbc-drivers/MongoDbJdbcDriver.zip
  2. распаковать и скопировать все файлы в путь (~ / logstash-7.4.2 / logstash-core / lib / jars /)
  3. изменитьфайл конфигурации (mongo-logstash.conf) ниже:
  4. run: ~ / 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 { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...