2017-02-20 4 views
1

Unsere ES ist ziemlich langsam, wir haben es noch nicht optimiert (und die Abfrage), aber nach this link, Anfrage Ablehnung von Elastic ist eine Form einer Rückmeldung, die verlangsamt und passt die Größe der Masse.Elastic gibt inkonsistente Ergebnisse unter Stress

Wir haben eine Form eines Gegendrucks erstellt, bei der die Größe einer blockierenden Menge (eine Liste der gleichzeitig gesendeten Einzelanfragen, die wir MSearch noch nicht verwenden) davon abhängt, wie viele Anfragen in der vorherigen Menge abgelehnt wurden. Wir warten, bis der aktuelle Bulk fertig ist, bevor wir einen neuen starten. Offensichtlich werden alle abgelehnten Anforderungen in die Anforderungswarteschlange (in Form von Daten, die zum Konstruieren der Abfrage benötigt werden) erneut eingefügt. Zum Beispiel, wenn unser Elastic 500 gleichzeitige Anfragen bearbeiten kann und wir 600 senden, werden einige von ihnen abgelehnt und die neue Größe wird auf 480 reduziert (20% Rabatt).

Was wir herausgefunden haben, war, dass ES andere Ergebnisse für die zuvor abgelehnten Anfragen zurückgibt. Zum Beispiel kann es etwas wie das erwartete Ergebnis, aber mit einem Offset von 2 zurückgeben. Wir haben auch Ergebnisse fehlen, wo eine Adresse 1 Ergebnis haben sollte, aber keine aufgrund dieses Fehlers hat.

Wenn die Bulk-Größe kleiner als der Schwellenwert ist, den ES verarbeiten kann, verläuft alles wie erwartet und wir erhalten die erwarteten Ergebnisse.

Es sieht nicht so aus, als wäre es das Problem der Bibliothek (elastic4s).

Elastic Konfiguration: -2-Knoten mit jeweils 5 shards

pro Knoten: 2 CPU, 32 GB RAM, 16 GB Heap. Alles andere ist Standard

Ich konnte keine Informationen im Internet finden, hatte jemand dieses Problem? Was war die Lösung?

Was wir bisher versucht:

  • Thread.sleep zwischen bulks wie die Verbindung schlägt oben.

  • Cache sowohl auf Abfrageebene entfernen als auch aus dem Index entfernen.

  • Den gleichen Index auf einer anderen (langsameren) Hardware versuchen.

  • Verifiziert, dass es kein Race-Condition (in unserem Code) Problem ist.

Update:

Was the query mögen.

Thema Pool für die Suche: "search" : { "type" : "fixed", "min" : 4, "max" : 4, "queue_size" : 1000 },

2. UPDATE:

Wir haben auch versucht Vorzug unserer Abfrage-Einstellung (denken, dass es ein Problem mit Scherben war): .preference(Preference.Primary) ohne positives Ergebnis (sie waren sogar zufälliger als zuvor). Zwei aufeinanderfolgende Läufe mit dieser Einstellung ergeben unterschiedliche "zufällige" Ergebnisse, was nicht konsistent ist.

Antwort

0

Der Grund für inkonsistente Ergebnisse war, dass Elastic mit Success antwortet, wenn mindestens 1 Shard ein Ergebnis hatte.Wenn also nur einer unserer 5 Shards erfolgreich war, würde die Anfrage mit nur 20% der Daten ein erfolgreiches Ergebnis liefern.

Wie gesehen here und here, dies ist kein Fehler, das ist eine Funktion. Elastic zieht es vor, etwas (wenn auch inkonsistentes) Ergebnis zurückzugeben, anstatt nichts zurückzugeben.

Die Lösung für dieses Problem wird entweder nur eine Scherbe zu verwenden oder mehr als 0 ausgefallen Scherben als allgemeines Anforderung Versagen zu behandeln folgendes Objekt verwenden, das jede Antwort hat ES:

"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },

Verwandte Themen