Configurando um Cluster de Tomcat com Balanceamento de Carga

Neste artigo irei mostrar como configurar um cluster de Tomcat com balanceamento de carga para prover alta disponibilidade de sistemas web.

[ Hits: 30.662 ]

Por: ADRIEL LUCAS DA SILVA VIANA em 17/10/2011


Cluster de Tomcat



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

    Próxima página

Páginas do artigo
   1. Cluster de Tomcat
   2. Balanceamento de carga
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Boot Remoto (LTSP) sem servidor DHCP

Dominando o apt-get no Conectiva

Montagem de Cluster Beowulf

Incrementando o Ubuntu GNOME

Instalação e Configuração de Servidor SSH no Debian

  
Comentários
[1] Comentário enviado por andrecostall em 19/10/2011 - 22:37h

Cara, parabéns !!
Muito bom seu artigo.
Abs

[2] Comentário enviado por diegomsc em 08/10/2012 - 09:58h

Caso um servidor Tomcat caia, o serviço de balanceamento cai? ou todo o trafego é direcionado para o servidor que ainda esta on-line?

[3] Comentário enviado por adriell em 09/10/2012 - 10:10h

Diego,


Dentro do cluster se um tomcat cair, o balanceamento não cair ele apenas redireciona as requisições para os demais tomcats do cluster onde em cada tomcat as sessões estarão sendo replicadas ok?

[4] Comentário enviado por alexepires em 10/12/2012 - 08:39h

Olá Adriel parabéns pelo artigo.
Mas tenho uma dúvida, neste caso você utilizou uma das máquinas virtuais para ser o balanceador de carga e outra com as duas instâncias do tomcat?

Abs

[5] Comentário enviado por saitam em 24/05/2013 - 09:07h

Configurei o Cluster com duas instâncias do Tomcat na mesma máquina com Apache2 utilizando proxy.conf e proxy_balancer.conf no Debian com base desse artigo, mas não funcionou 100%.
Veja a situação:
Com dois Tomcats ativos quando uma requisição é feita pelo Firefox e outra com Chrome aparece a mesma mensagem que fiz uma pequena aplicação de testes (dominio1.war deploy no tomcat1 e dominio2.war deploy no tomcat2) exibindo "servidor 1" e "servidor 2" respectivamente, mas apenas exibe "servidor 1".

Se paro o tomcat1 e tento carregar acusa que o serviço não esta disponível (tomcat), mas o tomcat2 esta ativo.

Conclui então que esta fazendo conexão persistente.

Segue os arquivos de configuração que fiz com base desse artigo para quem quiser testar para melhor entender, se conseguir fazer funcionar de forma correta, favor posta como solucionou ok.

http://www.4shared.com/zip/KDA3nZv9/cluster.html


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts