Commits und NRT-Suche in SolrCloud

1. Übersicht

Solr ist eine der beliebtesten Suchlösungen auf Lucene-Basis. Es ist schnell, verteilt, robust, flexibel und hat eine aktive Entwicklergemeinschaft. SolrCloud ist die neue, verteilte Version von Solr .

Eines der Hauptmerkmale hierbei ist die nahezu Echtzeitsuche (NRT) , dh, dass Dokumente für die Suche verfügbar sind, sobald sie indiziert sind.

2. Indizierung in SolrCloud

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

  • Wenn ein Client versucht, ein Dokument zu indizieren, wird dem Dokument zuerst ein Shard zugewiesen, der auf dem Hash der ID des Dokuments basiert
  • Der Client erhält die URL des Anführers dieses Shards von zookeeper, und schließlich wird die Indexanforderung an diese URL gesendet
  • Der Shard Leader indiziert das Dokument lokal, bevor es an Replikate gesendet wird
  • Sobald der Leiter eine Bestätigung von allen aktiven und wiederhergestellten Replikaten erhält, gibt er eine Bestätigung an die Indexierungsclientanwendung zurück

Wenn wir ein Dokument in Solr indizieren, wird es nicht direkt in den Index aufgenommen. Es ist in einem sogenannten tlog (Transaktionsprotokoll) geschrieben. 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 werden, dh auf der Festplatte gespeichert werden, wird das Transaktionsprotokoll wiedergegeben, wenn das System wieder hochgefahren wird, was zu einem Verlust von Dokumenten führt.

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

3. Commits in SolrCloud

Eine Festschreibungsoperation bedeutet, eine Änderung abzuschließen und diese Änderung auf der Festplatte beizubehalten. SolrCloud bietet zwei Arten von Festschreibungsvorgängen, nämlich. ein Commit und ein Soft Commit.

3.1. Commit (Hard Commit)

Ein Commit oder Hard Commit ist ein Commit, bei dem Solr alle nicht festgeschriebenen Dokumente in einem Transaktionsprotokoll auf die Festplatte löscht. Das aktive Transaktionsprotokoll wird verarbeitet und anschließend eine neue Transaktionsprotokolldatei geöffnet.

Außerdem wird eine Komponente namens Sucher 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 durch Aufrufen der Festschreibungs- API ausgeführt werden:

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 als autoCommit automatisiert werden, indem es in der Datei solrconfig.xml angegeben wird (siehe Abschnitt 3.4).

3.2. SoftCommit

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

Während eines Softcommits wird das Transaktionsprotokoll nicht abgeschnitten, es wächst weiter. Es wird jedoch ein neuer Sucher geöffnet , der die Dokumente seit dem letzten Softcommit für die Suche sichtbar macht. Außerdem sind einige der Caches der obersten Ebene in Solr ungültig, sodass es sich nicht um eine völlig kostenlose Operation handelt.

Wenn wir die maxTime 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 Festschreibung durchsuchbar gemacht werden können. Softcommit kann nur als autoSoftCommit ausgelöst werden, indem es in der Datei olrconfig.xml angegeben wird (siehe Abschnitt 3.4).

3.3. Autocommit und Autosoftcommit

Die Datei solrconfig.xml ist eine der wichtigsten Konfigurationsdateien in SolrCloud. Es wird zum Zeitpunkt der Erstellung der Sammlung generiert. Um autoCommit oder autoSoftCommit 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 einem Festschreibungsvorgang ein neuer Sucher geöffnet werden soll oder nicht. Wenn dies der Fall ist , wird nach einem Commit der alte Sucher geschlossen und ein neuer Sucher geöffnet, wodurch das festgeschriebene Dokument für die Suche sichtbar wird. Wenn es falsch ist , steht das Dokument nach dem Commit nicht für die Suche zur Verfügung.

4. Nahezu Echtzeitsuche

Nahezu Echtzeitsuche wird in Solr mithilfe einer Kombination aus Commit und Softcommit durchgeführt. Wie bereits erwähnt, wird ein Dokument, das Solr hinzugefügt wird, erst in den Suchergebnissen angezeigt, wenn es dem Index zugewiesen wurde.

Normale Commits sind kostspielig, weshalb Softcommits nützlich sind. Da softcommit die Dokumente jedoch nicht beibehält, müssen wir das Intervall für die automatische Festschreibung maxTime (oder maxDocs ) auf einen angemessenen Wert festlegen , abhängig von der erwarteten Last.

4.1. Echtzeit-G et s

Es gibt eine weitere Funktion von Solr, die tatsächlich in Echtzeit ausgeführt wird - die get- API. Die get- API kann uns ein Dokument zurückgeben, das noch nicht einmal festgeschrieben ist.

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

However, like all too-good things, there is a catch here. We need to pass the id of the document in the get API call. Of course, we can provide other filter queries along with the id, but without id, the call doesn't work:

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

5. Conclusion

Solr provides quite a bit of flexibility to us regarding tweaking the NRT capability. To get the best performance out of the server, we need to experiment with the values of commits and softcommits, based upon our use case and expected load.

We shouldn't keep our commit interval too long, or else our transaction log will grow to a considerable size. We shouldn't execute our softcommits too frequently though.

Es wird außerdem empfohlen, vor Beginn der Produktion einen ordnungsgemäßen Leistungstest unseres Systems durchzuführen. Wir sollten prüfen, ob die Dokumente innerhalb unseres gewünschten Zeitintervalls durchsuchbar werden.