2012-03-28 7 views
3

Ich habe einen Index mit ziemlich komplexen Abfragen ausgeführt wird. Die Hauptverlangsamung sind die Fuzzy-Abfragen, die für ein Feld ausgeführt werden, das 2-5 Wörter für jeden Datensatz enthält. Ich muss hauptsächlich Zeilen mit 1-3 verschiedenen Zeichen finden.Elasticsearch Fuzzy-Matching-Optimierung für riesige Server/Server-Cluster

Auf meinem 4-Kern (mit HT) und 8GB RAM-Maschine die meine Abfragen in jeweils 1-2 Sekunden ausgeführt werden. Auf einem Server mit 12 Kernen (mit HT) und 72 GB RAM wird die Abfrage in 0.3-0.5 Sekunden ausgeführt. Dies scheint mir keine vernünftige Skalierung auf der Hardware zu bieten. Ich bin mir sicher, dass es einige versteckte Optionen geben sollte, um die Abfrageleistung anzupassen.

Ich habe die elastische Suchhilfe durchgesehen, konnte aber nichts finden, was mir helfen würde, die Leistung basierend auf der Anzahl der CPUs oder des Arbeitsspeichers oder speziell für Fuzzy-Abfragen zu optimieren.

eine andere Frage ist, wie skaliert es, wenn ich einen anderen Server wie diesen hinzufügen? wird die Abfragezeit ungefähr zweimal kleiner sein?

Antwort

2

Hier gibt es ein paar Möglichkeiten. Erstens ist Ihre Abfrage E/A-gebunden. In diesem Fall kann das Hinzufügen eines anderen Servers hilfreich sein, da zwei Knoten Daten von zwei Festplatten abrufen. Eine andere Möglichkeit ist, dass Ihre Abfrage CPU-gebunden ist. Zu einem großen Teil ist die Suche nach einem einzelnen Shard ein single-threaded Prozess. Angenommen, Ihr Index wurde mit Standardeinstellungen erstellt, enthält er 5 Shards. Ihre Abfrage kann also nicht davon profitieren, dass sie auf mehr als 5 CPUs ausgeführt wird. In diesem Fall würde das Hinzufügen eines anderen Knotens die Vorgänge aufgrund des Netzwerk-Overheads nur verlangsamen. Stattdessen müssen Sie den Index mit weiteren Shards neu erstellen.

+0

also das bedeutet, wenn ich 3 Server haben jeweils 12 Kerne (24 virtuelle) dann ist die optimale Anzahl von Shards für mich etwas (3 * 12) * 1,5 = 54? oder kann die gleiche Leistungssteigerung mit Replikaten erreicht werden? BTW Ich werde mindestens Replik-Wert von 1 für Redundanz verwenden. –

+0

Wenn Sie eine einzelne Abfrage auf dem System ausführen, wird die meiste Arbeit in 5 Threads aufgeteilt (ein Thread pro Shard). Wenn Sie die zweite Abfrage starten, werden weitere 5 Threads verwendet. Mit anderen Worten, Repliken helfen nicht, wenn Sie jeweils eine Abfrage ausführen, aber sie helfen, wenn Sie viele gleichzeitige Abfragen ausführen. Allerdings würde ich davor warnen, dies als eine theoretische Übung zu betrachten, da sich der Engpass leicht von einem Teil des Systems zu einem anderen verschieben kann, abhängig von Ihren Daten und dem Verkehrsmuster. Sie sollten versuchen, echten Datenverkehr mit echten Daten zu simulieren und Engpässe zu identifizieren, indem Sie die Systemleistung messen. – imotov

+0

ok, danke viel) –