Optimierung der Übertragung von Dokumenten nach ElasticSearch über den MongoDB River

Post date: Jun 2, 2013 8:07:49 AM

Wenn Deine Daten bereits in der MongoDB gespeichert sind und Du willst von den Search-Fähigkeiten des Elastic Search profitieren, dann kannst Du den MongoDB River Plugin der von der folgenden Webseite https://github.com/richardwilly98/elasticsearch-river-mongodb heruntergeladen werden kann verwenden, um die Bulk-Übertragung zwishen diesen zwei Quellen zu implementieren. Die Architektur besteht aus einem MongoDB Replicaset mit 3 Knoten und einem Elastic Search Cluster der jedenfalls 3 Knoten beträgt. Diese zwei Cluster können lokal lanciert werden. Um die Daten-Übertragung zu gewährleisten, sind die Installierung der oben-erwähnten Plugins und die Ausführung der folgenden Schritte notwendig:

1) Erstelle die Mapping-Konfiguration für deinen "_river" durch die Spezifizierung der MongoDB bezogenen Daten wie z.B. die Datenbank, die Collection und die Anmeldedaten die der Authentifizierung dienen sollten und durch die Spezifizierung des Indexnamen für Elastic Search der erstellt werden soll mit dem Zweck die Dokumenten aus MongoDB zu speichern. Standardmäßig die Bulk-Size die von dem River Indexer verwendet wird beträgt 100 Dokumente pro Sekunde. Diese Einstellung ist eine Best Effort Basis Spezifizierung so dass es durchaus möglich ist, dass der Indexer wenigere Dokumenten pro Sekunde indizieren kann. Die Antwortzeiten sind von der aktuellen Anzahl der Dokumente und von deren Größe abhängig. Eine solche mongo_transfer_config.json würde wie in dem folgenden Ausschnitt aussehen:

{

"type": "mongodb",

"mongodb": {

"servers": [

{"host": "localhost", "port": 27111},

{"host": "localhost", "port": 27112},

{"host": "localhost", "port": 27113}

],

"credentials": [

{ db: "admin", user: "adminUser", password: "adminPassword" },

],

"db": "library",

"collection": "books"

},

"index": {

"name": "mongo_books"

}

}

2) Erstelle den _river Index mit der folgenden Kommandozeile:

curl -XPUT 'localhost:9200/_river/mongolink/_meta' -d @../config/mongo_transfer_config.json

3) Überprüfe dass der _river Index erfolgreich erstellt wurde:

curl -XGET 'localhost:9200/_river/mongolink/_status?pretty'

4) Überprüfe wie viele Dokumenten im Elastic Search (in dem Index die vorher über die _river Meta-Information konfiguriert wurde) indiziert wurden:

curl -XGET 'localhost:9200/mongo_books/_count?pretty'

5) Für 1 Million Dokumente ist es durchaus möglich dass für die Verarbeitung dieser Dokumente man lange warten muss, z.B. länger als eine Stunde. Um diese Antwortzeiten zu optimieren kann man den Index löschen und ihn wiederherstellen (diesmal mit einem anderen Wert für die Bulk- Size, z.B. 500 wie unten veranschaulicht):

{

"type": "mongodb",

"mongodb": {

"servers": [

{"host": "localhost", "port": 27111},

{"host": "localhost", "port": 27112},

{"host": "localhost", "port": 27113}

],

"credentials": [

{ db: "admin", user: "adminUser", password: "adminPassword" },

],

"db": "library",

"collection": "books"

},

"index": {

"name": "mongo_books",

"bulk_size": 500

}

}

In der Elastic Search Log-Datei kann man beobachten wie viele Dokumente pro Sekunde bearbeitet wurden und es ist möglich dass der Indexer die spezifizierte Anzahl von Dokumenten pro Sekunde nicht bearbeiten kann. Ein Wert kann öfter als andere auftauchen und dieser Wert gibt Dir die Optimierungsgrenze (auf diese Ebene weningstens). Ab diesem Wert, Gewinne für Antwortzeiten durch Optimierung auf diese Ebene können nicht mehr erzielt werden und das bedeutet dass es höchste Zeit ist, andere Möglichkeiten (wie die Erhöhung der Hardware-Ressourcen oder das angebrachte Tuning auf Elastic Search-Ebene) zu betrachten.