Commits und NRT-Suche in SolrCloud

Commits und NRT-Suche in SolrCloud

1. Überblick

Solr ist eine der beliebtesten auf Lucene basierenden Suchlösungen. Es ist schnell, verteilt, robust, flexibel und hat eine aktive Entwicklergemeinschaft. SolrCloud is the new, distributed version of Solr.

One of its key features here is the near real-time (NRT) search, d. h. Dokumente, die alssoon für die Suche verfügbar sind, wenn sie indiziert sind.

2. Indizierung in SolrCloud

Eine Sammlung in Solr besteht aus mehreren Shards, und jeder Shard verfügt über verschiedene Replikate. Beim Erstellen einer Sammlung wird eine der Repliken eines Shards als Anführer für diesen Shard ausgewählt:

  • Wenn ein Client versucht, ein Dokument zu indizieren, wird dem Dokument zuerst ein Shard zugewiesen, der auf dem Hash derid des Dokuments basiert

  • Der Client erhält die URL des Anführers dieses Shards vom Zookeeper, und schließlich wird die Indexanforderung an diese URL gesendet

  • Der Shard-Leiter indiziert das Dokument lokal, bevor es an Replikate gesendet wird

  • Sobald der Leiter eine Bestätigung von allen aktiven und wiederherstellenden Replikaten erhält, gibt er eine Bestätigung an die Indizierungsclientanwendung zurück

When we index a document in Solr, it doesn’t go to the index directly. It’s written in what is called a tlog (transaction log). Solr verwendet das Transaktionsprotokoll, um sicherzustellen, dass Dokumente bei einem Systemabsturz nicht verloren gehen, bevor sie festgeschrieben werden.

Wenn das System abstürzt, bevor die Dokumente im Transaktionsprotokoll festgeschrieben wurden, d. H. Auf der Festplatte gespeichert wurden, wird das Transaktionsprotokoll beim erneuten Starten des Systems erneut abgespielt, was zu einem Verlust von Dokumenten von null führt.

Jede Index- / Aktualisierungsanforderung wird im Transaktionsprotokoll protokolliert, das weiter wächst, bis ein Commit ausgegeben wird.

3. Commits in SolrCloud

Die Operation voncommitbedeutet, eine Änderung abzuschließen und diese Änderung auf der Festplatte beizubehalten. SolrCloud bietet zwei Arten von Festschreibungsoperationen, nämlich. ein Commit und ein Soft Commit.

3.1. Commit (Hard Commit)

Ein Commit oder ein Hard-Commit ist ein Commit, bei dem Solr alle nicht festgeschriebenen Dokumente in einem Transaktionsprotokoll auf die Festplatte schreibt. The active transaction log is processed, and then a new transaction log file is opened.

Außerdem wird eine Komponente, die als Sucher bezeichnet wird, aktualisiert, sodass die neu festgeschriebenen Dokumente für die Suche verfügbar werden. Ein Sucher kann als schreibgeschützte Ansicht aller festgeschriebenen Dokumente im Index betrachtet werden.

Die Festschreibungsoperation kann ausschließlich vom Client ausgeführt werden, indem diecommit-API aufgerufen wird:

String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
  .withZkHost(zkHostString)
  .build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();

Entsprechend kann es alsautoCommit automatisiert werden, indem es in der Dateisolrconfig.xml angegeben wird (siehe Abschnitt 3.4).

3.2. SoftCommit

Ab Solr 4 wurde Softcommit hinzugefügt, um vor allem die NRT-Funktion von SolrCloud zu unterstützen. Dies ist ein Mechanismus, mit dem Dokumente nahezu in Echtzeit durchsucht werden können, indem die kostspieligen Aspekte harter Commits übersprungen werden.

During a softcommit, the transaction log is not truncated, it continues to grow. However, a new searcher is opened, wodurch die Dokumente seit dem letzten Softcommit für die Suche sichtbar werden. Außerdem sind einige der Caches der obersten Ebene in Solr ungültig, sodass dies kein völlig kostenloser Vorgang ist.

Wenn wirmaxTime für softcommit als 1000 angeben, bedeutet dies, dass das Dokument spätestens 1 Sekunde nach dem Zeitpunkt der Indizierung in Abfragen verfügbar ist.

Diese Funktion bietet SolrCloud die Möglichkeit, nahezu in Echtzeit zu suchen, da neue Dokumente auch ohne Commit durchsuchbar gemacht werden können. Softcommit kann nur alsautoSoftCommit ausgelöst werden, indem es in der Datei solrconfig.xmlangegeben wird (siehe Abschnitt 3.4).

3.3. Autocommit und Autosoftcommit

Diesolrconfig.xml-Datei ist eine der wichtigsten Konfigurationsdateien in SolrCloud. Sie wird zum Zeitpunkt der Kollektionserstellung generiert. UmautoCommit oderautoSoftCommit zu aktivieren, müssen die folgenden Abschnitte in der Datei aktualisiert werden:


  10000
  30000
  true



  6000
  1000

maxTime: Die Anzahl der Millisekunden seit dem frühesten nicht festgeschriebenen Update, nach dem das nächste Festschreiben / Softcommit erfolgen soll.

maxDocs: Die Anzahl der Aktualisierungen, die seit dem letzten Festschreiben aufgetreten sind und nach denen das nächste Festschreiben / Softcommit erfolgen soll.

openSearcher: Diese Eigenschaft teilt Solr mit, ob nach einer Festschreibungsoperation ein neuer Sucher geöffnet werden soll oder nicht. If it’s true, after a commit, the old searcher is closed, and a new searcher is opened, making the committed document visible for searching, Wenn esfalse ist, ist das Dokument nicht für die Suche nach dem Festschreiben verfügbar.

Nahezu Echtzeitsuche wird in Solr durch eine Kombination aus Festschreiben und Softcommit erreicht. Wie bereits erwähnt, wird ein Dokument beim Hinzufügen zu Solr erst in den Suchergebnissen angezeigt, wenn es für den Index übernommen wurde.

Normale Commits sind teuer, weshalb Softcommits nützlich sind. Da Softcommit die Dokumente jedoch nicht beibehält, müssen wir das Intervall für das automatische FestschreibenmaxTime(odermaxDocs) auf einen angemessenen Wert einstellen, abhängig von der erwarteten Last.

4.1. Echtzeit Gets

Es gibt eine weitere Funktion von Solr, die tatsächlich in Echtzeit ausgeführt wird - dieget-API. The get API can return us a document that is not even soft committed yet.

Es wird direkt in den Transaktionsprotokollen gesucht, wenn das Dokument nicht im Index gefunden wird. So können wir den API-Aufruf vongetunmittelbar nach der Rückkehr des Indexaufrufs auslösen und das Dokument weiterhin abrufen.

Wie bei allzu guten Dingen gibt es hier jedoch einen Haken. We need to pass the id of the document in the get API call. Natürlich können wir nebenid auch andere Filterabfragen bereitstellen, aber ohneid funktioniert der Aufruf nicht:

http://localhost:8985/solr/myCollection/get?id=1234&fq=name:example

5. Fazit

Solr bietet uns einiges an Flexibilität bei der Optimierung der NRT-Funktionen. Um die bestmögliche Leistung des Servers zu erzielen, müssen wir anhand unseres Anwendungsfalls und der erwarteten Auslastung mit den Werten von Commits und Softcommits experimentieren.

We shouldn’t keep our commit interval too long, or else our transaction log will grow to a considerable size. Wir sollten unsere Softcommits jedoch nicht zu häufig ausführen.

Es wird auch empfohlen, eine ordnungsgemäße Leistungsprüfung unseres Systems durchzuführen, bevor wir in die Produktion gehen. Wir sollten überprüfen, ob die Dokumente innerhalb unseres gewünschten Zeitintervalls durchsuchbar sind.