Bild-Schulung-Solr-in-a-Nutshell

Externe Zookeeper / Neuer Artikel der Blogserie “SolrCloud – Tipps, Tricks und Pitfalls”

Wie bereits beschrieben, kann die SolrCloud sowohl mit integriertem ZooKeeper als auch mit einem externen ZooKeeper (Ensemble) betrieben werden. Bei der Funktionalität der SolrCloud gibt es bei diesen beiden Möglichkeiten keine Unterschiede; technisch gesehen, bieten externe ZooKeeper die Möglichkeit die Ausfallsicherheit zu erhöhen, wenn man Solr und ZooKeeper auf getrennten Systemen einsetzt.

Die aktuelle Version vom Zookeeper 3.4.5 kann unter folgendem Link (https://zookeeper.apache.org/releases.html) heruntergeladen werden. Ähnlich wie beim Solr, reicht es aus, das Archiv zu entpacken, um mit einem kleinen JAVA-Aufruf eine ZooKeeper Instanz zu starten. Folgender Befehl muss hierzu ausgeführt werden:

java org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo_sample.cfg

Über diesen Mechanismus lassen sich natürlich auch mehrere ZooKeeper Instanzen starten; analog, wie ich es im Blog-Beitrag „Die lokale SolrCloud“ skizziert habe. Jede Instanz des ZooKeeper braucht hierbei eine eigene Konfiguration, welche über die CFG-Datei (zoo_sample.cfg) spezifiziert wird.
Für ein Produktivsystem sollte man diesen Weg jedoch nicht gehen, sondern ZooKeeper ebenfalls als Dienst einrichten.

Zookeeper Konfiguration


Eine einfache Konfiguration für den ZooKeeper wird im Release mitgeliefert und findet sich im Conf-Verzeichnis des entpackten Archives. Die Konfiguration entschiedet, wie der ZooKeeper arbeitet, wo er Daten ablegt oder ob er beispielsweise ein Teil eines Ensembles ist. Für den Fall, dass er ein Bestandteil eines Ensembles ist, muss im Daten-Verzeichnis (dataDir) eine Datei mit dem Namen „myid“ – ohne Datei-Suffix – angelegt werden. In dieser Datei wird nur eine ID eingetragen, welche die ZooKeeper Instanz identifiziert. Üblicherweise handelt es sich hierbei um eine Zahl.
Die wichtigsten Parameter der Konfigurationsdatei sind folgende:

  • tickTime – Gibt die Zeit in Millisekunden an, die ein Tick dauern soll
  • initLimit – Zeit in Ticks, die der Server für die Verbindung zum Leader zulässt
  • syncLimit – Zeit in Ticks, die der Server wartet, bevor er sich mit Hilfe des Leader updatet
  • clientPort – Port, unter dem Solr auf den ZooKeeper zugreift
  • dataDir – Verzeichnis, in dem der ZooKeeper Daten bzgl. des Clusters speichert
  • dataLogDir – Verzeichnis, in dem der ZooKeeper Daten bzgl. des Logging speichert
  • server.X – Orte der Ensemble Mitglieder im Netzwerk. X ist die ID in der myid- Datei des entsprechenden Server

Folgendes Beispiel ist für eine ZooKeeper Instanz eines Ensembles mit drei ZooKeeper gedacht:

tickTime=2000
 initLimit=10
 syncLimit=5
 dataDir=/zookeeper345_zoo1
 dataLogDir=/zookeeper345_zoo1/logs
 clientPort=2181
 server.1=mk_mobil:7001:8001
 server.2=mk_mobil:7002:8002
 server.3=mk_mobil:7003:8003

Quorum

Fällt der ZooKeeper aus, ist die komplette SolrCloud “offline”, auch wenn die Solr Instanzen alle noch online sind. Die einzelnen Solr Instanzen lassen sich zwar noch einzeln ansprechen, jedoch ist die ganze Cloud-Funktionalität, wie beispielsweise verteilte Indexierung, nicht mehr verfügbar. Um hier eine höhere Ausfallsicherheit zu erreichen, bietet sich das bereits erwähnte ZooKeeper Ensemble an, also mehrere ZooKeeper Instanzen, die sich gegenseitig kennen und synchronisieren. Optimaler Weise sind diese auch noch auf verschiedene Server verteilt. Damit solch ein ZooKeeper Ensemble zuverlässig funktioniert, muss immer mehr als die Hälfte der ZooKeeper erreichbar sein. Das heißt, dass bei drei ZooKeeper zwei immer da sein müssen. Für dieses sogenannte Quorum lässt sich folgende kleine Formel definieren:
Anzahl zkHosts/2 + 1
Es empfiehlt sich hierbei eine ungerade Anzahl von ZooKeeper Instanzen (3,5 oder 7) einzusetzen. Die genaue Anzahl hängt davon ab, wie ausfallsicher man das Ensemble gestalten möchte.

Fazit

Für den Einsatz in der Entwicklung oder für Tests kann man auf externe ZooKeeper getrost verzichten, da die Einrichtung und Konfiguration doch einen nicht geringen Aufwand verlangt. Für den Produktiveinsatz jedoch sollte man auf die Trennung von Solr und ZooKeeper nicht verzichten. Ein kleines externes ZooKeeper Ensemble und separate Solr Instanzen sind die beste Wahl für eine stabile und skalierbare SolrCloud.

Weiterführende Links

Johannes Brucher

Johannes Brucher