Balanceamento de Carga no JBoss AS 6.1 – Parte 1

Postado em Atualizado em

Para aplicações como muitas solicitações, geralmente ocorre a necessidade de melhorar a performance. Um dos meios mais utilizados atualmente é o Balanceamento de Carga, que consistem em distribuir a carga das solicitações em vários servidores ( nós ) visando equilibrar as solicitações, proporcionando um tempo de reposta mais rápido. Isso envolve o uso de algoritmos de distribuição de carga.
Para servidores JBoss AS existem atualmente duas soluções que são as mais utilizadas: Mod JK e Mod Cluster. Abaixo vou descrevê-las:

Mod JK: É o componente de balanceamento de carga mais utilizado atualmente, não só para instâncias JBoss, mas para outros servidores web e de aplicação. O mod-jk realiza a integração entre o Apache HTTPd e o Tomcat/JBoss, utilizando o protocolo AJP. Um dos grandes problemas do mod-jk são os arquivos de configuração que dificultam a manutenção em um grande parque de servidores, pois esses mesmos arquivos de configuração devem ser replicados.

Mod Cluster:  É um componente criado pela Red Hat para atender a mecanismos de balançeamento de carga alinhados ao conceito de  Cloud. O Mod Cluster vem com a promessa de algoritmos de balanceamento de carga mais avançados, que se baseiam na carga da aplicação, ou seja quantidades de sessões, conexôes abertas, etc. Ele pode ser customizado conforme a necessidade da aplicação visando um ambiente elástico. Um das vantagens é também o descobrimento automático de novas instâncias JBoss ( Utilizando Multicast ), não havendo a necessidade de configurações extras. Lembrando que o JBoss AS 6.1 já vem com o Mod Cluster nativamente.

Nesse post, vamos abordar as duas situações Mod JK e Mod Cluster utilizando JBoss AS 6.1.

Mod JK e JBoss AS 6.1

Eu presumo que você já possua o Apache HTTPd instalado, caso não basta apenas executar o comando abaixo para que ele seja instalado.

yum install httpd

Ao ver Is this ok [y/N]: , digite y. Pronto, o Apache HTTPd será instalado.

Para configurarmos o balançeamento de carga de forma adequada,  devemos realizar os seguintes passos:

  1.    Baixar e Compilar o Mod JK
  2.   Configurar o Apache HTTPd ( mod-jk.conf )
  3.   Configurar o arquivo worker.properties e uriworkermap.properties
  4.   Preparar o JBoss AS 6.1
  5.  Desenvolver uma aplicação Web simples  para testar o funcionamento

1 – Baixar e Compilar o Mod JK

O mod_jk pode ser baixado na seguinte url: http://tomcat.apache.org/download-connectors.cgi, o arquivo tomcat-connectors-1.2.32-src.tar.gz, deverá ser baixado.

Logo em seguida devemos descompactar o arquivo, e compilar utilizando o comando abaixo:

tar xvfz tomcat-connectors-1.2.32-src.tar.gz
 cd tomcat-connectors-1.2.32-src/native/
 ./configure –with-apxs=/usr/sbin/apxs

Execute os comandos abaixo:

yum install httpd-devel
 ./configure –with-apxs=yes
 make
 make install

Com os passos acima instalamos o Mod JK  no diretorio de modulos do Apache HTTPd.

  2 – Configurar o Apache HTTPd ( mod-jk.conf )

Agora vamos criar o arquivo de parametros do mod-jk, deve-se criar em /etc/httpd/conf/ o arquivo mod-jk.conf e configura-lo como abaixo:

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/worker.properties

JkLogFile logs/mod_jk.log

# Nivel de log [debug/error/info]
JkLogLevel debug

# Formato da log
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"

# SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"

JkMount /application/* loadbalancer

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm

# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

Agora edite o arquivo  /etc/httpd/conf/httpd.conf , e adicione no final o seguinte contéudo:

Include conf/mod-jk.conf

Nós estamos simplesmente incluindo uma nova configuração ao httpd.conf para que Apache HTTPd reconheça.

A Configuração dos parametros do Mod JK está finalizada.

3 – Configurar o arquivo worker.properties e uriworkermap.properties

Agora o arquivo worker.properties deverá ser criado  no diretório /etc/httpd/conf/. No arquivo worker estão as informações relacionadas aos hosts envolvidos e  parametros como fator de balanceamento, protocolos, configurações de cache entre outros.

O arquivo worker.properties do nosso exemplo, deve ser configurado como abaixo:

worker.list=instance01, instance02, loadbalancer

#Instance01

worker.instance01.port=8009
worker.inttance01.host=localhost
worker.instance01.type=ajp13
worker.instance01.lbfactor=1

#Instance02

worker.instance02.port=8309
worker.inttance02.host=localhost
worker.instance02.type=ajp13
worker.instance02.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=instance01, instance02

Agora devemos configurar o arquivo uriworkermap.properties, que é o arquivo ao qual nós passamos os contextos que devem ser balanceados, siga o exemplo abaixo:

/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/admin-console=loadbalancer
/admin-console/*=loadbalancer
/loadBalance=loadbalancer
/loadBalance/*=loadbalancer

O contexto loadBalance, será a nossa aplicação de teste para verificarmos se o nosso balanceamento está funcionando. Essa app será criada no passo 5.

Essa parte está finalizada.

4 –   Preparar o JBoss AS 6.1

Inicialmente deve-se criar um perfil, baseando-se nos requisitos da aplicação ( All, Default …),  isso pode ser feito com os comando abaixo:

cd /opt/jboss/server/
cp -Rap all instance01
cp -Rap all instance02

Agora devemos adicionar o parametro jvmRoute ao JBoss, para que a comunicação com o Apache HTTPd seja realizada utilizando o protocolo AJP.

Edite o arquivo  /opt/jboss/server/instance01/deploy/jbossweb.sar/server.xml, e adicione o parametro jvmRoute como abaixo:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="instance01" >

Repita o processo para a segunda instância:

Edite o arquivo /opt/jboss/server/instance02/deploy/jbossweb.sar/server.xml, e adicione o parametro jvmRoute como abaixo:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="instance02" >

Agora devemos alterar a porta AJP. Esse passo é necessário pois estou utilizando as duas instâncias do JBoss AS, na mesma máquina.
A porta AJP deve ser a mesma que passamos no parametro worker.instance01.port e worker.instance02.port, no arquivo worker.properties.

Para editar esse arquivos no JBoss AS 6.1, faça como abaixo:

Edite o arquivo  /opt/jboss/server/instance01/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

<bean>
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">AjpConnector</property>
<property name="port">8009</property>
<property name="description">JBoss Web AJP connector socket</property>
</bean>

Edite o arquivo /opt/jboss/server/instance02/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

<bean>
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">AjpConnector</property>
<property name="port">8309</property>
<property name="description">JBoss Web AJP connector socket</property>
</bean>

Agora devemos iniciar as instâncias, com os comandos abaixo:

./run.sh -c instance01
./run.sh -c instance02 -Djboss.service.binding.set=ports-02

Verifique após a inicialização, se a porta AJP realmente é a mesmo que foi configurado no worker.properties.

5 – Desenvolver uma aplicação Web simples  para testar o Funcionamento do Balanceamento de Carga

Crie uma simples aplicação Web Como Abaixo, para realizarmos os testes. Altere o mesmo código  para ficar adequado a Instância 02.

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<img src="numero1.jpg" alt="Instance01" />
<%= request.getSession().getId() %>
<h1>Instance01</h1>
</center>
</body>
</html><strong>
</strong>


Agora crier um pacote chamado loadBalance.war para a primeira instância e loadBalance.war para a segunda instância.
Faça o deploy na pasta padrão  /opt/jboss/server/instance01/deploy/ e /opt/jboss/server/instance02/deploy/.
Acesse a primeira instância pelo FireFox ( ou qualquer outro browser ).

Acesse a seguinte url: http://localhost/loadBalance/test.jsp , você deverá ver a imagem abaixo:

Agora acesse a mesma url http://localhost/loadBalance/test.jsp, só que utilizando outro browser, se o balanceamento estiver funcionando você deverá ver a imagem abaixo:

Bom é isso ai galera, muitas coisas ainda podem ser melhoradas aqui, lembrando que não estamos utilizando o Cluster, tanto é que não fizemos o deploy no diretório farm, mas  sim no diretório padrão.

A Configuração do JBoss AS 6.1 como Mod JK Está Finalizada !

Continua ( Mod Cluster ) ….

7 comentários em “Balanceamento de Carga no JBoss AS 6.1 – Parte 1

    Eduardo Amaral disse:
    29 de maio de 2012 às 12:04

    Bom conteúdo.

      Mauricio Magnani respondido:
      29 de maio de 2012 às 13:41

      Vlw Amigo🙂
      Qualquer sugestão de conteúdo estou ai…

      []s

        Luciano Piérre disse:
        2 de outubro de 2012 às 11:42

        Bom dia.
        Estou com a seguinte dúvida :
        Minha aplicacao tem a url: http://hostname:8080/aplicacao
        terao outras…mas apenas mudando a porta.
        e preciso direcionar cada url para seu Nó dentro do workers.properties.
        Isso faço com o uriworkermap.properties.
        mas pelo que entendi, ele ‘entende’ apenas depois do barra /.
        Existe uma forma de entender a porta ?

        obrigado.

        Mauricio Magnani respondido:
        2 de outubro de 2012 às 12:51

        Só uma coisa, Vc está utilizando o JBoss AS 6.1 mesmo?

    Jonatas Oliveira disse:
    2 de dezembro de 2012 às 18:03

    Amigo,

    A parte I está ótima, e a parte II?

    abraço

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s