Mise en oeuvre de SolrCloud (Solr 4.0)

solr

Objectifs

Après avoir présenté les principes de SolrCloud dans l’article « Présentation de SolrCloud« , dans cet article nous procéderons à l’installation d’un cluster SolrCloud avec 4 noeuds et un ensemble Zookeeper de 3 éléments. Pour l’exercice, nous installons tout sur un serveur physique unique, mais dans la réalité, plusieurs serveurs sont utilisés. Les explications sont synthétiques car nous supposons que Java, Tomcat et Solr (en mode non SolrCloud) sont des compétences maitrisées. Pour une installation standard de Solr 4.3.0, il est possible de se référer à l’article « Installer Solr 4.3.0 sous Tomcat 7 ».

Les pré-requis minimum pour un serveur hébergeant un noeud SolrCloud :

  • Oracle Java 6 ou 7
  • Tomcat 6.0.x ou 7.0.x
  • Processeur quad-core
  • 4 Go de ram

Les pré-requis usuels pour une serveur hébergeant un élément d’un ensemble Zookeeper :

  • Oracle Java 6 ou 7
  • Processeur dual-core
  • 2 Go de ram

Pour SolrCloud, chaque noeud est constitué de :

  • 1 instance Solr 4.x
  • 1 serveur Tomcat 7

Normalement chaque noeud fonctionne sur son propre serveur physique et pour tous le serveur Tomcat utilise certainement le même port (8080 ou 8180 en général). Pour une installation de 4 noeuds sur un même serveur, chaque serveur Tomcat utilise un port différent (8180, 8280, 8380 et 8480).

Sur ce serveur, on installe également un ensemble Zookeper de 3 éléments.

Un autre point à prendre en compte est la bande passante réseau entre toutes les composantes du Cloud, c’est a dire entre les serveur hébergeant un noeud Solr ou une instance Zookeeper. Lors d’une indexation de données, un noeud qui est destinataire de l’appel REST fait par l’application cliente a toute les chances de devoir transmettre les données à indexer au vrai noeud final, puis ces données seront répliquées. Lors d’une recherche, c’est identique, le noeud destinataire de l’appel REST doit transmettre la requête à un ou plusieurs autres noeuds (shards de la collection). En conséquence, la traffic réseau interne au Cloud peut être très important car forcément un multiple du traffic réseau en provenance ou à destination de l’extérieur du Cloud. Donc pour un Cloud de production fortement sollicité, un réseau intra-cloud Gigabit est impératif et peut être même 10 Gigabits.

Installation

Récupérer Solr, Zookeeper et Tomcat

  • Télécharger Zookeeper 3.4.5 sur http://zookeeper.apache.org et le décompresser dans /opt/downloads/
  • Télécharger Solr 4.3.x sur http://lucene.apache.org et le décompresser dans /opt/downloads/
  • Télécharger Tomcat 7.0.x sur http://tomcat.apache.org et le décompresser dans /opt/downloads/

Augmenter les limites systèmes

Dans « /etc/security/limits.conf » file, ajouter cette ligne et rémarrer le serveur

root soft nofile 16184

Installer l’ensemble Zookeeper

  • on choisi comme répertoire d’installation “/opt/zookeeper”
cp -r /opt/downloads/zookeeper-3.4.5 /opt/zookeeper
  • créer le fichier de configuration “/opt/zookeeper/conf/zoo1.cfg” avec le contenu suivant
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-data-1/
clientPort=2181
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
  • copier ce fichier en zoo2.conf et zoo3.conf et modifier les paramètres dataDir et clientPort avec respectivement :
dataDir=/opt/zookeeper-data-2/
clientPort=2182

et

dataDir=/opt/zookeeper-data-3/
clientPort=2183
  • créer des répertoires data pour les 3 instances Zookeeper de l’ensemble
mkdir /opt/zookeeper-data-1
mkdir /opt/zookeeper-data-2
mkdir /opt/zookeeper-data-3
  • Créer les fichiers myid dans chaque répertoire data. Ce fichier ne contient uniquement une ligne qui est le numéro de l’instance Zookeeper qui utilise ce répertoire de données (un chiffre de 1 à 255).
cd /opt
echo 1 > zookeeper-data-1/myid
echo 2 > zookeeper-data-2/myid
echo 3 > zookeeper-data-3/myid
  • démarrer l’ensemble
cd /opt/zookeeper
bin/zkServer.sh start zoo1.cfg
bin/zkServer.sh start zoo2.cfg
bin/zkServer.sh start zoo3.cfg
  • tester Zookeeper
/opt/zookeeper/bin/zkCli.sh -server localhost:2181

Installation d’un noeud SolrCloud

Comme nous l’avons déjà dit, un noeud SolrCloud est constitué d’un serveur Tomcat et de Solr 4.0. Une procédure d’installation standard (non SolrCloud) est d’écrite dans l’article « Installer Solr 4.3.0 sous tomcat 7 ».

Chaque noeud est installé dans un répertoire “/opt/nodeN”

  • Créer l’arborescence pour le noeud 1
mkdir /opt/node1
mkdir /opt/node1/solr
mkdir /opt/node1/solr/home
mkdir /opt/node1/solr/webapp
mkdir /opt/node1/tomcat
  • Mettre en place le fichier “/opt/node1/solr/home/solr.xml”
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="true">
    <cores adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:}" 
           hostPort="${port:}" hostContext="${hostContext:}">
    </cores>
</solr>

Le fichier solr.xml contient la définition des cores de l’instance Solr. Pour l’instant, il ne contient pas de déclaration de core et aucun core avec des fichiers de configuration ou de répertoire “data” pour les index ne doivent être créés. SolrCloud réalise ces taches lui-même lors de l’utilisation de la Collections API pour créer les collections. Chaque core correspond à un shard d’une collection ou à un de ces replicas.

  • Mettre en place le fichier “/opt/node1/solr/webapp/solr.war”
cp -r /opt/downloads/solr-4.3.0/dist/solr-4.3.0.war /opt/node1/solr/webapp/solr.war
  • Mettre en place le fichier de configuration des logs
cp -r /opt/downloads/solr-4.3.0/example/resources/log4j.properties /opt/node1/solr/.
  • Copier Tomcat dans “/opt/node1/tomcat” de manière à ce que l’on ai directement dans ce répertoire les répertoires bin, conf, log, webapps, …
cp -r /opt/downloads/apache-tomcat-7.0.40/* /opt/node1/tomcat/.
  • Mettre en place les dépendances Solr dans Tomcat
cp -r /opt/downloads/solr-4.3.0/example/lib/ext/* /opt/node1/tomcat/lib/.
  • Mettre en place un fichier “/opt/node1/tomcat/bin/setenv.sh” (avec l’attribut +x) pour Tomcat
SOLR_OPTS="-Dsolr.solr.home=/opt/node1/solr/home -Dport=8180 -DhostContext=solr 
-DzkClientTimeout=20000 -DzkHost=localhost:2181,localhost:2182,localhost:2183 
-Dlog4j.configuration=file:///opt/node1/solr/log4j.properties"
export JAVA_OPTS="$SOLR_OPTS"

Afin d’éviter les erreurs habituelles « Out of heap size memory » et « Out of permgen memory », on fixe ici d’autres paramètres importants pour Solr, tels que :

-Djava.awt.headless=true -Xms256M -Xmx8192M -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC
  • Modifier le fichier “catalina.sh”

Le but est d’éviter l’erreur habituelle « Too many open files ». On place cette ligne au début du fichier.

ulimit -n 8192
  • Modifier le fichier “server.xml” de Tomcat (opt/node1/tomcat/conf/server.xml)
    • mettre le port d’écoute à 8180 et le port d’arrêt à 8185
    • ajouter « URIEncoding= »UTF-8″ » au connecteur
    • mettre le connecteur AJP/1.3 en commentaire
  • Déclacer Solr dans Tomcat

Il s’agit de copier un fragment de configuration JNDI dans le répertoire “conf/Catalina/localhost” de Tomcat. Créer dans ce répertoire un fichier “solr.xml” avec le contenu suivant :

<Context docBase="/opt/node1/solr/webapp/solr.war" debug="0" crossContext="true" >
    <Environment
        name="solr/home" type="java.lang.String"
        value="/opt/node1/solr/home" override="true" />
</Context>

Dupliquer le noeud Solr en 3 autres noeuds

Le principe pour dupliquer le noeud 1 en un autre noeud est le suivant :

  • dupliquer /opt/node1
cp -r /opt/node1 /opt/nodeN
  • mettre à jour les fichiers de configuration Solr

Changer le port dans /opt/nodeN/solr/home/solr.xml (hostPort)

  • mettre à jour les fichiers de configuration Tomcat

Changer les ports dans :

/opt/nodeN/tomcat/conf/server.xml
/opt/nodeN/tomcat/bin/setenv.sh (-Dport=…)

Changer le répertoire home de Sorl dans /opt/nodeN/tomcat/bin/setenv.sh

-Dsolr.solr.home=…

Modifier la configuration jndi de Solr dans Tomcat (/opt/nodeN/tomcat/conf/Catalina/localhost/solr.xml)

Démarrer les 4 nodes

/opt/node1/tomcat/bin/startup.sh
/opt/node2/tomcat/bin/startup.sh
/opt/node3/tomcat/bin/startup.sh
/opt/node4/tomcat/bin/startup.sh

Conclusion

On doit avoir maintenant une configuration SolrCloud de 4 noeuds démarrés avec un ensemble Zookeeper de 3 éléments.

L’étape suivante est de charger des configurations Solr dans Zookeeper et de créer des collections. Nous verrons ceci dans un prochain article.