Я просмотрел множество блогов и сайтов о настройке Elasticsearch для MongoDB для индексации коллекций в MongoDB, но ни один из них не был простым.
Пожалуйста, объясните мне шаг за шагом процесс установки elasticsearch, который должен включать:
Я использую Node.js с express.js, поэтому, пожалуйста, помогите соответствующим образом.
Этот ответ должен быть достаточным для того, чтобы вы могли настроить этот учебник на Создание компонента функционального поиска с помощью MongoDB, Elasticsearch и AngularJS.
Если вы хотите использовать фасетный поиск с данными из API, то Matthiasn BirdWatch Repo - это то, что вы, возможно, захотите посмотреть.
Итак, как вы можете настроить один кластер node Elasticsearch ", чтобы индексировать MongoDB для использования в приложении NodeJS, Express на новом экземпляре EC2 Ubuntu 14.04.
Убедитесь, что все обновлено.
sudo apt-get update
Установите NodeJS.
sudo apt-get install nodejs
sudo apt-get install npm
Установить MongoDB - Эти шаги прямо из документов MongoDB. Выберите любую версию, с которой вам удобно. Я придерживаюсь v2.4.9, потому что это, кажется, самая последняя версия MongoDB-River поддерживает без проблем.
Импортируйте общедоступный GPG-ключ MongoDB.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Обновите список источников.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
Получите пакет 10gen.
sudo apt-get install mongodb-10gen
Затем выберите свою версию, если вы не хотите последнего. Если вы настраиваете свою среду на машине с Windows 7 или 8, держитесь подальше от v2.6, пока они не будут работать с некоторыми ошибками, запустив ее как службу.
apt-get install mongodb-10gen=2.4.9
Предотвратите загрузку версии вашей установки MongoDB при обновлении.
echo "mongodb-10gen hold" | sudo dpkg --set-selections
Запустите службу MongoDB.
sudo service mongodb start
По умолчанию файлы базы данных по умолчанию:/var/lib/mongo и ваши файлы журналов в /var/log/mongo.
Создайте базу данных через оболочку mongo и вставьте в нее некоторые фиктивные данные.
mongo YOUR_DATABASE_NAME
db.createCollection(YOUR_COLLECTION_NAME)
for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
Теперь Преобразуйте автономный MongoDB в набор реплик.
Сначала выключите процесс.
mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()
Теперь мы используем MongoDB как службу, поэтому мы не передаем параметр "--replSet rs0" в аргументе командной строки, когда мы перезапускаем процесс mongod. Вместо этого мы помещаем его в файл mongod.conf.
vi /etc/mongod.conf
Добавьте эти строки, подбирая для ваших путей к db и журналам.
replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG
Теперь откройте оболочку mongo для инициализации набора реплик.
mongo DATABASE_NAME
config = { "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017" } ] }
rs.initiate(config)
rs.slaveOk() // allows read operations to run on secondary members.
Теперь установите Elasticsearch. Я просто следую этой полезной Gist.
Убедитесь, что установлен Java.
sudo apt-get install openjdk-7-jre-headless -y
Придерживайтесь v1.1.x до тех пор, пока ошибка плагина Mongo-River не будет исправлена в v1.2.1.
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.deb
sudo dpkg -i elasticsearch-1.1.1.deb
curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
sudo mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
sudo rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch
Убедитесь, что в файле /etc/elasticsearch/elasticsearch.yml включены следующие параметры конфигурации, если вы только разрабатываете на одном node:
cluster.name: "MY_CLUSTER_NAME"
node.local: true
Запустите службу Elasticsearch.
sudo service elasticsearch start
Проверьте работоспособность.
curl http://localhost:9200
Если вы видите что-то подобное, тогда вы добры.
{
"status" : 200,
"name" : "Chi Demon",
"version" : {
"number" : "1.1.2",
"build_hash" : "e511f7b28b77c4d99175905fac65bffbf4c80cf7",
"build_timestamp" : "2014-05-22T12:27:39Z",
"build_snapshot" : false,
"lucene_version" : "4.7"
},
"tagline" : "You Know, for Search"
}
Теперь установите плагины Elasticsearch, чтобы он мог играть с MongoDB.
bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0
bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0
Эти два плагина не нужны, но они хороши для тестирования запросов и визуализации изменений ваших индексов.
bin/plugin --install mobz/elasticsearch-head
bin/plugin --install lukas-vlcek/bigdesk
Перезапустите Elasticsearch.
sudo service elasticsearch restart
Наконец, индексируем коллекцию из MongoDB.
curl -XPUT localhost:9200/_river/DATABASE_NAME/_meta -d '{
"type": "mongodb",
"mongodb": {
"servers": [
{ "host": "127.0.0.1", "port": 27017 }
],
"db": "DATABASE_NAME",
"collection": "ACTUAL_COLLECTION_NAME",
"options": { "secondary_read_preference": true },
"gridfs": false
},
"index": {
"name": "ARBITRARY INDEX NAME",
"type": "ARBITRARY TYPE NAME"
}
}'
Убедитесь, что ваш индекс находится в Elasticsearch
curl -XGET http://localhost:9200/_aliases
Проверьте работоспособность вашего кластера.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Вероятно, желтый цвет с некоторыми неназначенными осколками. Мы должны сказать Elasticsearch, с чем мы хотим работать.
curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'
Проверьте работоспособность кластера. Теперь он должен быть зеленым.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Поиграйте.
Использование реки может представлять проблемы, когда ваша операция масштабируется. При интенсивной эксплуатации река будет использовать тонну памяти. Я рекомендую использовать свои собственные модели elasticsearch, или если вы используете mongoose, вы можете самостоятельно построить свои модели elasticsearch или использовать mongoosastic, который по сути делает это для вас.
Другим недостатком для Mongodb River является то, что вы застряли с использованием ветки mongodb 2.4.x и ElasticSearch 0.90.x. Вы начнете обнаруживать, что вы упускаете много действительно хороших функций, и проект реки mongodb просто не дает полезного продукта достаточно быстро, чтобы сохранить стабильный характер. Тем не менее, река Монгобд определенно не то, с чем я бы начал заниматься. Это создавало больше проблем, чем его ценность. Он будет беспорядочно упаковывать пишутся при большой нагрузке, он будет потреблять много памяти, и нет никаких ограничений для этого. Кроме того, река не обновляется в реальном времени, она читает oplogs из mongodb, и это может задержать обновления до тех пор, как 5 минут в моем опыте.
Недавно нам пришлось переписать большую часть нашего проекта, потому что его еженедельное появление что-то пошло не так с ElasticSearch. Мы даже зашли так далеко, что наняли консультанта Dev Ops, который также согласен с тем, что лучше удалиться от реки.
UPDATE: Elasticsearch-mongodb-river теперь поддерживает ES v1.4.0 и mongodb v2.6.x. Тем не менее, вы все равно столкнетесь с проблемами производительности при тяжелых операциях вставки и обновления, поскольку этот плагин попытается выполнить синхронизацию mongodb oplogs. Если есть много операций, так как блокировка (или блокировка скорее) разблокируется, вы заметите чрезвычайно высокий уровень использования памяти на вашем сервере elasticsearch. Если вы планируете большую операцию, река не является хорошим вариантом. Разработчики ElasticSearch по-прежнему рекомендуют вам управлять своими собственными индексами, напрямую связывая их с их API, используя клиентскую библиотеку для вашего языка, а не используя реку. Это не настоящая цель реки. Twitter-река - отличный пример того, как следует использовать реку. Это, по сути, отличный способ получения исходных данных из внешних источников, но не очень надежный для высокого трафика или внутреннего использования.
Также считайте, что река mongodb отстает в версии, так как ее не поддерживает ElasticSearch Organization, ее поддерживается третьей стороной. Разработка была приостановлена на ветке v0.90 в течение длительного времени после выпуска версии 1.0, а когда была выпущена версия для v1.0, она не была стабильной до тех пор, пока elasticsearch не выпустят v1.3.0. Версия Mongodb также отстает. Вы можете оказаться в трудном положении, когда вы хотите перейти к более поздней версии каждого, особенно с ElasticSearch в таком тяжелом развитии, со многими очень ожидаемыми функциями на этом пути. Пребывание на последнем ElasticSearch было очень важным, поскольку мы в значительной степени полагаемся на постоянное улучшение нашей функциональности поиска, являющейся ее основной частью нашего продукта.
В целом вы, скорее всего, получите лучший продукт, если вы сделаете это самостоятельно. Это не так сложно. Его просто другая база данных для управления в вашем коде, и ее можно легко отнести к существующим моделям без значительного рефакторинга.
Я нашел mongo-коннектор полезным. Это форма Mongo Labs (MongoDB Inc.) и может использоваться теперь с Elasticsearch 2.x
Elastic 2.x doc manager: https://github.com/mongodb-labs/elastic2-doc-manager
mongo-connector создает конвейер из кластера MongoDB в одну или несколько целевых систем, таких как Solr, Elasticsearch или другой кластер MongoDB. Он синхронизирует данные в MongoDB с целью, а затем хвост MongoDB oplog, поддерживая операции в MongoDB в режиме реального времени. Он был протестирован с Python 2.6, 2.7 и 3.3+. Подробная документация доступна в вики.
https://github.com/mongodb-labs/mongo-connector https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch
Вот как это сделать на mongodb 3.0. Я использовал этот приятный блог
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
$ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config);
a. Download and unzip the [latest Elasticsearch][2] distribution b. Run bin/elasticsearch to start the es server. c. Run curl -XGET http://localhost:9200/ to confirm it is working.
$bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-река-MongoDB
$bin/plugin --install elasticsearch/elasticsearch-mapper-attachments
curl -XPUT 'http://localhost:8080/_river/mongodb/_meta' -d '{ "type": "mongodb", "mongodb": { "db": "mydb", "коллекция": "foo" }, "индекс": { "name": "name", "type": "random" } } '
Тестирование в браузере:
Поскольку mongo-connector теперь кажется мертвым, моя компания решила создать инструмент для использования потоков изменений Mongo для вывода в Elasticsearch.
Наши первые результаты выглядят многообещающими. Вы можете проверить это в https://github.com/everyone-counts/mongo-stream. Мы все еще находимся на ранней стадии разработки и будем рады предложениям или предложениям.
Здесь я нашел еще один хороший вариант для переноса ваших данных MongoDB в Elasticsearch. Демон go, который синхронизирует mongodb сasticsearch в режиме реального времени. Это чудовище. Его можно найти по адресу: Monstache
Ниже начальной настройки для настройки и использования.
Шаг 1:
C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test
Шаг 2:
C:\Program Files\MongoDB\Server\4.0\bin>mongo
C:\Program Files\MongoDB\Server\4.0\bin>mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
Server has startup warnings:
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
MongoDB Enterprise test:PRIMARY>
Шаг 3: Проверьте репликацию.
MongoDB Enterprise test:PRIMARY> rs.status();
{
"set" : "test",
"date" : ISODate("2019-01-18T11:39:00.380Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1547811517, 1),
"members" : [
{
"_id" : 0,
"name" : "localhost:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 736,
"optime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-01-18T11:38:57Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1547810805, 1),
"electionDate" : ISODate("2019-01-18T11:26:45Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"operationTime" : Timestamp(1547811537, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1547811537, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB Enterprise test:PRIMARY>
Шаг 4. Загрузите " https://github.com/rwynn/monstache/releases ". Разархивируйте загрузку и настройте переменную PATH, указав путь к папке для вашей платформы. "monstache -v"
к cmd и введите "monstache -v"
# 4.13.1 Monstache использует формат TOML для своей конфигурации. Настройте файл для миграции с именем config.toml
Шаг 5
Мой config.toml ->
mongo-url = "mongodb://127.0.0.1:27017/?replicaSet=test"
elasticsearch-urls = ["http://localhost:9200"]
direct-read-namespaces = [ "admin.users" ]
gzip = true
stats = true
index-stats = true
elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000
dropped-collections = false
dropped-databases = false
resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false
index-as-update=true
index-oplog-time=true
Шаг 6
D:\15-1-19>monstache -f config.toml
River - это хорошее решение, если вы хотите иметь синхронизацию в реальном времени и общее решение.
Если у вас уже есть данные в MongoDB и вы хотите очень легко отправить их в Elasticsearch, например "one-shot", вы можете попробовать мой пакет в Node.js https://github.com/itemsapi/elasticbulk.
Он использует потоки Node.js, так что вы можете импортировать данные из всего, что поддерживает потоки (например, MongoDB, PostgreSQL, MySQL, JSON файлы и т.д.)
Пример для MongoDB для Elasticsearch:
Установить пакеты:
npm install elasticbulk
npm install mongoose
npm install bluebird
Создайте скрипт, т.е. script.js:
const elasticbulk = require('elasticbulk');
const mongoose = require('mongoose');
const Promise = require('bluebird');
mongoose.connect('mongodb://localhost/your_database_name', {
useMongoClient: true
});
mongoose.Promise = Promise;
var Page = mongoose.model('Page', new mongoose.Schema({
title: String,
categories: Array
}), 'your_collection_name');
// stream query
var stream = Page.find({
}, {title: 1, _id: 0, categories: 1}).limit(1500000).skip(0).batchSize(500).stream();
elasticbulk.import(stream, {
index: 'my_index_name',
type: 'my_type_name',
host: 'localhost:9200',
})
.then(function(res) {
console.log('Importing finished');
})
Отправьте ваши данные:
node script.js
Это не очень быстро, но работает на миллионы записей (благодаря потокам).