2017-10-25 7 views
1

Ich bin dabei, unsere Daten von einer Cloudant-Instanz in eine andere zu verschieben. Als eine gute Möglichkeit zum Verschieben von Daten habe ich Replikationsdokumente für die fortlaufende Replikation erstellt. Die meisten von ihnen replizieren alle Dokumente (wie erwartet, da ich keine Filter verwendet habe), aber einige überspringen mehrere Dokumente.Cloudant-Replikation überspringt einige Dokumente

Die 2 Datenbanken mit Problemen speichern nur neue Dokumente (keine Updates, keine Löschungen). Nach der Untersuchung der größeren db (> 30 Mio docs) ist mir aufgefallen, dass nur nach einem bestimmten Datum erstellte Dokumente übersprungen werden. Die meisten Tage seit diesem Datum verpassen etwa 1/3 der erstellten Dokumente. Gelegentlich bemerkte ich Fehler im Replikationsdokument, die in der Regel schnell wieder verschwanden und der Status wieder auf 'Ausgelöst' gesetzt wurde.

Die worker_died Fehlermeldung wird als {[{<<"error">>,<<"too_large">>}, {<<"reason">>,<<"the request entity is too large">>}]} gemeldet. Die Quelldatenbank enthält keine Hinweise auf Probleme.

Wie kann ich dieses Problem beheben?

Antwort

1

Es klingt, als würden Sie von einem älteren, dedizierten oder gemessenen Cloudant-Konto auf eine neuere Instanz von IBM Bluemix Public replizieren. Bei den älteren Instanzen beträgt die maximale Anforderungsgröße 64 Mio., während bei den neueren Instanzen diese Beschränkung auf 1 Mio. reduziert wird. Diese Diskrepanz ist wahrscheinlich das Problem.

Während der Replikation werden Dokumente beim Schreiben in die Quelle gestapelt. Vorausgesetzt, dass Ihre Dokumente selbst kleiner als 1M sind, sollten Sie in der Lage sein, die Stapelgröße so anzupassen, dass sie unter die 1M-Anforderungslimitgröße passt. Die Batch-Größe ist standardmäßig auf 500 eingestellt. Dies kann jedoch mit dem Parameter worker_batch_size geändert werden. siehe

https://console.bluemix.net/docs/services/Cloudant/api/advanced_replication.html#performance-related-options

Wenn einige Ihrer Dokumente größer sind, dass 1 M, dann sind Sie kein Glück.

+0

Danke für Ihre Antwort. Ich wusste nicht, dass eine dedizierte Cloudant-Instanz eine andere Batch-Größe verwenden würde. Ich starrte eine andere Replikation mit 'worker_batch_size = 1' an. Es wird wahrscheinlich mehrere Tage dauern, aber wenn das Ergebnis stimmt, kann ich damit leben. –

+0

Lassen Sie mich wissen, wenn es funktioniert – xpqz

0

Danke, XPQZ, Sie haben mich in die richtige Richtung geführt. Das Reduzieren der worker_batch_size allein löste die Probleme nicht, da wir einige Dokumente haben, die größer als 1 MB sind. Nach dem Hinzufügen eines weiteren Filters zum Überspringen aller Dokumente, die größer als 1 MB sind, wurden alle kleineren Dokumente repliziert. Leider überspringt Cloudant keine größeren Dokumente und bewegt sich weiter, aber es wiederholt sich, das gleiche große Dokument immer wieder zu replizieren, so dass alle nachfolgenden Dokumente niemals repliziert werden.

  • erstellen dd mit einer Größe Filter:

    "Filter": { "DOC_SIZE": „Funktion (doc, REQ) {\ r \ n if (JSON.stringify (doc) .length> 1048575) {\ r \ n return false; \ r \ n} \ r \ n return true; \ r \ n} "}

  • Addier-Filter auf die Replizierschicht doc:

    "Filter":"/doc_size ",

+0

Fühlen Sie sich frei, die Antwort zu akzeptieren, damit es anderen helfen kann. Vielen Dank! – xpqz

Verwandte Themen