introduction
Elasticsearch facilite la recherche en texte intégral de vos données, tandis que MongoDB excelle dans son stockage. Utiliser MongoDB pour stocker vos données et Elasticsearch for search constituent une architecture commune.
Souvent, vous aurez peut-être besoin de migrer des données de MongoDB vers Elasticsearch en bloc. Écrire votre propre programme pour cela, même s’il s’agit d’un bon exercice, peut s’avérer fastidieux. Il existe un formidable utilitaire open source appelé Transporter, développé par Compose (une plate-forme cloud pour les bases de données), qui s’acquitte de cette tâche de manière très efficace.
Ce didacticiel explique comment utiliser l’utilitaire open source Transporter pour copier rapidement des données de MongoDB vers Elasticsearch avec des transformations personnalisées.
Buts
Dans cet article, nous allons expliquer comment copier des données de MongoDB vers Elasticsearch sur * Ubuntu 14.04 *, à l’aide de l’utilitaire Transporter.
Nous allons commencer par un bref aperçu de la procédure d’installation de MongoDB et d’Elasticsearch, sans toutefois entrer dans les détails de la modélisation des données dans les deux systèmes. N’hésitez pas à parcourir rapidement les étapes d’installation si vous les avez déjà installées.
Ensuite, nous allons passer à Transporter.
Les instructions sont similaires pour d’autres versions d’Ubuntu, ainsi que pour d’autres distributions Linux.
Conditions préalables
S’il vous plaît remplir les conditions préalables suivantes.
-
Ubuntu 14.04 Droplet
-
sudo utilisateur
Étape 1 - Installation de MongoDB
Importez la clé publique du référentiel MongoDB.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Créez un fichier de liste pour MongoDB.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
Rechargez la base de données de paquets locale.
sudo apt-get update
Installez les packages MongoDB:
sudo apt-get install -y mongodb-org
Notez que chaque package contient le numéro de version associé.
Une fois l’installation terminée, vous pouvez démarrer, arrêter et vérifier le statut du service. Il démarrera automatiquement après l’installation.
Essayez de vous connecter à l’instance MongoDB exécutée en tant que service:
mongo
S’il est opérationnel, vous verrez quelque chose comme ceci:
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
Cela signifie que le serveur de base de données est en cours d’exécution! Vous pouvez sortir maintenant:
exit
Étape 2 - Installation de Java
Java est une condition préalable à Elasticsearch. Laissons l’installer maintenant.
Tout d’abord, ajoutez le référentiel:
sudo apt-add-repository ppa:webupd8team/java
Mettez à jour vos listes de paquets à nouveau:
sudo apt-get update
Installez Java:
sudo apt-get install oracle-java8-installer
Lorsque vous êtes invité à accepter la licence, sélectionnez + <Ok> +
puis + <Oui> +
.
Étape 3 - Installation d’Elasticsearch
Nous allons maintenant installer Elasticsearch.
Commencez par créer un nouveau répertoire dans lequel vous installerez le logiciel de recherche, puis accédez-y.
mkdir ~/utils
cd ~/utils
Visitez la page download d’Elasticsearch] pour afficher la dernière version.
Téléchargez maintenant la dernière version de Elasticsearch. Au moment de la rédaction de cet article, la dernière version était la 1.5.0.
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-.zip
Installez unzip:
sudo apt-get install unzip
Décompressez l’archive:
unzip elasticsearch-.zip
Naviguez jusqu’au répertoire où vous l’avez extrait:
cd elasticsearch-
Lancez Elasticsearch en lançant la commande suivante:
bin/elasticsearch
Elasticsearch mettra quelques secondes à démarrer. Vous verrez certains journaux de démarrage comme cela. Elasticsearch sera maintenant exécuté dans la fenêtre du terminal.
_
* Remarque: * Vous voudrez peut-être exécuter Elasticsearch en tant que service afin de pouvoir le contrôler avec + sudo service elasticsearch restart +
et des commandes similaires; voir ce tutoriel sur Upstart pour obtenir des conseils. Vous pouvez également installer Elasticsearch à partir des référentiels d’Ubuntu, bien que vous obteniez probablement une version plus ancienne.
_
Gardez ce terminal ouvert. Établissez une autre connexion SSH avec votre serveur dans * une autre fenêtre de terminal * et vérifiez si votre instance est active et active:
curl -XGET http://localhost:9200
9200 est le port par défaut pour Elasticsearch. Si tout se passe bien, vous verrez une sortie similaire à celle présentée ci-dessous:
{
"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"
}
_ * Remarque *: Pour la dernière partie de cet article, lors de la copie des données, assurez-vous qu’Elasticsearch est en cours d’exécution (et sur le port 9200). _
Étape 4 - Installation de Mercurial
Nous allons ensuite installer l’outil de contrôle de révision Mercurial.
sudo apt-get install mercurial
Vérifiez que Mercurial est correctement installé:
hg
Vous obtiendrez le résultat suivant s’il est correctement installé:
Mercurial Distributed SCM
basic commands:
. . .
Étape 5 - Installation de Go
Transporter est écrit en langue Go. Donc, vous devez installer + golang +
sur votre système.
sudo apt-get install golang
Pour que Go fonctionne correctement, vous devez définir les variables d’environnement suivantes:
Créez un dossier pour Go à partir de votre répertoire + $ HOME
:
mkdir ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
Mettez à jour votre chemin:
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
-
Déconnectez-vous de votre session SSH actuelle et reconnectez-vous. * Vous pouvez fermer uniquement la session où vous avez travaillé et conserver la session Elasticsearch en cours. Cette étape est cruciale pour la mise à jour de vos variables d’environnement. Connectez-vous à nouveau et vérifiez que votre variable a été ajoutée:
echo $GOPATH
Cela devrait afficher le nouveau chemin pour Go. Dans notre cas, ce sera:
/home//go
S’il n’affiche pas correctement le chemin, veuillez vérifier les étapes décrites dans cette section.
Une fois que notre + $ GOPATH +
est défini correctement, nous devons vérifier que Go est correctement installé en construisant un programme simple.
Créez un fichier nommé + hello.go +
et mettez-y le programme suivant. Vous pouvez utiliser l’éditeur de texte de votre choix. Nous allons utiliser l’éditeur de texte nano dans cet article. Tapez la commande suivante pour créer un nouveau fichier:
nano ~/hello.go
Maintenant, copiez ce bref programme «Hello, world» ci-dessous dans le fichier récemment ouvert. Le but de ce fichier est de nous aider à vérifier que Go fonctionne.
package main;
import "fmt"
func main() {
fmt.Printf("Hello, world\n")
}
Une fois terminé, appuyez sur + CTRL + X +
pour quitter le fichier. Il vous demandera de sauvegarder le fichier. Appuyez sur + Y +
puis sur + ENTER
. il vous demandera si vous voulez changer le nom du fichier. Appuyez à nouveau sur + ENTER
pour enregistrer le fichier actuel.
Ensuite, à partir de votre répertoire personnel, exécutez le fichier avec Go:
go run hello.go
Vous devriez voir cette sortie:
Hello, world
Si vous voyez le message «Hello, world», alors Go est correctement installé.
Allez maintenant dans le répertoire + $ GOPATH
et créez les sous-répertoires` + src`, + pkg
et` + bin + `. Ces répertoires constituent un espace de travail pour Go.
cd $GOPATH
mkdir src pkg bin
-
+ src +
contient les fichiers source Go organisés en paquets (un paquet par répertoire) -
+ pkg +
contient des objets de package -
+ bin +
contient des commandes exécutables
Étape 6 - Installation de Git
Nous allons utiliser Git pour installer Transporter. Installez Git avec la commande suivante:
sudo apt-get install git
Étape 7 - Installation de Transporter
Maintenant, créez et déplacez-vous dans un nouveau répertoire pour Transporter. Depuis que cet utilitaire a été développé par Compose, nous appellerons le répertoire + compose +
.
mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose
C’est ici que + compose / transporter +
sera installé.
Clonez le référentiel Transporter GitHub:
git clone https://github.com/compose/transporter.git
Déplacer dans le nouveau répertoire:
cd transporter
Prenez possession du répertoire + / usr / lib / go +
:
sudo chown -R $USER /usr/lib/go
Assurez-vous que + build-essential +
est installé pour GCC:
sudo apt-get install build-essential
Exécutez la commande + go get +
pour obtenir toutes les dépendances:
go get -a ./cmd/...
Cette étape peut prendre un certain temps, alors soyez patient. Une fois cela fait, vous pouvez construire Transporter.
go build -a ./cmd/...
Si tout va bien, il se terminera sans erreur ni avertissement. Vérifiez que Transporter est installé correctement en exécutant cette commande:
transporter
Vous devriez voir la sortie comme ceci:
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
. . .
Donc, l’installation est terminée. Nous avons maintenant besoin de certaines données de test dans MongoDB que nous souhaitons synchroniser avec Elasticsearch.
Dépannage:
Si vous obtenez l’erreur suivante:
transporter: command not found
Cela signifie que votre + $ GOPATH +
n’a pas été ajouté à votre variable + PATH +
. Vérifiez que vous avez correctement exécuté la commande:
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
Essayez de vous déconnecter et de vous reconnecter. Si l’erreur persiste, utilisez plutôt la commande suivante:
$GOPATH/bin/transporter
Étape 8 - Créer des exemples de données
Maintenant que tout est installé, nous pouvons passer à la partie synchronisation des données.
Connectez-vous à MongoDB:
mongo
Vous devriez maintenant voir l’invite MongoDB, +> +
. Créez une base de données nommée + foo +
.
use foo
Insérez des exemples de documents dans une collection nommée + bar +
:
db.bar.save({"firstName": "Robert", "lastName": "Baratheon"});
db.bar.save({"firstName": "John", "lastName": "Snow"});
Sélectionnez le contenu que vous venez d’entrer:
db.bar.find().pretty();
Cela devrait afficher les résultats affichés ci-dessous (+ ObjectId +
sera différent sur votre machine):
{
"_id" : ObjectId("549c3ef5a0152464dde10bc4"),
"firstName" : "Robert",
"lastName" : "Baratheon"
}
{
"_id" : ObjectId("549c3f03a0152464dde10bc5"),
"firstName" : "John",
"lastName" : "Snow"
}
Maintenant, vous pouvez sortir de la base de données:
exit
Un peu de terminologie:
-
Une base de données dans MongoDB est analogue à un index dans Elasticsearch
-
Une collection dans MongoDB est analogue à un type dans Elasticsearch
Notre objectif ultime est de synchroniser les données de la collection * bar * de la base de données * foo * de MongoDB vers le type * bar * de l’index * foo * dans Elasticsearch.
Étape 9 - Configuration de Transporter
Nous pouvons maintenant passer aux modifications de configuration pour migrer nos données de MongoDB vers Elasticsearch. Transporter requiert un fichier de configuration (+ config.yaml +
), un fichier de transformation (+ .js +
) et un fichier d’application (+ application.js +
)
-
Le fichier de configuration spécifie les noeuds, les types et les URI
-
Le fichier d’application spécifie le flux de données de la source à la destination et les étapes de transformation facultatives.
-
Le fichier de transformation applique des transformations aux données
_ * Remarque: * Toutes les commandes de cette section supposent que vous exécutez les commandes à partir du répertoire de transporteur. _
Déplacez-vous dans le répertoire + transport +
:
cd ~/go/src/github.com/compose/transporter
Fichier de configuration
Vous pouvez consulter l’exemple de fichier + config.yaml +
si vous le souhaitez. Nous allons sauvegarder l’original et le remplacer par notre propre contenu.
mv test/config.yaml test/config.yaml.00
Le nouveau fichier est similaire, mais met à jour certains des URI et quelques autres paramètres pour qu’ils correspondent à ceux de notre serveur. Copions le contenu d’ici et collons dans le nouveau fichier + config.yaml +
. Utilisez à nouveau l’éditeur nano.
nano test/config.yaml
Copiez le contenu ci-dessous dans le fichier. Une fois terminé, enregistrez le fichier comme décrit précédemment.
# 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
Remarquez la section + nodes +
. Nous avons légèrement modifié les nœuds + localmongo +
et + es +
par rapport au fichier d’origine. Les nœuds sont les différentes sources de données et destinations. Type définit le type de nœud. Par exemple.,
-
+ mongo +
signifie que c’est une instance / un cluster MongoDB -
+ elasticsearch +
signifie qu’il s’agit d’un nœud Elasticsearch -
+ fichier +
signifie que c’est un fichier texte brut
+ uri +
donnera au point de terminaison de l’API de se connecter au nœud. Le port par défaut sera utilisé pour MongoDB (27017) s’il n’est pas spécifié. Puisque nous devons capturer des données de la base de données * foo * de MongoDB, l’URI devrait ressembler à ceci:
mongodb://localhost/foo
De même, l’URI pour Elasticsearch ressemblera à ceci:
http://localhost:9200/
Enregistrez le fichier + config.yaml +
. Vous n’avez pas besoin de faire d’autres changements.
Fichier d’application
Ouvrez maintenant le fichier + application.js
dans le répertoire` + test`.
nano test/application.js
Remplacez le contenu exemple du fichier par le contenu ci-dessous:
Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js"})
.save({name:"es", namespace:"foo.bar"});
Enregistrez le fichier et quittez. Voici une brève explication de notre pipeline.
-
+ Source () +
identifie la source à partir de laquelle récupérer les données -
+ transform +
spécifie quelle transformation appliquer sur chaque enregistrement -
+ save () +
identifie où sauvegarder les données
Les options comprennent:
-
+ name: +
nom du noeud tel qu’il apparaît dans le fichier+ config.yaml +
-
+ namespace: +
identifie la base de données et le nom de la table; il doit être qualifié par un point (*. *)
Fichier de transformation
La dernière pièce du puzzle est la transformation. Si vous vous en souvenez bien, nous avons stocké deux enregistrements dans MongoDB avec + firstName +
et + lastName +
. C’est là que vous pouvez voir le pouvoir réel de transformer des données lorsque vous les synchronisez de MongoDB vers Elasticsearch.
Supposons que nous voulions que les documents stockés dans Elasticsearch aient un autre champ appelé + nom complet +
. Pour cela, nous devons créer un nouveau fichier de transformation, + test / transformers / addFullName.js +
.
nano test/transformers/addFullName.js
Collez le contenu ci-dessous dans le fichier. Enregistrez et quittez comme décrit précédemment.
module.exports = function(doc) {
doc._id = doc._id['$oid'];
doc["fullName"] = doc["firstName"] + " " + doc["lastName"];
return doc
}
La première ligne est nécessaire pour aborder la manière dont Transporter traite le champ + ObjectId () +
de MongoDB. La deuxième ligne indique à Transporter de concaténer + firstName +
et + lastName +
pour former + fullName +
.
Ceci est une transformation simple pour l’exemple, mais avec un peu de JavaScript, vous pouvez effectuer une manipulation de données plus complexe pendant que vous préparez vos données pour la recherche.
Étape 10 - Exécution de la transformation
Maintenant que la configuration est terminée, il est temps de synchroniser et de transformer nos données.
-
Assurez-vous que Elasticsearch est en cours d’exécution! * Si ce n’est pas le cas, redémarrez-le dans une nouvelle fenêtre * nouveau terminal *:
~/utils/elasticsearch-/bin/elasticsearch
Dans votre * terminal d’origine *, assurez-vous de vous trouver dans le répertoire + transport +
:
cd ~/go/src/github.com/compose/transporter
Exécutez la commande suivante pour copier les données:
transporter run --config ./test/config.yaml ./test/application.js
La commande + run +
de Transporter attend deux arguments. Le premier est le fichier de configuration et le second est le fichier d’application. Si tout se passe bien, la commande se terminera sans erreur.
Vérifiez Elasticsearch pour vérifier que les données ont été copiées, avec notre transformation:
curl -XGET localhost:9200/foo/bar/_search?pretty=true
Vous obtiendrez un résultat comme celui-ci:
{
"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"}
} ]
}
}
Remarquez le champ + nom complet +
, qui contient le + prénom +
et + dernier nom +
concaténés par un espace entre les deux - notre transformation a fonctionné.
Conclusion
Nous savons maintenant comment utiliser Transporter pour copier des données de MongoDB vers Elasticsearch et comment appliquer des transformations à nos données lors de la synchronisation. Vous pouvez appliquer des transformations beaucoup plus complexes de la même manière. Vous pouvez également chaîner plusieurs transformations dans le pipeline.
Si vous effectuez plusieurs transformations, conservez-les dans des fichiers séparés et chaînez-les. De cette façon, vous rendez chacune de vos transformations utilisable indépendamment pour le futur.
Donc, c’est à peu près tout. Vous pouvez consulter le projet Transporter sur GitHub pour rester à jour des dernières modifications apportées à l’API.
Vous pouvez également consulter ce didacticiel sur les opérations de base https://www.digitalocean.com/community/tutorials/how-to-interact-with-data-in-elataearch-using-crud-operations-CRUD dans Elasticsearch] .