Criando Cluster de JBoss AS 7 com Load Balance (JBoss mod_cluster + httpd)
Short Description
Criando Cluster de Jboss Ref. Blog do José Junior...
Description
More
Next Blog»
Create Blog
BLOG DO JOSÉ JR BLOG COM CONTEÚDO RELACIONADO A CIÊNCIA E TECNOLOGIA.
Q U A R TA TA - F E I R A , 2 4 D E A B R I L D E 2 0 1 3
MARCADORES
Criando Cluster de JBoss JBoss AS 7 com com Load Balance Balance (JBoss mod_cluster + httpd)
Apache Felix File Install Install (1) (1)
INTRODUÇÃO
APTITUDE (1) APTITUDE (1) Aquecimento (1) Aquecimento (1) auto-deploy (2) (2) Autômatos Celulares Celulares (1) (1)
Loadbalance é uma aplicação que recebe uma um a requisição HTTP HTTP,, e decide qual instância (servidor) chamar de um um cluster de servidores. Nesse caso, estamos lidando com cluster de servidores JBoss AS 7, 7, que pode possuir N servidores, que também também são chamados chamados de instâncias do cluster. O loadbalance, através de critérios configurados, toma a decisão de chamar uma determinada instância instância do cluster do cluster para ATENDER a requisição HTTP. HTTP. Um dos critérios critérios usados, usados, é verificar qual instância do cluster de JBoss AS 7 está ativa no mo no momento mento e com menos carga. Localizado a instância, a requisição é direcionada para ela. E também, se algumas instâncias deixaram de funcionar, o loadbalance direciona as requisições para as instâncias instâncias ativas. Para Para isso, o loadbalance também conta com mecanismo para verificar se as instâncias estão vivas no momento, pois não faz sentido sentido redirecionar requisições para instâncias mortas. Veja no desenho abaixo como que funciona um cluster um cluster de instâncias instâncias do JBoss AS com o loadbalance ( Apache WebService + mod_cluster). mod_cluster ).
Apache Http Client (1) Client (1) Apache Web Server (2) Server (2) API Management (1) Management (1) APT-GET (1) APT-GET (1)
banco de dados (2) dados (2) Bytecode (2) Bytecode (2) C (3) Cache (1) Cache (1) CentOS (1) CentOS (1) ClassLoader (4) ClassLoader (4) ClassLoader Hell (2) Hell (2) CLI (1) CLI (1) Cluster (2) Cluster (2) Compilação Dinâmica (1) Dinâmica (1) Configuração de rede (1) rede (1) Console (1) Console (1) CPU (1) CPU (1) Deb (1) Deb (1) Debian (1) Debian (1) EAR (3) (3) Eclipse (1) Eclipse (1) Eclipse Helios (1) Helios (1) Equinox Equi nox (2) (2) Hardware. (1) Hardware. (1) HTTP (2) HTTP (2) httpd (3) httpd (3) Jar (3) Jar (3) Java (25) Java (25) Java Class File Format (1) Format (1) Java Compiler API (1) API (1) Java3D (1) Java3D (1) avax.tools (1) avax.tools (1) JBOSS (4) JBOSS (4) JBOSS AS (2) AS (2) JBOSS AS 7 (9) 7 (9) JBOSS AS 7.1.3 (3) 7.1.3 (3) JBoss Cache (1) Cache (1) JEE (1) JEE (1) JNI (3) JNI (3) JSR-199 (1) JSR-199 (1) JSR-202 (1) JSR-202 (1) JSR-223 (7) JSR-223 (7)
Sign In
CONFIGURAÇÃO DE CADA NODO DO JBOSS AS 7.1.3
JVM (2) Jython (1)
1 – Copie as pastas do servidor JBOSS AS 7.1.3 e renomeie cada cópia para:
Linha de comando (1) Linux (9) listener web (1) Load Balance (2)
boss-as-7.1.3.Final-node1 boss-as-7.1.3.Final-node2 boss-as-7.1.3.Final-node3 Cada pasta será uma instância do servidor JBoss AS 7 e funcionará no modo STANDALONE. Para cada cópia, alterar o arquivo standalone.conf que está na pasta “ bin” dentro de cada instância colocando os seguintes parâmetros: JAVA_OPTS="$JAVA_OPTS Djboss.server.default.config=standalone-full-ha.xml" JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.as.logging.perdeployment=false" # Esse offset deve ser diferente para cada nodo. JAVA_OPTS="$JAVA_OPTS -Djboss.socket.binding.portoffset=1000" # O nome do nodo deve ser diferente para cada nodo. JAVA_OPTS="$JAVA_OPTS -Djboss.node.name=nodo1" Lembrando que para cada instância, teremos o parâmetros “Djboss.node.name ” e “-Djboss.socket.binding.port-offset” diferentes. Podemos usar os seguintes valores para c ada instância: Instância
Djboss.socket.bin ding.port-offset
Djboss.node.name
jboss-as-7.1.3.Finalnode1
1000
nodo1
jboss-as-7.1.3.Finalnode2
2000
nodo2
jboss-as-7.1.3.Finalnode3
3000
nodo3
lua (1) lua format file (1) Máquinas Virtuais (1) MySQL (1) Network (1) NOOBS (1) Notebook (1) NVIDIA (1) OSGi (3) Overclock (1) PostgreSQL (1) Proxy (1) Python (7) RaspberryPi (1) Raspbian (1) Reflection API (1) Samba (1) SAR (1) Servidor de Aplicação (5) Servlet (1) Ubuntu (1) Ubuntu 14.04 (1) Virtualização (1) VM (2) WAR (3)
SEGUIDORES
Followers (3)
Follow
Arquivo standalone-full-ha.xml Também, precisamos alterar o arquivo “standalone-full-ha.xml ” para cada instância do cluster de acordo com as configurações a seguir:
ARQUIVO DO BLOG
►
2015 (2)
►
2014 (4)
▼
Na tag “server”, colocar o atributo name com o nome da instância. Lembrando que esse nome deve ser único entre as instâncias do cluster. Instância
2013 (6) ► Outubro (1) ►
Agosto (1)
▼
Abril (2) Criando Cluster de JBoss AS 7 com Load Balance (JB...
Tag “server”, atributo “name”
Configurando APR (JBoss Web Native) no JBoss AS 7....
jboss-as-7.1.3.Final- jboss-as-7.1.3.Final- jboss-as-7.1.3.Final-
►
Março (1)
►
Janeiro (1)
►
2012 (5)
►
2011 (3)
Dentro da tag “server” colocar a seguinte tag para todas as instâncias do cluster. Essa propriedade define o tamanho máximo de uma requisição HTTP. Se não definir esse tamanho, ao fazer uma requisição HTTP com muitos parâmetros na url, a instância que tratará a requisição, poderá lançar exceção com erro 500. Dentro da tag “cache-container” colocar o seguinte atributo para iniciar o cache no inicio do servidor. start="EAGER "
►
2010 (15)
►
2009 (4)
MEU PERFIL JOSEPOJR SÃO PAULO, SÃO PAULO, BRAZIL
Atualmente trabalho como analista desenvolvedor Java usando a tecnologia JEE para desenvolvimento mobile, desktop, web e servidor. E também possuo mestrado em engenharia elétrica (veja em http://www.teses.usp.br/teses/dispo niveis/3/3140/tde-06112008204522/). VISUALIZAR MEU PERFIL COMPLETO
Existe um bug no JBoss AS 7.1.x que não inici a o cluster corretamente no infinispan (gerenciador de cache distribuído do JBoss AS 7.x). Para contornar esse problema, temos que iniciar todos os caches de forma “EAGER ” (carrega tudo no inicio) e não “LAZY ” (padrão, carrega só quando o cache for de fato chamado por alguma aplicação). No subsistema web, mudar a tag para: Note que essa tag vai informar o nome do servidor configurado acima. Configurar as interfaces com o código abaixo: Na tag “socket-binding-group”, alterar para as seguintes configurações de acordo com a instância usada. Instância
Tag “socket-binding-group”
jboss-as-7.1.3.Finalnode1
jboss-as-7.1.3.Finalnode2
jboss-as-7.1.3.Finalnode3
No subsistema modcluster, mudar a tag para:
Muito importante configurar o atributo “proxy-list” para o servidor de IP 127.0.0.1 (local) na porta 6666. Esse valor é configurado também no arquivo httpd.conf do Apache Web Server (httpd). Se não configurar isso, a instância do JBoss pode não localizar o httpd e este último, não conseguir fazer os redirecionamentos e começar a lançar os erros 404, “not found”, não localizado. No subsistema de logging, acrescente o seguinte bloco para fazer log no modcluster para debug.
Arquivo nodo.sh Esse arquivo será criado para iniciar cada instância do cluster. Veja abaixo: ./standalone.sh -c standalone-full-ha.xml -b 127.0.0.1 -u 230.0.0.4 &
Para funcionar o cluster com JGroups, o parâmetro b não pode ser configurado com “0.0.0.0”, deve ser atribuído endereço IP da máquina que está rodando o JBoss AS 7. Caso esteja rodando tudo local, use “127.0.0.1”. O “&” (E comercial) serve para desvincular a execução do comando do prompt, assim, mesmo que o console seja fechado, o servidor continua ativo. Para desligar o servidor, precisa-se executar esses comandos: s aux | grep “jboss”
Para localizar o processo com o nome “ jboss”. kill -TERM pid
Para enviar uma mensagem para finalizar o processo, nesse caso, o servidor JBoss AS 7. A variável “pid” é o número do processo obtido na execução do comando anterior. Ou para desligar de vez (definitivamente) o servidor JBoss AS 7, digite kill -9 pid
Depois disso, copie esse arquivo para cada pasta “ bin” de cada instância do JBoss AS 7. Dê permissão de execução para esse arquivo “.sh”, com o comando abaixo: chmod a+x nodo.sh
CONFIGURAÇÃO DO JBOSS MOD_CLUSTER (LOADBALANCE). 1 – Download do binário no site http://www.jboss.org/mod_cluster na versão 1.1.x. A última versão até a escrita desse é artigo é a versão 1.1.3. Na documentação do JBoss AS 7, o site www.jboss.org deixa bem claro que deve ser usado o mod_cluster na versão 1.1.x. Se utilizar outra versão, pode ser que não funcione. Lembrando também de baixar a versão para a plataforma alvo correta. Para escrever esse artigo, usamos o sistema operacional Linux 32 bit. E também, baixar o mod_cluster “completo”, no sentido de estar junto com Apache Web Server, chamado também de “httpd”. Pois o mod_cluster do JBoss é uma extensão (módulo) do httpd para trabalhar com cluster de JBoss AS's. Se baixar somente os módulos, deverá copiar os arquivos binários “.so” (linux) ou “.dll” (windows) para os diretórios de módulos do httpd e ainda, configurar o arquivo “httpd.conf”(que será usado a seguir). Mais detalhes da configuração do httpd, entre no site http://httpd.apache.org/docs/2.2/ Mas nesse artigo, usaremos a versão já empacotada do mod_cluster com o httpd. 2 – Descompactar arquivo “mod_cluster-1.1.3.Final-linux2-x86ssl.tar.gz” com o comando: tar xvfz mod_cluster-1.1.3.Final-linux2-x86-ssl.tar.gz
3 – Copiar o diretório "opt/jboss" para o diretório "/opt". Para isso, precisa-se usar o superusuário. Diretório aonde descompactou o arquivo “tar.gz”. Entre no diretório “opt” criado, comando: cd opt
Comando para cópia: sudo cp -R jboss /opt
4 – Edite o arquivo httpd.conf localizado no diretório “/opt/jboss/httpd/httpd/conf ”. Procure a linha “ServerName” e descomente essa linha. Mude “ www.example.com:80” para “127.0.0.1:80”. Lembrando que a porta “80” é porta que será usada para receber requisições
HTTP e apartir daí, o httpd com o mod_cluster (JBoss) delegará a requisição para a instância do JBoss AS 7 que cumprir os critérios do loadbalance (dentro do mod_cluster). Lembrando também que o endereço IP “127.0.0.1” pode ser alterado para o endereço IP da máquina atual. 5 – Criar os scripts para iniciar e parar o Apache Web Server com o mod_cluster. O nosso loadbalance conforme explicado anteriormente, funciona como um módulo (extensão) do Apache Web Server, então criaremos scripts para iniciar e parar esse servidor (httpd). // Script para inicio do Apache Web Server. // Coloque o nome de “httpd_start.sh” // Dê permissão de execução com o comando: chmod a+x httpd_start.sh
// Cole o conteúdo abaixo no arquivo “httpd_start.sh”. opt/jboss/httpd/sbin/apachectl start &
// De forma análoga, vamos criar o arquivo “httpd_stop.sh” // para parar o servidor httpd. // Dê permissão de execução com o comando: chmod a+x httpd_stop.sh
// Cole o conteúdo abaixo no arquivo “httpd_stop.sh”. opt/jboss/httpd/sbin/apachectl stop &
6 – Inicie o servidor Apache Web Server (httpd) com o comando sudo ./httpd_start.sh
// Lembrando que para usar a porta 80 precisamos de acesso root ao sistema operacional. 7 – Entre em qualquer navedor web (firefox, chrome, etc) e acesse o endereço: http://127.0.0.1 Deverá aparecer a seguinte mensagem: “It works!” Está trabalho, ativo.
RODANDO UMA APLICAÇÃO WEB SIMPLES Com o loadbalance (mod_cluster) e as instâncias configuradas, precisamos criar uma aplicação web simples e fazer a sua implantação (deploy) em cada instância do JBoss AS 7. Para isso, vamos criar o servlet “LoadBalanceServlet” cujo código será mostrado a seguir: Arquivo “LoadBalanceServlet.java” package test; import java.io.IOException; import java.util.Calendar; import java.util.Enumeration;
import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class LoadBalanceServlet */ @WebServlet("/LoadBalanceServlet") public class LoadBalanceServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoadBalanceServlet() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); response.setContentType("text/html"); out.println(""); out.println(""); out.println("" + "Teste loadbalance - Host " + request.getRemoteAddr()); out.println(""); out.println(""); out.println(""); out.println("Nodo do JBOSS chamado: "); out.println("jboss.node.name: " + System.getProperty("jboss.node.name")); out.println("Tempo: " + Calendar.getInstance().getTimeInMillis()); out.println(""); out.println(""); out.close(); out.flush(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
A seguir será mostrado o código do arquivo web.xml contendo a configuração do Servlet. xml version="1.0" encoding="UTF-8"?> LoadBalanceTestWAR
LoadBalance test.LoadBalanceServlet 1
LoadBalance /*
Com essa configuração, basta acessar o servlet pelo seguinte endereço: < http://127.0.0.1/LoadBalanceTestWAR
Também precisamos do arquivo “ jboss-deploymentstructure.xml” para fazer o deploy da aplicação web.
Arquivo “ jboss-deployment-structure.xml” xml version="1.0" encoding="UTF-8"?>
Todos esses arquivos “.xml” devem estar na pasta WEB-INF da aplicação web. Como estamos usando a porta 80 que é padrão para o protocolo HTTP, podemos omitir a porta. Ao se fazer uma requisição para esse endereço, o mod_cluster de acordo com as políticas definidas, delegará a requisição para uma determinada instância do cluster de JBoss AS 7. Esse servlet deve criado e empacotado como um arquivo “LoadBalanceTestWAR.war”. Para testar o loadbalance, faremos diversas requisições para o mesmo endereço (http://127.0.0.1/LoadBalanceTestWAR ) diversas vezes, partindo de apenas um browser web ou diversos browsers web.
Nas figuras a seguir, serão mostradas duas chamadas para o mesmo endereço que foi processado por dois nodos diferentes. Para simular isso, basta clicar em atualizar diversas vezes, até mudar o texto da página para outro nodo do cluster.
CONCLUSÃO Esse artigo mostrou todos os passos necessários para configurar um loadbalance sobre um cluster de JBoss AS 7. E também, podemos mudar as políticas envolvidas na seleção do nodo, como por exemplo:
O nodo que estiver mais inativo, isto é, quantidade de cpu usada menor, terá prioridade para receber requisições O nodo que estiver usando menos memória heap da JVM, terá prioridade para receber requisições O primeiro nodo localizado que estiver ativo terá prioridade de receber requisições. O nodo será escolhido de forma aleatória e o escolhido, receberá a requisição. O nodo que processou menos requisições no dia terá prioridade para receber requisições. O nodo que processou uma requisição anterior do mesmo host de origem, terá prioridade para processar requisições.
Além dessas regras, podemos criar outras regras e combiná-las entre si, de acordo com as regras do negócio envolvidas. Basicamente, recebemos como ENTRADA a requisição e no fim, o loadbalance deverá retornar uma instância do cluster de JBoss AS 7 que deverá receber a requisição. Depois disso, o mod_cluster delega a requisição para o nodo escolhido. Esse processo se repete a cada requisição. Portanto, para maior aprofundamento, precisa-se saber como configurar o mod_cluster para conter regras personalizadas e de acordo com o nosso negócio em questão.
REFERÊNCIAS http://docs.jboss.org/mod_cluster/1.1.0/html/native.config.html http://docs.jboss.org/mod_cluster/1.1.0/html/demo.html
http://docs.jboss.org/mod_cluster/1.1.0/html/java.AS7config.html
POSTADO POR JOSEPOJR ÀS 21:49 MARCADORES: APACHE WEB SERVER, CLUSTER , HTTP, HTTPD , JAVA, JBOSS AS 7, JBOSS AS 7.1.3 , LOAD BALANCE, SERVIDOR DE APLICAÇÃO
12 COMENTÁRIOS: Marcelo quarta-feira, 4 de junho de 2014 13:26:00 BRT Olá, muito legal esse tutorial!!! Estou com uma dúvida, como publicar uma aplicação que está em um EAR ? Responder
josepojr
sexta-feira, 6 de junho de 2014 09:17:00 BRT
Olá Marcelo. Nos meus testes, usei arquivo WAR e também já testei com EAR. Não tem muita diferença entre um ou outro. Basta dentro do EAR ter algum WAR para você poder realizar os testes. Lógico que o arquivo jboss-deployment-structure.xml deve ser único no EAR, ou seja, colocar ele dentro da pasta META-INF. Outros subprojetos (dentro do EAR) como projeto WAR, não podem ter o arquivo jboss-deployment-structure.xml, senão dá erros no deploy. Abraços e fique com Deus José Responder Gonçalo Silva terça-feira, 4 de novembro de 2014 15:49:00 BRST Quais logs eu posso analisar para saber tudo sobre as requisições de acesso as paginas? tipo hora, ip etc? Responder
josepojr BRST
quarta-feira, 19 de novembro de 2014 13:03:00
Pode tentar pegar os arquivos "error_log" e "access_log" no diretório $HTTPD_HOME/httpd/logs/ aonde "HTTPD" é o diretório raiz de instalação do seu servidor web Apache. Mais informações de configuração, precisa entrar no site do projeto (http://httpd.apache.org/) e localizar a documentação e acredito que você deve configurar o arquivo httpd.conf que é responsável por todas as configurações do servidor web. Responder Felipe Reis terça-feira, 19 de maio de 2015 10:44:00 BRT Olá José, ótimo post obrigado! Ao executar o ./httpd_start.sh estou recebendo o seguinte erro: /opt/jboss/httpd/sbin/httpd: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory Poderia ajudar? Abs! Responder
josepojr BRT
segunda-feira, 25 de maio de 2015 22:01:00
Oi Felipe. Tentar instalar essa lib no linux: aptitude search libpcre Esse comando vai localizar as libs (bibliotecas) próximas com esse nome (libpcre.so.1). Instale o pacote com algum nome, prefixo como "dev", "devel" que significa para desenvolvedores. aptitude install libpcre-dev (exemplo) Se mesmo assim, voltar a ocorrer o mesmo erro, executar comando: ldconfig Para recarregar o cache de bibliotecas dinâmicas (arquivo .so). Responder Respostas Felipe Reis terça-feira, 26 de maio de 2015 12:34:00 BRT Valeu José!!! Responder
Jackson Emmerich terça-feira, 22 de setembro de 2015 10:49:00 BRT Olá José, estou tentando fazer essa mesma configuração para o jboss-eap-6.1, mas vi que tem diferenças, ex.: quando vc fala pra configurar o cache-container no jboss-as-7 é diferente do jboss-eap-6.1 que estou tentando fazer, vc sabe como ficaria essa configuração no jboss-eap-6.1? Responder Respostas josepojr terça-feira, 15 de dezembro de 2015 23:36:00 BRST Olá Jackson! Entre o JBoss 7 e o JBoss EAP existe diferença entre os schemas (Pasta $JBOSS_HOME/docs/schema) usados para definir cada xml (standalone-full-ha.xml por exemplo). Então, no JBoss 7 tem o arquivo $JBOSS_HOME/docs/schema/jboss-asinfinispan_1_3.xsd que define as tags de cache. Tem que procurar algo semelhante ao JBoss EAP 6 que não tenho no momento. Responder
Jackson Emmerich terça-feira, 22 de setembro de 2015 10:56:00 BRT ops desculpa eu vi que tem sim no eap-6.1, mas ele tem três tags com o parametro name diferentes: singleton, web e ebj, mas como ficaria nesse caso? Responder wender cruz sexta-feira, 1 de abril de 2016 17:57:00 BRT Jose Boa Tarde, Apenas uma pergunta, para este exemplo voce utilizou tres maquinas? Um Apache e dois server com Instancias JBOSS? Ou uma instancia que tem o jboss tem o apache? Responder
josepojr
domingo, 10 de abril de 2016 23:56:00 BRT
Oi Wender. Não, eu utilizei apenas uma máquina física. Mas o Apache Httpd roda escutando na porta 80 e três instâncias do JBoss escutando as portas 8080, 9080 e 10080. Simplesmente copiei duas vezes toda a instalação do JBoss (diretório JBOSS_HOME) e mudei apenas o deslocamento das cópias. Enquanto que na primeira instalação chamamos de "jboss-as-7.1.3.Final-node1" e as outras de "jboss-as7.1.3.Final-node2" e "jboss-as-7.1.3.Final-node3". Se usar máquinas diferentes, você só precisa mudar o endereço do load balance (mod_cluster) de cada instância. Aonde diz "127.0.0.1:6666" mudar o ip local (127.0.0.1) para o ip da máquina que está rodando o Apache. Responder
Digite seu comentário...
Comentar como:
Publicar
Unknown (Goo
Sair
Notifique-me
Visualizar
Postagem mais recente
Página inicial
Postagem mais antiga
Assinar: Postar comentários (Atom)
TRANSLATE
Selecione o idioma
POWERED BY
E S T AT Í S T I C A S D O S I T E
FREE COUNTERS
TRADUTOR
View more...
Comments