Um cluster de
Tomcat são dois um mais Tomcats em que são hospedadas a mesma aplicação Java. A principal função do cluster de Tomcat é realizar replicação de sessões abertas em cada Tomcat do cluster, assim cada Tomcat conterá suas sessões e seus atributos, assim como os atributos e sessões dos demais Tomcats. Cada Tomcat do cluster é chamado de nó.
Com o cluster de Tomcat é possível obter a alta disponibilidade, de modo que se um nó do cluster falhar, as requisições vindas para este nó serão desviadas para outro nó ativo. Tudo isso sem que o usuário perceba, pois sua sessão estará ativa nos outros nós do cluster.
A figura abaixo mostra a arquitetura do cluster de Tomcat:
Configuração do cluster de Tomcat
Levarei em consideração que você já tenha duas instâncias do Tomcat, o Apache e o Java instalados no seu servidor. Segue abaixo a descrição do ambiente que será utilizado nesse pequeno projeto, vale lembrar que é apenas um projeto de teste:
- Duas instâncias de máquinas virtuais no virtualbox;
- Cada VM com 512MB de RAM e 8GB de HD;
- Cada VM com o sistema Operacional CentOS 5.7 (Final).
Obs.: Essa configuração poderá ser realizada em qualquer servidor
Linux.
Requisitos:
Para realizar a replicação de sessões entre os nós do cluster alguns pontos devem ser verificados:
- Todos os atributos de sessão devem implementar java.io.Serializable;
- Ter no arquivo web.xml da aplicação o atributo <distributable/> ou definir um propriedade na configuração do contexto da aplicação no arquivo server.xml;
- Configurar o balanceador de carga com a opção sticky session ativa, para manter as requisições de um mesmo usuário do sistema indo para um mesmo nó do cluster, exceto quando falhar este nó.
Iniciando a configuração:
A configuração dos Tomcats para o cluster é realizada a partir da edição do arquivo
server.xml, localizado na pasta conf (<diretório do tomcat>/conf/server.xml) de cada Tomcat.
O que deve ser feito é descomentar toda a tag cluster e acrescentar a configuração adequando os parâmetros ao ambiente de hospedagem. Logo abaixo a configuração do cluster:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
Em cada Tomcat temos a mesma tag cluster com uma pequena diferença na configuração:
Agora temos que identificar cada nó no mesmo arquivo "server.xml". No Tomcat A e no Tomcat B será preciso fazer algumas alterações para os nós poderem se comunicar:
Obs.: As alterações estão destacadas em negrito, porém essas alterações são um exemplo de configuração, não necessariamente terá que utilizar estes mesmo valores, pode ser feito com outros valores.
Depois de fazer essas configurações, basta iniciar os Tomcats que os mesmos começarão a replicar suas sessões, ou seja, começarão a trabalhar em cluster.
Para iniciar os Tomcats basta entrar no diretório Bin/ dentro de cada Tomcat e executar o seguinte comando:
# sh startup.sh