Virtualmente materializo-me aqui novamente trazendo informação aos necessitados! Dessa vez, trago um guia simples e (até certo ponto) completo para configuração do Solr Cloud rodando em Tomcat acessando um Zookeeper externo.

Precisei configurar e testar uma estrutura distribuída e expansível do Solr para indexações rápidas e consultas mais rápidas ainda. Devido ao fato do Solr 4 (que implementa o “modo Cloud”) ainda estar em Beta (pelo menos até a data de publicação desse post), existe pouco material de boa qualidade.

No site oficial um tutorial simples ensina a rodar o Solr através do Jetty interno levantando o serviço de um Zookeeper também interno.

Bem, antes de mais nada, vamos a definições rápidas:

Lucene

Motor de indexação e busca de textos, rico em recursos, escrito em Java e cross plataforma. Essencialmente nos permite indexar grandes e numerosos textos para realizarmos buscas rápidas.

Solr

Plataforma opensource de buscas para o Lucene, permitindo integrações via requisições REST e outros recursos de gerenciamento. De maneira bem simples, é uma interface para o Lucene.

Solr Cloud

É o novo recurso do Solr 4-Beta, permitindo a distribuição ou replicação de índices através de várias instâncias do Solr.

Zookeeper

Serviço centralizado de manutenção de configurações, distribuição de estados e gerenciamento de eventos. É usado pelo Solr Cloud para obtenção de configurações e comunicação entre as instâncias do Solr.

 

1. Preparando

Durante o tutorial, considerarei uma determinada estrutura de pastas. Todos os passos foram executados em Linux (CentOS 6) com Java 7 (1.7.0_06-b24).

Baixei o Tomcat 7 (7.0.29) e extraí para /usr/tomcat/ .

Baixei o Solr 4 (beta) e extraí em /usr/solr/ .

Baixei o Zookeeper 3 (3.4.3) e extraí em /usr/zookeeper/ .

 

2. Configurando e iniciando o Zookeeper

A simplicidade do serviço principal do Zookeeper é assustadora. Entre na pasta de configurações e edite o arquivo zoo.cfg conforme abaixo:

#cd /usr/zookeeper/zookeeper-3.4.3/conf/
#vim zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/zookeeper/data/
clientPort=9000

No arquivo zoo_sample.cfg existem explicações sobre os possíveis parâmetros. Mas já deve ficar claro que dataDir informa onde ficarão os arquivos gerados e o PID do serviço; e o clientPort será a porta que o serviço escutará por clientes.

Para startar o serviço, é mais fácil ainda:

#cd /usr/zookeeper/zookeeper-3.4.3/bin/
#./zkServer start

 

3. Carregando configurações do Solr no Zookeeper

O Zookeeper, quando iniciado, gera um sistema de arquivos virtual que pode ser distribuído e pode ser acessado através do serviço. E é nesse sistema de arquivos que temos que salvar as configurações do Solr para que qualquer instância acesse, mesmo que remotamente.

O acesso ao Zookeeper requer uma implementação muitas vezes complicada… se tivéssemos que fazer tudo manualmente. Mas existem ferramentas, APIs e scripts prontos pra isso.

No pacote do Solr, juntamente com alguns exemplos, existe um script (bash e bat) para esse envio de configurações… e também existem configurações prontas para utilizarmos… e dados para testarmos… Enfim, vamos fazer o upload.

#cd /usr/solr/apache-solr-4.0.0-BETA/example/cloud-scripts/
#./zkcli.sh -cmd upconfig -confdir /usr/solr/apache-solr-4.0.0-BETA/example/solr/collection1/conf/ -confname collection1 -z localhost:9000

Depois que o envio terminar, podemos acessar o sistema de arquivos do Zookeeper e ver o resultado.

#cd /usr/zookeeper/zookeeper-3.4.3/bin/
#./zkCli.sh -server localhost:9000
#ls /configs/collection1

 

4. Configurando o Solr

Apesar das configurações de indexação serem obtidas do Zookeeper, existem configurações locais que definem a função da instância local do Solr. Nessa configuração local, definimos as instâncias que serão criadas (cores) e a quais collections e shards essas instâncias se conectarão.

Explicando e seguindo uma ordem de hierarquia:

Collection

É o conjunto de configurações que foram carregadas. No nosso caso, temos uma collections nomeada como “collection1”. Pode-se considerar que representa um domínio de dados, como “livros”, “documentos” ou “jornais da cidade”.

Shard

É uma divisão física dos índices salvos, permitindo a distribuição da tarefa de indexação por várias instâncias do Solr. No caso da perda de uma shard inteira, a parte dos índices que estavam nesta shard serão perdidos.

No caso de 2 ou mais cores estarem configurados para a mesma shard, estes serão réplicas, mantendo cópias dos mesmos índices fornecendo um nível de redundância e acelerando consultas.

Além disso, se não for especificado uma quantidade de  shards, por padrão existirá apenas 1. E os cores serão igualmente distribuídos entre as shards se não forem forçadamente direcionados.

Core

É efetivamente uma instância do Solr, com sua própria configuração e seu próprio índice. Deve ser especificado um nome único para cada core e a configuração (collection) que será carregada. A definição da shard é opcional.

#cd /usr/solr/apache-solr-4.0.0-BETA/example/solr
#vim solr.xml

No caso, criei 2 cores apontando para a mesma configuração. Cada um deles com seu próprio nome e pasta (onde serão salvos os índices). O “core1” possui uma shard especificada e será a única existente. O “core2” será designado automaticamente para “shard1”.

Importante notar as outras configurações. O “persistent=true” permitirá que o gerenciamento de cores pela interface reflita neste arquivo. E o “host” e “hostPort” devem ser os mesmo para o acesso padrão ao Tomcat com o Solr.

 

5. Configurando e subindo o Tomcat

Apenas duas coisas são necessárias para podermos startar o Tomcat e ver tudo funcionando: incluir a configuração apontando para o .war do Solr e setar uma variável do Java necessária para o Solr Cloud.

#cd /usr/tomcat/apache-tomcat-7.0.29/conf/Catalina/localhost/
#vim solr.xml

Observe que é necessário apontar o local onde está o “solr.xml” configurado anteriormente.

Para iniciar o Solr em modo Cloud, basta disponibilizar a variável Java “zkHost” apontando para o endereço onde o ZooKeeper está escultando.

No caso, inclua a variável no JAVA_OPTS através de export ou editando o “catalina.sh”. Então inicie o Tomcat.

#export JAVA_OPTS=”-DzkHost=localhost:9000″
#./startup.sh

Quando terminar de startar, acesse http://localhost:8080/solr/. Se o Cloud Mode do Solr ativou com sucesso (devido à variável “zkHost”), no menu lateral deve aparecer a opção “Cloud”. Nesta é possível visualizar o gráfico da rede de instâncias conectadas ou que já conectaram.

Se tudo ocorreu bem, neste gráfico deverão ter um collection “collection1”, um shard “shard1”, e dois cores “localhost” (o nome do core é usado para nomeá-los em outras áreas).

Certo?! =)

Lembrando que aqui temos 2 instâncias na mesma máquina que o Zookeeper… Mas podem ser n instâncias em máquinas diferentes, apontando para o mesmo Zookeeper. Basta seguir os passos 4 e 5 para cada servidor.

Pararei por aqui… Formas de indexar, conectar, consultar, otimizar e etc. são operações existentes desde versões anteriores do Solr e, por isso, muito comuns pela rede… So… GOOGLE IT!