Aktualisieren gegen Spülen

78

Wenn ein neues Dokument im Elasticsearch-Index indiziert ist, kann es etwa 1 Sekunde nach dem Indexvorgang durchsucht werden. Es kann jedoch erzwungen werden, dieses Dokument sofort durch Aufrufen _flushoder _refreshOperation auf Index durchsuchbar zu machen . Was ist der Unterschied zwischen diesen beiden Operationen - das Ergebnis scheint für sie das gleiche zu sein, das Dokument ist sofort durchsuchbar.

Was genau macht jede dieser Operationen?

Die ES-Dokumentation scheint dieses Problem nicht tiefgreifend anzugehen.

scdmb
quelle

Antworten:

122

Die Antwort, die Sie erhalten haben, ist richtig, aber ich denke, es lohnt sich, etwas näher darauf einzugehen.

Eine Aktualisierung ruft effektiv ein erneutes Öffnen des Lucene-Index-Lesegeräts auf, sodass der Zeitpunkt-Snapshot der Daten, nach denen Sie suchen können, aktualisiert wird. Diese Lucene-Funktion ist Teil der Lucene-Echtzeit-API.

Eine Elasticsearch-Aktualisierung stellt Ihre Dokumente für die Suche zur Verfügung, stellt jedoch nicht sicher, dass sie auf die Festplatte in einen dauerhaften Speicher geschrieben werden, da sie nicht fsync aufruft und somit keine Haltbarkeit garantiert. Was Ihre Daten dauerhaft macht, ist ein Lucene-Commit, das viel teurer ist.

Während Sie lucene reopen jede Sekunde aufrufen können, können Sie mit lucene commit nicht dasselbe tun.

Über lucene können Sie dann neue Dokumente nahezu in Echtzeit für die Suche bereitstellen, indem Sie häufig reopen aufrufen. Sie müssen jedoch weiterhin commit aufrufen, um sicherzustellen, dass die Daten auf die Festplatte geschrieben und synchronisiert werden, wodurch sie sicher sind.

Elasticsearch löst dieses "Problem", indem ein Transaktionsprotokoll pro Shard (effektiv ein Lucene-Index) hinzugefügt wird, in dem Schreibvorgänge gespeichert werden, die noch nicht festgeschrieben wurden. Das Transaktionsprotokoll ist synchronisiert und sicher, sodass Sie jederzeit Haltbarkeit erhalten, auch für Dokumente, die noch nicht festgeschrieben wurden. Sie können nahezu in Echtzeit nach Dokumenten suchen, da die Aktualisierung automatisch jede Sekunde erfolgt. Außerdem können Sie sicher sein, dass das Transaktionsprotokoll bei einem Fehler erneut abgespielt werden kann, um eventuell verlorene Dokumente wiederherzustellen. Das Schöne am Transaktionsprotokoll ist, dass es intern für andere Zwecke verwendet werden kann, beispielsweise um eine Echtzeit- Get-by-ID bereitzustellen .

Ein Elasticsearch-Flush löst effektiv ein Lucene-Commit aus und leert auch das Transaktionsprotokoll, da die Haltbarkeit durch Lucene selbst garantiert werden kann, sobald Daten auf Lucene-Ebene festgeschrieben wurden. Flush wird auch als API angezeigt und kann optimiert werden, obwohl dies normalerweise nicht erforderlich ist. Das Leeren erfolgt automatisch, je nachdem, wie viele Vorgänge dem Transaktionsprotokoll hinzugefügt werden, wie groß sie sind und wann das letzte Leeren stattgefunden hat.

Javanna
quelle
7
Ich habe Scan & Scroll verwendet, um meine Daten von meinem alten Index in einen neuen Index umzuwandeln. Unmittelbar nach Abschluss rufe ich an _flushund / oder _refreshund rufe dann die _countAPI an, um die Anzahl der Dokumente im alten und im neuen zu vergleichen , wobei ich erwarte, dass sie gleich sind. Aber es ist nicht. Ich muss diese APIs viele Male in einer Schleife aufrufen (mit einer Pause von 1 Sekunde am Ende jeder Iteration), bis elasticsearch endlich die richtige Anzahl von Dokumenten erhält. Gibt es eine Möglichkeit, eine API aufzurufen und zu bestätigen, dass die Dokumentanzahl korrekt ist?
Foresightyj
ps Ich habe refresh_interval auf 30s gesetzt, aber die Frage bleibt gültig.
Foresightyj
@javanna, Werden die Daten nach einem Lucene-Commit in den Formularsegmenten in den Shards auf der Festplatte gespeichert?
Siddu
27

Durch eine Aktualisierung wird ein neues Segment geschrieben, sodass es für die Suche verfügbar ist.

Ein Flush führt zu einem Lucene-Commit. Das ist viel teurer.

Für weitere Details habe ich einen Artikel geschrieben, der einige davon behandelt: Elasticsearch von unten nach oben :)

Alex Brasetvik
quelle
5
  1. Aktualisieren: Transformiert den In-Memory-Puffer in ein In-Memory-Segment, das durchsucht werden kann.
  2. Flush: (a) Zusammenführen kleiner Segmente zu einem großen Segment. (b) Synchronisieren des großen Segments mit der Festplatte. (c) Leeres Translog.

Aktualisieren :

Aktualisierung

Spülen :

spülen

Segment ist ein Teil von Lucene. Unveränderliche Segmente machen OS-Seiten-Caches immer sauber.

Translog ist ein Teil von Elasticsearch. Translog ist auf Langlebigkeit ausgerichtet.

Referenz:

  1. Leitfaden zum Aktualisieren und Löschen von Vorgängen in Elasticsearch
  2. Offizielles Dokument, um das Dokument dauerhaft zu machen
g10guang
quelle