SolrCloud auf Docker
SolrCloud auf Docker Dies ist ein Folgeartikel zu meinem Beitrag Solr auf Docker. Diesmal verwenden wir einen eigenständigen ZooKeeper-Knoten und…
SolrCloud auf Docker
Dies ist ein Folgeartikel zu meinem Beitrag Solr auf Docker. Diesmal verwenden wir einen eigenständigen ZooKeeper-Knoten und drei SolrCloud-Knoten, alle in ihren eigenen Docker-Containern.
Docker Version 0.7, Build 0d078b6, auf Ubuntu 13.04.
ZooKeeper
Die aktuelle Version von ZooKeeper ist 3.4.5, und es gibt ein docker-zookeeper-Projekt, das diese Version in einer Einzelknoten-Konfiguration ausführt.
Wenn wir das in einer Instanz namens „zookeeper“ erstellen und ausführen:
cd ~
mkdir zookeeper-docker
cd zookeeper-docker
wget https://raw.github.com/jplock/docker-zookeeper/master/Dockerfile
docker build -t makuk66/zookeeper:3.4.5 .
...
Successfully built 26871fd90d0c
docker run -name zookeeper -p 2181 -p 2888 -p 3888 makuk66/zookeeper:3.4.5
Wir sehen, dass ZooKeeper gestartet wird, und nach ein paar Sekunden können wir überprüfen, ob er zufrieden ist:
$ echo ruok | nc -q 2 localhost `docker port zookeeper 2181|sed 's/.*://'`; echo
imok
SolrCloud: Verteiltes Solr
Die aktuelle Version von Solr ist 4.6.0, also laden wir diese herunter:
cd ~
mkdir solr-docker
cd solr-docker
wget http://www.mirrorservice.org/sites/ftp.apache.org/lucene/solr/4.6.0/solr-4.6.0.tgz
Diese lokal zwischengespeicherte Kopie wird dem Docker-Container zur Erstellungszeit hinzugefügt.
Erstellen Sie eine Docker-Datei:
cat > Dockerfile <<'EOM'
#
# VERSION 0.2
FROM ubuntu
MAINTAINER Martijn Koster "mak-docker@greenhills.co.uk"
ENV SOLR solr-4.6.0
RUN mkdir -p /opt
ADD $SOLR.tgz /opt/$SOLR.tgz
RUN tar -C /opt --extract --file /opt/$SOLR.tgz
RUN ln -s /opt/$SOLR /opt/solr
RUN apt-get update
RUN apt-get --yes install openjdk-6-jdk
EXPOSE 8983
CMD ["/bin/bash", "-c", "cd /opt/solr/example; java -jar start.jar"]
EOM
und bauen:
docker build -rm=true -t makuk66/solr4:4.6.0 .
wobei makuk66 mein Benutzername ist; ersetzen Sie Ihren eigenen.
Wenn Sie Ihr eigenes Image nicht erstellen möchten, können Sie makuk66/docker-solr ziehen und makuk66/docker-solr
anstelle von makuk66/solr4:4.6.0
unten verwenden.
Jetzt führen wir dies manuell mit Docker im Vordergrund aus.
Der erste Knoten bootet die Sammlung (wie das SolrCloud Beispiel A):
docker run -link zookeeper:ZK -i -p 8983 -t makuk66/solr4:4.6.0
/bin/bash -c 'cd /opt/solr/example; java -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -DnumShards=2 -jar start.jar'
Die -link zookeeper:ZK
stellt die Netzwerkinformationen des Knotens namens „zookeeper“
als Umgebungsvariablen mit dem Präfix ZK_ zur Verfügung.
und dann fangen die anderen beiden so an:
docker run -link zookeeper:ZK -i -p 8983 -t makuk66/solr4:4.6.0
/bin/bash -c 'cd /opt/solr/example; java -DzkHost=$ZK_PORT_2181_TCP_ADDR:$ZK_PORT_2181_TCP_PORT -jar start.jar'
Um alle laufenden Container anzuzeigen:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cac635ec128 makuk66/solr4:4.6.0 /bin/bash -c cd /opt 3 seconds ago Up 2 seconds 0.0.0.0:49158->8983/tcp prickly_mccarthy
bd23d3891dd6 makuk66/solr4:4.6.0 /bin/bash -c cd /opt 5 seconds ago Up 4 seconds 0.0.0.0:49157->8983/tcp high_albattani
365a17a69176 makuk66/solr4:4.6.0 /bin/bash -c cd /opt About a minute ago Up About a minute 0.0.0.0:49156->8983/tcp elegant_bardeen
13805a493a79 makuk66/zookeeper:3.4.5 /opt/zookeeper-3.4.5 25 minutes ago Up 25 minutes 0.0.0.0:49153->2181/tcp, 0.0.0.0:49154->2888/tcp, 0.0.0.0:49155->3888/tcp elegant_bardeen/ZK,high_albattani/ZK,prickly_mccarthy/ZK,zookeeper
Wir können nun einen der freigelegten Ports verwenden, um Solr zu betrachten: http://docker1:49159/solr/#/~cloud
,
, der die 3 Solr-Knoten im Cluster zeigt, die auf ihren eigenen internen IP-Adressen laufen. Toll.
Natürlich werden wir nicht glauben, dass es echt ist, wenn wir die Suche nicht in Aktion sehen.
Lassen Sie also eine weitere Docker-Instanz laufen, um einige Daten zu laden, indem Sie den Docker-Host-Port für einen der oben genannten Knoten verwenden:
docker run -link zookeeper:ZK -i -t makuk66/solr4:4.6.0 /bin/bash
cd /opt/solr/example/exampledocs
java -Durl=http://192.168.0.221:49158/solr/update -jar post.jar *.xml
und suchen:
apt-get install wget
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=solr&wt=xml'
können Sie das Gleiche direkt mit der internen Adresse tun, die Sie mit inspect
finden können:
docker inspect prickly_mccarthy
wget -O - 'http://172.17.0.37:8983/solr/collection1/select?q=solr&wt=xml'
Sie können die Scherben in Aktion sehen, indem Sie vergleichen:
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml' | sed 's/.*numFound="//' | sed 's/".*//'
32
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml&shards=shard1' | sed 's/.*numFound="//' | sed 's/".*//'
14
wget -O - 'http://192.168.0.221:49158/solr/collection1/select?q=*:*&wt=xml&shards=shard2' | sed 's/.*numFound="//' | sed 's/".*//'
18
Auch interessant zu probieren ist:
docker diff prickly_mccarthy
um zu sehen, welche Änderungen am Dateisystem vorgenommen wurden.
Weitere Arbeiten
Wir können hier noch eine Menge nachbessern:
- sollten wir in der Lage sein, Bilder zu erstellen, anstatt Befehlszeilen anzugeben
- um die Koexistenz mehrerer Cluster auf einem einzigen Docker-Host zu ermöglichen, sollten wir etwas Dynamischeres als ein ‚ZK‘-Präfix verwenden
- es wäre schön, wenn wir ein einziges Skript hätten, das einen ganzen Cluster bereitstellt
- wir sollten wahrscheinlich Data Volumes für die Indexspeicherung verwenden
- wir wollen vielleicht Supervisord/Upstart, um Java zu überwachen, damit es sich von Abstürzen erholt
- es wäre schön, die neuesten Versionen von ZooKeeper und Solr automatisch zu erkennen und diese zu verwenden
- wenn wir Container registrieren, könnten wir in Erwägung ziehen, die Solr
.war
vorab zu expandieren, um den Start zu beschleunigen und die Unterschiede zu verringern
aber das hängt alles ein wenig vom Anwendungsfall ab und ist ein Thema für einen anderen Tag.
Fazit
Ich kann den Wert dieses Ansatzes für bestimmte Anwendungsfälle wirklich erkennen.
Die Ressourceneffizienz, die Startgeschwindigkeit und die Sauberkeit machen es ideal für Proof-of-Concept-Einsätze, A/B-Tests,
und für Anwendungsentwickler, die es als lokale Sandbox verwenden.
Ich bin neugierig, wie diese Art von Einrichtung in der Produktion eingesetzt werden kann. Es ist offensichtlich für
mandantenfähige Bereitstellungen geeignet, und mich würde interessieren, wie Sie eine SolrCloud-Bereitstellung
über mehrere Docker-Hosts einrichten könnten.