Blog der SHI GmbH

Lots Of Cores / Neuer Artikel der Blogserie “Neuerungen rund um Solr”

Solr unterstützt MultiCore SetUps, d.h. eine Solr Instanz kann mehrere SolrCores gleichzeitig verwalten. Dies bietet viel Flexibilität bei der Nutzung von Solr bzw. der SolrCloud.

Aktuell gibt es Bestrebungen hier noch ein paar Verbesserungen, vor allem im Cache Management, zu implementieren, denn momentan müssen erst alle Cores beim Start geladen werden bevor die Solr Instanz fertig geladen und somit verfügbar ist. Einige der Änderungen sind bereits in Solr 4.0 bzw. Solr 4.1 implementiert, andere werden mit den nächsten Versionen kommen.

Core Lazy Loading

Eine von den Neuerungen, die besonders erwähnenswert ist, ist die Möglichkeit das Laden von SolrCores zu beeinflussen und so, beispielsweise, die StartUp-Zeit von Solr zu reduzieren. Hierfür wurden einige Erweiterungen in Klassen CoreContainer und CoreAdminHandler durchgeführt. Konfiguriert wird dies über die solr.xml.

Für das <core> Tag kamen folgende zwei neue Properties hinzu:

  • loadOnStartup – definiert, ob das Core beim Start der Solr Instanz komplett geladen wird; Default-Wert ist true; hiermit kann man die Startzeit des Solr beeinflussen
  • transient – definiert, ob das Core wieder aus dem Speicher geworfen werden kann; Default-Wert ist false; hiermit kann man den Speicherbedarf der Solr Instanz beeinflussen

Beide Default Einstellungen spiegeln das bisherige Verhalten wieder, d.h. jedes Core wird beim Start vollständig geladen und bleibt auch im Speicher. Durch beide Properties ergeben sich vier unterschiedliche Konfigurationen, die unterschiedliche Einsatzzwecke haben:

  • loadOnStartup=true / transient=false
    • aktueller Fall
    • das Core soll immer im Speicher zur Verfügung stehen
    • eignet sich für Solr Instanzen mit wenigen Cores
  • loadOnStartup=true / transient=true
    • das Core soll direkt nach dem Start zur Verfügung stehen, kann jedoch wieder aus dem Speicher gelöscht werden
  • loadOnStartup=false / transient=false
    • das Core wird nicht beim Start geladen, aber wenn er einmal geladen wurde, wird er nicht mehr aus dem Speicher gelöscht
    • eine eher fragwürdige Kombination
  • loadOnStartup=false / transient=true
    • das SolrCore wird nicht beim Start geladen, kann aber auch wieder aus dem Speicher gelöscht werden
    • eignet sich für viele Cores, die nicht permanent alle durchsucht werden

In Zusammenspiel von loadOnStartup und transient und einem weiteren Property transientCacheSize kann der Speicherbedarf nochmals optimiert werden. Dieses dritte Property wird im <cores> Tag gesetzt und beeinflusst, wie viele Cores im Cache verbleiben. Wird die maximale Anzahl erreicht, wird eins der SolrCores, die mit transient=“true“markiert sind, nach dem Least Recently Used Prinzip (LRU) aus dem Cache entfernt, so dass ein neues Core geladen werden kann.

Beispiel

Die nachfolgende Konfiguration einer solr.xml ist ein Beispiel für die unterschiedliche Konfiguration von SolrCores.

< ?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="true" sharedLib="lib">
  <cores adminPath="/admin/cores">
	<core instanceDir="core1" name="core1" loadOnStartup="false" transient="true"/>
	<core instanceDir="core2" name="core2" loadOnStartup="true" transient="false"/>
  </cores>
</solr>
Weiterführende Links
Johannes Brucher

Johannes Brucher