Вступление
Elasticsearch облегчает полнотекстовый поиск ваших данных, в то время как MongoDB превосходно хранит их. Использование MongoDB для хранения ваших данных и Elasticsearch для поиска является распространенной архитектурой.
Много раз вы можете столкнуться с необходимостью массового переноса данных из MongoDB в Elasticsearch. Написание собственной программы для этого, хотя и является хорошим упражнением, может быть утомительным занятием. Есть замечательная утилита с открытым исходным кодом под названием Transporter, разработанная Compose (облачная платформа для баз данных), которая очень эффективно справляется с этой задачей.
В этом руководстве показано, как использовать утилиту с открытым исходным кодом Transporter для быстрого копирования данных из MongoDB в Elasticsearch с помощью пользовательских преобразований.
цели
В этой статье мы рассмотрим, как копировать данные из MongoDB в Elasticsearch в * Ubuntu 14.04 *, используя утилиту Transporter.
Мы начнем с краткого обзора, показывающего, как установить MongoDB и Elasticsearch, хотя мы не будем вдаваться в подробности о моделировании данных в двух системах. Не стесняйтесь быстро просмотреть шаги установки, если вы уже установили оба из них.
Тогда мы перейдем к Transporter.
Инструкции аналогичны для других версий Ubuntu, а также для других дистрибутивов Linux.
Шаг 1 - Установка MongoDB
Импортируйте открытый ключ хранилища MongoDB.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Создайте файл списка для MongoDB.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
Перезагрузите локальную базу данных пакетов.
sudo apt-get update
Установите пакеты MongoDB:
sudo apt-get install -y mongodb-org
Обратите внимание, что каждый пакет содержит соответствующий номер версии.
После завершения установки вы можете запустить, остановить и проверить состояние службы. Он запустится автоматически после установки.
Попробуйте подключиться к экземпляру MongoDB, работающему как служба:
mongo
Если он запущен и работает, вы увидите что-то вроде этого:
MongoDB shell version: 2.6.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Это означает, что сервер базы данных работает! Вы можете выйти сейчас:
exit
Шаг 2 - Установка Java
Java является обязательным условием для Elasticsearch. Давайте установим это сейчас.
Сначала добавьте репозиторий:
sudo apt-add-repository ppa:webupd8team/java
Обновите свои списки пакетов снова:
sudo apt-get update
Установите Java:
sudo apt-get install oracle-java8-installer
Когда будет предложено принять лицензию, выберите + <Ok> +
, а затем + <Yes> +
.
Шаг 3 - Установка Elasticsearch
Теперь мы установим Elasticsearch.
Сначала создайте новый каталог, в который вы будете устанавливать поисковое программное обеспечение, и перейдите в него.
mkdir ~/utils
cd ~/utils
Посетите downloadload страницу Elasticsearch, чтобы увидеть последнюю версию.
Теперь загрузите последнюю версию Elasticsearch. На момент написания этой статьи последняя версия была 1.5.0.
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-.zip
Установить распаковать:
sudo apt-get install unzip
Распакуйте архив:
unzip elasticsearch-.zip
Перейдите в каталог, куда вы его распаковали:
cd elasticsearch-
Запустите Elasticsearch, введя следующую команду:
bin/elasticsearch
Запуск Elasticsearch займет несколько секунд. Вы увидите некоторые журналы запуска, как это происходит. Elasticsearch теперь будет работать в окне терминала.
_
* Примечание: * В какой-то момент вы можете запустить Elasticsearch как сервис, чтобы вы могли управлять им с помощью + sudo serviceasticsearch restart +
и аналогичных команд; см. этот учебник о Upstart для получения советов. Кроме того, вы можете установить Elasticsearch из репозиториев Ubuntu, хотя вы, вероятно, получите более старую версию.
_
Держите этот терминал открытым. Сделайте еще одно SSH-подключение к вашему серверу в * другом окне терминала * и проверьте, работает ли ваш экземпляр:
curl -XGET http://localhost:9200
9200 порт по умолчанию для Elasticsearch. Если все пойдет хорошо, вы увидите вывод, аналогичный показанному ниже:
{
"status" : 200,
"name" : "Northstar",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.5.0",
"build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c",
"build_timestamp" : "2015-03-23T14:30:58Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}
_ * Примечание *: В следующей части этой статьи, когда вы будете копировать данные, убедитесь, что Elasticsearch запущен (и на порту 9200). _
Шаг 4 - Установка Mercurial
Далее мы установим инструмент управления версиями Mercurial.
sudo apt-get install mercurial
Убедитесь, что Mercurial установлен правильно:
hg
Вы получите следующий вывод, если он установлен правильно:
Mercurial Distributed SCM
basic commands:
. . .
Шаг 5 - Установка Go
Транспортер написан на языке Go. Итак, вам нужно установить + golang +
в вашей системе.
sudo apt-get install golang
Для правильной работы Go необходимо установить следующие переменные среды:
Создайте папку для Go из каталога + $ HOME
:
mkdir ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
Обновите свой путь:
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
-
Выйдите из текущего сеанса SSH и войдите снова. * Вы можете закрыть только сеанс, в котором вы работали, и продолжить сеанс Elasticsearch. Этот шаг очень важен для обновления переменных среды. Войдите снова и убедитесь, что ваша переменная была добавлена:
echo $GOPATH
Это должно отобразить новый путь для Go. В нашем случае это будет:
/home//go
Если путь не отображается правильно, перепроверьте шаги в этом разделе.
Как только наша + $ GOPATH +
установлена правильно, мы должны проверить, что Go установлен правильно, создав простую программу.
Создайте файл с именем + hello.go +
и поместите в него следующую программу. Вы можете использовать любой текстовый редактор, который вы хотите. Мы собираемся использовать текстовый редактор nano в этой статье. Введите следующую команду, чтобы создать новый файл:
nano ~/hello.go
Теперь скопируйте эту краткую программу «Hello, world» ниже во вновь открытый файл. Весь смысл этого файла в том, чтобы помочь нам убедиться, что Go работает.
package main;
import "fmt"
func main() {
fmt.Printf("Hello, world\n")
}
Когда закончите, нажмите + CTRL + X +
, чтобы выйти из файла. Он предложит вам сохранить файл. Нажмите + Y +
, а затем нажмите + ENTER
. он спросит вас, хотите ли вы изменить имя файла. Нажмите + ENTER +
еще раз, чтобы сохранить текущий файл.
Затем из вашего домашнего каталога запустите файл с помощью Go:
go run hello.go
Вы должны увидеть этот вывод:
Hello, world
Если вы видите сообщение «Hello, world», значит Go установлен правильно.
Теперь перейдите в каталог + $ GOPATH
и создайте подкаталоги` + src`, + pkg
и` + bin + `. Эти каталоги составляют рабочее пространство для Go.
cd $GOPATH
mkdir src pkg bin
-
+ src +
содержит исходные файлы Go, организованные в пакеты (один пакет на каталог) -
+ pkg +
содержит объекты пакета -
+ bin +
содержит исполняемые команды
Шаг 6 - Установка Git
Мы будем использовать Git для установки Transporter. Установите Git с помощью следующей команды:
sudo apt-get install git
Шаг 7 - Установка Transporter
Теперь создайте и перейдите в новый каталог для Transporter. Поскольку утилита была разработана Compose, мы будем называть каталог + compose +
.
mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose
Это где + compose / transporter +
будет установлен.
Клонируйте репозиторий Transporter GitHub:
git clone https://github.com/compose/transporter.git
Перейдите в новый каталог:
cd transporter
Станьте владельцем каталога + / usr / lib / go +
:
sudo chown -R $USER /usr/lib/go
Убедитесь, что + build-essential +
установлен для GCC:
sudo apt-get install build-essential
Запустите команду + go get +
, чтобы получить все зависимости:
go get -a ./cmd/...
Этот шаг может занять некоторое время, так что наберитесь терпения. Как только это будет сделано, вы можете построить Transporter.
go build -a ./cmd/...
Если все пойдет хорошо, он будет завершен без каких-либо ошибок или предупреждений. Убедитесь, что Transporter установлен правильно, выполнив эту команду:
transporter
Вы должны увидеть результат примерно так:
usage: transporter [--version] [--help] <command> [<args>]
Available commands are:
about Show information about database adaptors
eval Eval javascript to build and run a transporter application
. . .
Итак, установка завершена. Теперь нам нужны некоторые тестовые данные в MongoDB, которые мы хотим синхронизировать с Elasticsearch.
Поиск неисправностей:
Если вы получите следующую ошибку:
transporter: command not found
Это означает, что ваш + $ GOPATH +
не был добавлен в вашу переменную + PATH +
. Убедитесь, что вы правильно выполнили команду:
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
Попробуйте выйти и войти снова. Если ошибка все еще сохраняется, используйте следующую команду:
$GOPATH/bin/transporter
Шаг 8 - Создание образца данных
Теперь, когда у нас все установлено, мы можем перейти к части синхронизации данных.
Подключиться к MongoDB:
mongo
Теперь вы должны увидеть приглашение MongoDB +> +
. Создайте базу данных с именем + foo +
.
use foo
Вставьте несколько примеров документов в коллекцию с именем + bar +
:
db.bar.save({"firstName": "Robert", "lastName": "Baratheon"});
db.bar.save({"firstName": "John", "lastName": "Snow"});
Выберите содержимое, которое вы только что ввели:
db.bar.find().pretty();
Это должно отобразить результаты, показанные ниже (+ ObjectId +
будет отличаться на вашем компьютере):
{
"_id" : ObjectId("549c3ef5a0152464dde10bc4"),
"firstName" : "Robert",
"lastName" : "Baratheon"
}
{
"_id" : ObjectId("549c3f03a0152464dde10bc5"),
"firstName" : "John",
"lastName" : "Snow"
}
Теперь вы можете выйти из базы данных:
exit
Немного терминологии:
-
Database в MongoDB аналогичен index в Elasticsearch
-
Collection в MongoDB аналогична type в Elasticsearch
Наша конечная цель - синхронизировать данные из коллекции * bar * базы данных * foo * из MongoDB с типом * bar * индекса * foo * в Elasticsearch.
Шаг 9 - Настройка Transporter
Теперь мы можем перейти к изменениям конфигурации, чтобы перенести наши данные из MongoDB в Elasticsearch. Для Transporter требуется файл конфигурации (+ config.yaml +
), файл преобразования (+ .js +
) и файл приложения (+ application.js +
)
-
Файл конфигурации определяет узлы, типы и URI
-
Файл приложения определяет поток данных от источника к месту назначения и необязательные шаги преобразования
-
Файл преобразования применяет преобразования к данным
_ * Примечание: * Все команды в этом разделе предполагают, что вы выполняете команды из каталога транспорта. _
Перейдите в каталог + transporter +
:
cd ~/go/src/github.com/compose/transporter
Файл конфигурации
Вы можете взглянуть на пример файла + config.yaml +
, если хотите. Мы собираемся создать резервную копию оригинала, а затем заменить его собственным содержимым.
mv test/config.yaml test/config.yaml.00
Новый файл аналогичен, но обновляет некоторые URI и некоторые другие параметры в соответствии с тем, что находится на нашем сервере. Давайте скопируем содержимое отсюда и вставим в новый файл + config.yaml +
. Используйте нано редактор снова.
nano test/config.yaml
Скопируйте содержимое ниже в файл. После этого сохраните файл, как описано ранее.
# api:
# interval: 60s
# uri: "http://requestb.in/13gerls1"
# key: "48593282-b38d-4bf5-af58-f7327271e73d"
# pid: "something-static"
nodes:
localmongo:
type: mongo
uri: mongodb://localhost/foo
es:
type: elasticsearch
uri: http://localhost:9200/
timeseries:
type: influx
uri: influxdb://root:root@localhost:8086/compose
debug:
type: file
uri: stdout://
foofile:
type: file
uri: file:///tmp/foo
Обратите внимание на раздел + узлы . Мы немного подправили узлы ` localmongo ` и ` es +` по сравнению с исходным файлом. Nodes - это различные источники данных и места назначения. Type определяет тип узла. Например.,
-
+ mongo +
означает, что это экземпляр / кластер MongoDB -
+asticsearch +
означает, что это узел Elasticsearch -
+ file +
означает, что это простой текстовый файл
+ uri +
даст конечную точку API для соединения с узлом. Порт по умолчанию будет использоваться для MongoDB (27017), если он не указан. Так как нам нужно собирать данные из базы данных * foo * MongoDB, URI должен выглядеть следующим образом:
mongodb://localhost/foo
Аналогично, URI для Elasticsearch будет выглядеть так:
http://localhost:9200/
Сохраните файл + config.yaml +
. Вам не нужно вносить какие-либо другие изменения.
Файл приложения
Теперь откройте файл + application.js
в каталоге` + test`.
nano test/application.js
Замените образец содержимого файла содержимым, показанным ниже:
Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});
Сохраните файл и выйдите. Вот краткое объяснение нашего трубопровода.
-
+ Source () +
определяет источник, из которого можно получить данные -
+ transform +
указывает, какое преобразование применить к каждой записи -
+ save () +
определяет, куда сохранять данные
Варианты включают в себя:
-
+ name: +
имя узла, как оно выглядит в файле+ config.yaml +
-
+ namespace: +
идентифицирует базу данных и имя таблицы; оно должно быть квалифицировано точкой (*. *)
Файл преобразования
Теперь последний кусок головоломки - это трансформация. Если вы помните, мы сохранили две записи в MongoDB с + firstName +
и + lastName +
. Именно здесь вы можете увидеть реальную силу преобразования данных при их синхронизации из MongoDB в Elasticsearch.
Допустим, мы хотим, чтобы документы, хранящиеся в Elasticsearch, имели другое поле с именем + fullName +
. Для этого нам нужно создать новый файл преобразования, + test / transformers / addFullName.js +
.
nano test/transformers/addFullName.js
Вставьте содержимое ниже в файл. Сохраните и выйдите, как описано ранее.
module.exports = function(doc) {
doc._id = doc._id['$oid'];
doc["fullName"] = doc["firstName"] + " " + doc["lastName"];
return doc
}
Первая строка необходима для описания способа, которым Transporter обрабатывает поле MongoDB + ObjectId () +
. Вторая строка указывает Transporter объединить + firstName +
и + lastName +
для формирования + fullName +
.
Это простое преобразование для примера, но с небольшим количеством JavaScript вы можете выполнять более сложные манипуляции с данными, подготавливая данные к поиску.
Шаг 10 - Выполнение преобразования
Теперь, когда мы закончили настройку, пришло время синхронизировать и преобразовать наши данные.
-
Убедитесь, что Elasticsearch запущен! * Если это не так, запустите его снова в * новом терминале * окне:
~/utils/elasticsearch-/bin/elasticsearch
В вашем * исходном терминале * убедитесь, что вы находитесь в каталоге + transporter +
:
cd ~/go/src/github.com/compose/transporter
Выполните следующую команду, чтобы скопировать данные:
transporter run --config ./test/config.yaml ./test/application.js
Команда + run +
в Transporter ожидает два аргумента. Первый - это файл конфигурации, а второй - файл приложения. Если все пойдет хорошо, команда выполнит без ошибок.
Проверьте Elasticsearch, чтобы убедиться, что данные были скопированы с нашим преобразованием:
curl -XGET localhost:9200/foo/bar/_search?pretty=true
Вы получите такой результат:
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [ {
"_index" : "foo",
"_type" : "bar_full_name",
"_id" : "549c3ef5a0152464dde10bc4",
"_score" : 1.0,
"_source":{"_id":"549c3ef5a0152464dde10bc4","firstName":"Robert","fullName":"Robert Baratheon","lastName":"Baratheon"}
}, {
"_index" : "foo",
"_type" : "bar_full_name",
"_id" : "549c3f03a0152464dde10bc5",
"_score" : 1.0,
"_source":{"_id":"549c3f03a0152464dde10bc5","firstName":"John","fullName":"John Snow","lastName":"Snow"}
} ]
}
}
Обратите внимание на поле + fullName +
, которое содержит + firstName +
и + lastName +
, соединенные пробелом между ними - наше преобразование сработало.
Заключение
Теперь мы знаем, как использовать Transporter для копирования данных из MongoDB в Elasticsearch и как применять преобразования к нашим данным при синхронизации. Вы можете применить гораздо более сложные преобразования таким же образом. Также вы можете объединить несколько преобразований в конвейер.
Рекомендуется, если вы выполняете несколько преобразований, храните их в отдельных файлах и объединяйте в цепочки. Таким образом, вы делаете каждую из ваших трансформаций пригодной для использования в будущем.
Так что это в значительной степени так. Вы можете проверить Transporter проект на GitHub, чтобы оставаться в курсе последних изменений в API.
Вы также можете проверить этот учебник об основных CRUD операций в Elasticsearch ,