Monstache synchronise les données d'ApsaraDB for MongoDB vers Alibaba Cloud Elasticsearch en temps réel en suivant les journaux d'opérations (oplogs) de MongoDB. Ce tutoriel vous guide à travers une configuration complète, en utilisant un jeu de données cinématographiques pour illustrer la synchronisation complète, la synchronisation incrémentielle et l'analyse des données via Kibana.
Monstache synchronise et s'abonne aux données en temps réel en se basant sur les oplogs de MongoDB. Il prend en charge les flux de modifications (change streams) et les pipelines d'agrégation de MongoDB, et permet la synchronisation des données entre les bases de données MongoDB et les versions récentes des clusters Elasticsearch. Pour plus d'informations sur les fonctionnalités de Monstache, consultez Features.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un compte Alibaba Cloud disposant des autorisations nécessaires pour créer des instances ECS, des instances ApsaraDB for MongoDB et des clusters Elasticsearch
Une connaissance de base des opérations en ligne de commande Linux
Fonctionnement
Monstache utilise l'oplog de MongoDB comme source d'événements. Chaque insertion, mise à jour et suppression dans MongoDB est enregistrée dans l'oplog ; Monstache suit cet oplog et propage les modifications vers Elasticsearch en quasi-temps réel. Étant donné que l'oplog est une fonctionnalité propre aux ensembles de réplicas, votre instance MongoDB doit être un ensemble de réplicas ou un cluster fragmenté — les instances autonomes ne sont pas prises en charge.
Étape 1 : Créer les ressources requises
Créez les ressources suivantes au sein du même réseau privé virtuel (VPC). Le fait de placer ces trois éléments dans le même VPC garantit que les données transitent de manière sécurisée et à haute vitesse via le réseau interne.
Créez un cluster Elasticsearch. Lors de la création, activez la fonctionnalité Auto Indexing. Ce tutoriel utilise un cluster Elasticsearch V6.7 Standard Edition. Pour plus de détails, consultez Create an Alibaba Cloud Elasticsearch cluster et Configure the YML file.
-
Créez une instance d'ensemble de réplicas ApsaraDB for MongoDB. Ce tutoriel utilise une instance d'ensemble de réplicas ApsaraDB for MongoDB V4.2. Préparez vos données de test après la création — la figure suivante présente une partie du jeu de données cinématographiques utilisé à titre d'exemple. Pour plus de détails, consultez Quick start for replica set instances.
ImportantL'instance ApsaraDB for MongoDB doit être une instance d'ensemble de réplicas ou un cluster fragmenté. Monstache utilise l'oplog comme source d'événements, lequel n'est disponible que sur ces types d'instances.

Créez une instance Elastic Compute Service (ECS). L'instance ECS héberge Monstache et doit exécuter Linux. Pour plus de détails, consultez Create an instance by using the wizard.
Assurez-vous que la version de Monstache que vous installez est compatible avec les versions de votre instance ApsaraDB for MongoDB et de votre cluster Elasticsearch. Pour obtenir des informations sur la compatibilité des versions, consultez Monstache version.
Étape 2 : Installer Monstache
Installez Monstache sur l'instance ECS en compilant à partir du code source. Avant d'installer Monstache, assurez-vous d'avoir configuré les variables d'environnement Go.
-
Connectez-vous à l'instance ECS. Pour plus de détails, consultez Connect to a Linux instance by using a password or key.
RemarqueCet exemple utilise un utilisateur standard (non root).
-
Téléchargez et extrayez Go.
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xzf go1.14.4.linux-amd64.tar.gz -
Configurez les variables d'environnement Go. Ouvrez le fichier
~/.bash_profile:vim ~/.bash_profileAjoutez les lignes suivantes. La variable
GOPROXYpointe vers le proxy de module Go d'Alibaba Cloud, ce qui améliore la vitesse de téléchargement.export GOROOT=/home/test1/go export GOPATH=/home/go/ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin export GOPROXY=https://mirrors.aliyun.com/goproxy/Appliquez les modifications :
source ~/.bash_profile -
Clonez le dépôt Monstache.
RemarqueSi l'erreur
git: command not foundapparaît, installez d'abord git :sudo yum install -y git.git clone https://github.com/rwynn/monstache.git -
Basculez vers la branche rel5 et installez le logiciel.
cd monstache git checkout rel5 sudo go install -
Vérifiez l'installation.
monstache -vSortie attendue :
5.5.5
Étape 3 : Configurer et démarrer la synchronisation des données
Monstache utilise le format TOML pour sa configuration. Dans ce tutoriel, les données sont synchronisées depuis les collections hotmovies et col de la base de données mydb.
-
Dans le répertoire monstache, créez un fichier de configuration.
vim config.toml -
Ajoutez la configuration suivante. Remplacez les valeurs d'espace réservé par vos endpoints et identifiants réels.
# connection settings mongo-url = "mongodb://<your_mongodb_user>:<your_mongodb_password>@dds-bp1aadcc629******.mongodb.rds.aliyuncs.com:3717" elasticsearch-urls = ["http://es-cn-mp91kzb8m00******.elasticsearch.aliyuncs.com:9200"] # collections to sync (full-sync on startup, then tail oplogs) direct-read-namespaces = ["mydb.hotmovies","mydb.col"] # to use MongoDB change streams instead of oplog tailing (requires MongoDB 3.6+): #change-stream-namespaces = ["mydb.col"] # filter to specific collections (oplog listener only, does not trigger a full-sync): #namespace-regex = '^mydb\.col$' # Elasticsearch credentials # For production use, create a dedicated account instead of using the default elastic account. # Assign only the permissions the account needs. See Use the RBAC mechanism provided by # Elasticsearch X-Pack to implement access control. elasticsearch-user = "elastic" elasticsearch-password = "<your_es_password>" # number of concurrent Go threads pushing documents to Elasticsearch elasticsearch-max-conns = 4 # propagate collection and database deletions to Elasticsearch dropped-collections = true dropped-databases = true # save sync progress to monstache.monstache so sync can resume after a restart resume = true resume-strategy = 0 # enable debug logging (logs all requests to Elasticsearch) verbose = true # high availability mode: processes sharing the same cluster-name cooperate cluster-name = 'es-cn-mp91kzb8m00******' # index mappings: override the default database.collection index name [[mapping]] namespace = "mydb.hotmovies" index = "hotmovies" type = "movies" [[mapping]] namespace = "mydb.col" index = "mydbcol" type = "collection"Paramètres clés :
Paramètre Description mongo-urlChaîne de connexion vers le nœud principal de votre instance ApsaraDB for MongoDB. Vous pouvez l'obtenir depuis la page des détails de l'instance dans la console ApsaraDB for MongoDB. Avant de vous connecter, ajoutez l'adresse IP privée de l'instance ECS à la liste d'autorisation de l'instance MongoDB. Consultez Configure a whitelist for a sharded cluster instance. elasticsearch-urlsEndpoint interne de votre cluster Elasticsearch au format http://<endpoint>:9200. Vous pouvez l'obtenir depuis la page Basic Information de votre cluster. Consultez View the basic information of a cluster.direct-read-namespacesCollections à copier depuis MongoDB au démarrage (synchronisation complète), spécifiées sous la forme database.collection. Consultez direct-read-namespaces.change-stream-namespacesUtilisez les flux de modifications MongoDB au lieu du suivi de l'oplog. Lorsque ce paramètre est configuré, le suivi de l'oplog est désactivé. Nécessite MongoDB 3.6 ou version ultérieure. Consultez change-stream-namespaces. namespace-regexExpression régulière permettant de filtrer les collections écoutées par Monstache. Il s'agit d'un filtre appliqué uniquement à l'écouteur d'événements de modification ; il ne déclenche pas de synchronisation complète. elasticsearch-userNom d'utilisateur pour l'authentification Elasticsearch. La valeur par défaut est elastic.elasticsearch-passwordMot de passe de l'utilisateur Elasticsearch. En cas d'oubli, réinitialisez-le. Consultez Reset the access password for an Elasticsearch cluster. elasticsearch-max-connsNombre de threads Go simultanés écrivant dans Elasticsearch. La valeur par défaut est 4.dropped-collectionsLorsque la valeur est true(par défaut), supprime l'index Elasticsearch mappé lorsqu'une collection MongoDB est supprimée.dropped-databasesLorsque la valeur est true(par défaut), supprime les index Elasticsearch mappés lorsqu'une base de données MongoDB est supprimée.resumeLorsque la valeur est true, enregistre les horodatages de l'oplog dansmonstache.monstacheafin que la synchronisation puisse reprendre après un redémarrage sans perte de données. Défini automatiquement surtruelorsquecluster-nameest configuré. Consultez resume.resume-strategyStratégie de reprise (valide uniquement lorsque resumeest défini surtrue). La valeur0utilise les horodatages. Consultez resume-strategy.verboseLorsque la valeur est true, active la journalisation détaillée, y compris les traces des requêtes Elasticsearch. La valeur par défaut estfalse.cluster-nameActive le mode haute disponibilité. Les processus Monstache partageant le même cluster-namese coordonnent entre eux. Consultez cluster-name.mappingRemplace le nom d'index par défaut (qui est database.collection). Consultez Index Mapping.RemarqueMonstache prend en charge de nombreux autres paramètres de configuration. Pour les scénarios avancés tels que la transformation basée sur des scripts, l'indexation GridFS ou le filtrage complexe, consultez Monstache config et Advanced.
-
Démarrez Monstache.
monstache -f config.tomlL'indicateur
-fcharge le fichier de configuration spécifié. Étant donné queverbose = trueest défini dans la configuration, Monstache journalise toutes les traces de requêtes Elasticsearch.
Étape 4 : Vérifier la synchronisation des données
Utilisez la console Data Management (DMS) pour les requêtes MongoDB et la console Kibana pour les requêtes Elasticsearch.
Pour accéder à DMS, consultez Connect to a replica set instance by using DMS.
Pour accéder à Kibana, consultez Log on to the Kibana console.
Vérifiez le nombre de documents après la synchronisation complète
Exécutez les requêtes suivantes pour confirmer que le même nombre de documents apparaît dans les deux systèmes.
MongoDB :
db.hotmovies.find().count()
Sortie attendue :
[
10000
]
Elasticsearch :
GET hotmovies/_count
Sortie attendue :
{
"count" : 10000,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
}
}
Testez la synchronisation des insertions
Insérez deux documents dans MongoDB :
db.hotmovies.insert({id: 11003,title: "Beauty",overview: "How a group of IT women with high IQ become outstanding",original_language:"cn",release_date:"2020-06-17",popularity:67.654,vote_count:65487,vote_average:9.9})
db.hotmovies.insert({id: 11004,title: "Heroic Programmers",overview: "How a group of IT men with high IQ become outstanding",original_language:"cn",release_date:"2020-06-15",popularity:77.654,vote_count:85487,vote_average:11.9})
Interrogez Elasticsearch pour confirmer que les documents ont été synchronisés :
GET hotmovies/_search
{
"query": {
"bool": {
"should": [
{"term":{"id":"11003"}},
null
]
}
}
}

Testez la synchronisation des mises à jour
Mettez à jour un document dans MongoDB :
db.hotmovies.update({'title':'Beauty'},{$set:{'title':'Beautiful Programmers'}})
Interrogez Elasticsearch pour confirmer la mise à jour :
GET hotmovies/_search
{
"query": {
"match": {
"id":"11003"
}
}
}

Testez la synchronisation des suppressions
Supprimez les documents de MongoDB :
db.hotmovies.remove({id: 11003})
db.hotmovies.remove({id: 11004})
Interrogez Elasticsearch pour confirmer que les documents ont disparu :
GET hotmovies/_search
{
"query": {
"bool": {
"should": [
{"term":{"id":"11003"}},
null
]
}
}
}

Étape 5 : Analyser les données dans Kibana
Ce tutoriel utilise Kibana V6.7.0. La navigation peut différer selon les versions.
Connectez-vous à la console Kibana. Pour plus de détails, consultez Log on to the Kibana console.
-
Créez un modèle d'index.
Dans le volet de navigation de gauche, cliquez sur Management.
Dans la section Kibana, cliquez sur Index Patterns.
Cliquez sur Create index pattern.
Définissez le paramètre Index pattern et cliquez sur Next step.
Définissez le champ Time Filter field name sur I don't want to use the Time Filter.
Cliquez sur Create index pattern.

-
Créez un diagramme circulaire pour les 10 films les plus populaires.
Dans le volet de navigation de gauche, cliquez sur Visualize.
Cliquez sur + à côté de la zone de recherche.
Dans la boîte de dialogue New Visualization, cliquez sur Pie.

Cliquez sur le modèle d'index hotmovies.

Configurez les sections Metrics et Buckets comme indiqué.

Cliquez sur l'icône
pour appliquer la configuration. 
FAQ
Après avoir activé la haute disponibilité et augmenté la concurrence, des pertes de données surviennent. Que faire ?
Vérifiez d'abord si le cluster Elasticsearch est sain. Si le cluster est dans un état anormal, reportez-vous à la Elasticsearch FAQ pour diagnostiquer et résoudre les problèmes au niveau du cluster, puis réduisez la valeur de elasticsearch-max-conns et surveillez l'apparition d'autres pertes de données.
Si le cluster est sain, le problème provient probablement de Monstache. Consultez la documentation Monstache pour connaître les problèmes connus et les recommandations de configuration.