Configurando mod_cluster no EAP 6 – RHEL/CentOS/Fedora

modcluster_logo_450pxJBoss EAP 6 provê mecanismos de cluster com a ajuda de algumas extensões: JGroups, Infinispan e modcluster.

  • JGroups: responsável pela comunicação entre as instâncias
  • Infinispan: responsável por cache e replicação de sessão
  • modcluster: permite a utilização do httpd como load balancer

Características

  • Alta Disponibilidade (HA): execução sem interrupção
  • Escalabilidade: capacidade de manipular um grande número de requisições
  • Failover: até quando instâncias falharem, as requisições dos clientes serão atendidas
  • Tolerância à falha: o serviço é garantido até mesmo se failover ocorrer

Post anterior

Este post é continuação do post Configurando Domain Mode no EAP 6 – RHEL/CentOS/Fedora.

O link anterior é um pré-requisito e ensina a configurar algumas instâncias do EAP 6 em modo Domain. Depois de ter feito toda a configuração descrita no post, continue a partir daqui.

Ambiente clusterizado

As funcionalidades do mod_cluster estarão diponíveis entre as instâncias de um determinado grupo de servidores, no nosso caso utilizaremos o main-server-group. Assim, todas as instâncias deste grupo farão parte do ambiente clusterizado.

Arquitetura

arq_modcluster

High Availability

Podemos utlizar tanto o perfil ha quanto o full-ha, pois ambos provêm as funcionalidades específicas de cluster fornecidas por modcluster e jGroups.

Escolhi o perfil full-ha (poderia ter escolhido ha sem problema algum) para demonstrar como uma modificação na configuração é feita de maneira simples.

No arquivo domain.xml altere o perfil do grupo para full-ha e o socket-binding para full-ha-sockets. Se quiser copiar/colar o trecho depois, ele já está alterado corretamente:

Antes

<server-groups>
<server-group name=”main-server-group” profile=”full”>
<jvm name=”default”>
<heap size=”1303m” max-size=”1303m”/>
<permgen max-size=”256m”/>
</jvm>
<socket-binding-group ref=”full-sockets”/>
</server-group>
<server-group name=”other-server-group” profile=”full-ha”>
<jvm name=”default”>
<heap size=”1303m” max-size=”1303m”/>
<permgen max-size=”256m”/>
</jvm>
<socket-binding-group ref=”full-ha-sockets”/>
</server-group>
</server-groups>

Depois

<server-groups>
<server-group name=”main-server-group” profile=”full-ha“>
<jvm name=”default”>
<heap size=”1303m” max-size=”1303m”/>
<permgen max-size=”256m”/>
</jvm>
<socket-binding-group ref=”full-ha-sockets“/>
</server-group>
<server-group name=”other-server-group” profile=”full-ha“>
<jvm name=”default”>
<heap size=”1303m” max-size=”1303m”/>
<permgen max-size=”256m”/>
</jvm>
<socket-binding-group ref=”full-ha-sockets“/>
</server-group>
</server-groups>

Agora temos que definir uma senha para o HornetQ no perfil full-ha (que é o perfil do nosso main-server-group).

Procure pela linha:

<cluster-password>${jboss.messaging.cluster.password:CHANGE ME!!}</cluster-password>

Obs: preste atenção neste momento, pois existem vários perfis (default, full e ha) neste mesmo arquivo. No nosso caso iremos alterar o <profile name=”full-ha”> que fica aproximadamente na linha 1099 e a altere para:

<cluster-password>123456</cluster-password>

Esta modificação é necessária porque o sistema de mensageria HornetQ utiliza um sistema de cluster separado do jGroups. Assim que habilitamos o cluster, precisamos definir uma senha.

jboss.node.name

Existe um recurso muito interessante, principalmente quando o utilizamos em cluster, pois podemos saber exatamente “quem é quem” no sistema.

Adicione o atributo instance-id=”${jboss.node.name}” subsystem web:

<profile name=”full-ha”>

Aprox. linha 1254:

Antes

<subsystem xmlns=”urn:jboss:domain:web:1.1″ default-virtual-server=”default-host” native=”false”>

Depois

<subsystem xmlns=”urn:jboss:domain:web:1.1″ default-virtual-server=”default-host” instance-id=”${jboss.node.name}” native=”false”>

Instalando o mod_cluster

Baixe o mod_cluster versão 1.2.0: http://www.jboss.org/mod_cluster/downloads/1-2-0-Final

Baixe o pacote correspondente ao seu sistema operacional. No meu caso eu baixei o mod_cluster-1.2.0.Final-linux2-x64-ssl, pois a arquitetura do meu RHEL 6 é x86_64.

Os arquivos que iremos utilizar estão no diretório mod_cluster-1.2.0.Final-linux2-x64-ssl/opt/jboss/httpd/lib/httpd/modules, porém utilizaremos somente os seguinte módulos:

  • mod_proxy_cluster.so
  • mod_advertise.so
  • mod_slotmem.so
  • mod_manager.so

Extraia os arquivos acima para o diretório /etc/httpd/modules. No meu caso instalei na minha máquina física RHEL 6.4 que tem o IP 192.168.122.0.

Depois de copiar os arquivos para o diretório modules, edite o arquivo /etc/httpd/conf/httpd.conf.

O primeiro passo é comentar o módulo abaixo adicionando no início da linha o caracter #:

# LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

O segundo passo é comentar a linha Listen 127.0.0.1:80 adicionando #. Vamos comentá-la, pois adicionaremos outra customizada a seguir:

# Listen 127.0.0.1:80

Obs: Pode ser que ao invés de Listen 127.0.0.1:80 esteja Listen localhost:80

No fim do arquivo httpd.conf, cole o seguinte trecho:

LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

Listen 192.168.122.0:10001
<VirtualHost 192.168.122.0:10001>

<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from 192.168.122.
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0

ManagerBalancerName mycluster
ServerAdvertise On
EnableMCPMReceive

</VirtualHost>

Testando o Cluster

Primeiramente, vamos acessar todas as instâncias diretamente:

http://host1:8080/cluster-demo

http://host1:8230/cluster-demo

http://host1:8330/cluster-demo

Obs: o server-three está definido com auto-start=false, portanto está fora do ar.

http://host2:8440/cluster-demo

http://host2:8580/cluster-demo

Agora vamos acessar o Apache Web Server (httpd) que irá receber todas as requisições e as encaminhará para as instâncias que estão no grupo main-server-group:

http://host1/cluster-demo

Se a URL acima responder normalmente, o mod_cluster está funcionando perfeitamente. Para testar basta acessar de vários navegadores diferentes e visualizar nos terminais quais instâncias que estão recebendo as requisições. O interessante é acessar através do link acima e verificar qual instância recebeu a requisição e em seguida derrubá-la. Se o mod_cluster foi configurado corretamente, mesmo com algumas instâncias fora do ar, o sistema estará disponível para o usuário.

mod_cluster-manager

Para acessar o mod_cluster-manager acesse a URL:

http://192.168.122.0:10001/mod_cluster-manager

Espero ter ajudado!


Configurando Domain Mode no EAP 6 – RHEL/CentOS/Fedora

Domain Mode é uma das principais features do Enterprise Application Platform (EAP), pois permite o gerenciamento de toda a configuração das instâncias de um único ponto, no caso o arquivo domain.xml através do Domain Controller. Toda as instâncias gerenciadas pelo Domain Controller são chamadas de Host Controllers e podem ter suas configurações alteradas dependendo da necessidade. Podemos utilizar grupos de instâncias, assim podemos definir grupos instâncias que estão em diferentes hosts. 

domain

Obs: Vale lembrar que a utilizando Domain Mode não quer dizer que o ambiente está em Cluster, mas que todos os Host Controllers do ambiente estão compartilhando a configuração do Domain Controller.

Quando utilizamos Domain Mode três processos separados são iniciados:

  • Process Controller: responsável por gerenciar e start/restartar os processos;
  • Host Controller: um dos Host Controllers é o Domain Controller e os outros são slaves;
  • Server Instance: instância do servidor de aplicação;

Instalação

Instalação do JDK: https://serjaum.wordpress.com/2013/04/21/instalando-oracle-jdk6/

Instalação do EAP6: https://serjaum.wordpress.com/2013/04/21/instalando-eap-6/

Hosts

Neste exemplo utilizei duas máquinas virtuais com os respectivos IPs:

Nome da máquina: host1
IP: 192.168.122.1

Nome da máquina: host2
IP: 192.168.122.2

Obs: utilizei o KVM como hypervisor, que por padrão configura a comunicação entre todos as máquinas virtuais.

Dica: Se estiver utilizando o VirtualBox, segue >>> aqui <<< um tutorial que ensina como configurar a comunicação entre as máquinas envolvidas.

Precisamos fazer com que as máquinas host1 e host2 consigam se conectar entre si através do hostname.

Adicione no arquivo /etc/hosts os nomes das duas máquinas com seus respectivos IPs:

# vim /etc/hosts

192.168.122.1 host1
192.168.122.2 host2

Obs: faça a mesma alteração no host2

Desabilitando o Firewall

O próximo passo é desabilitar o firewall. Como root, execute o seguinte comando em ambas as máquinas:

# service iptables stop 

O comando acima desabilita o firewall.

# chkconfig iptables off 

O comando acima garante que o firewall não será ativado nos próximos boots.

Desabilitando o SELinux

Como root, altere nas duas máquinas o parâmetro SELINUX=enforcing para SELINUX=disabled

# vim /etc/sysconfig/selinux

Para confirmar que as duas máquinas estão se conectando entre si, tente executar o comando ping passando como parâmetro o IP da outra máquina.

No terminal da host1, digite:

$ ping host2

Execute o mesmo na host2.

Por questões didáticas, vamos alterar as instâncias da máquina host2, no arquivo host.xml:

Antes: 

<servers>
 <server name="server-one" group="main-server-group">
 <!-- Remote JPDA debugging for a specific server
 <jvm name="default">
 <jvm-options>
 <option value="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"/>
 </jvm-options>
 </jvm>
 -->
 </server>
 <server name="server-two" group="main-server-group" auto-start="true">
 <!-- server-two avoids port conflicts by incrementing the ports in
 the default socket-group declared in the server-group -->
 <socket-bindings port-offset="150"/>
 </server>
 <server name="server-three" group="other-server-group" auto-start="false">
 <!-- server-three avoids port conflicts by incrementing the ports in
 the default socket-group declared in the server-group -->
 <socket-bindings port-offset="250"/>
 </server>
 </servers>

Depois: 

<servers>
<server name="server-four" group="main-server-group" auto-start="true">
<socket-bindings port-offset="400"/>
</server>
<server name="server-five" group="main-server-group" auto-start="true">
<socket-bindings port-offset="500"/>
</server>
</servers>

Percebam que adicionei um port-offset nas instâncias para não termos conflitos de portas. Então, para acessarmos o instância server-four temos que apontar o browser para a URL:

http://host2:8440

Para acessarmos o server-five:

http://host2:8580

Domain Controller (host1)

Na máquina host1 aponte o terminal para o diretório /opt/jboss-eap-6.0/bin e execute o seguinte comando:

$ ./add-user.sh

[user1@host1 bin]$ ./add-user.sh

What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Realm (ManagementRealm) :
Username : master
Password : 123456
Re-enter Password :
About to add user ‘master’ for realm ‘ManagementRealm’
Is this correct yes/no? yes
Added user ‘master’ to file ‘/opt/jboss-eap-6.0/standalone/configuration/mgmt-users.properties’
Added user ‘master’ to file ‘/opt/jboss-eap-6.0/domain/configuration/mgmt-users.properties’
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value=”MTIzNDU2″ />

Iniciar o Domain Controller

Na máquina host1 aponte o terminal para o diretório /opt/jboss-eap-6.0/bin e execute o seguinte comando:

./domain.sh -b host1 -bmanagement host1

Com o EAP no ar, aponte o browser para a seguinte URL:

http://host1:9990

Username : master
Password : 123456

Na máquina host1 aponte o terminal para o diretório /opt/jboss-eap-6.0/bin e execute o seguinte comando:

[user1@host1 bin]$ ./add-user.sh

What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Realm (ManagementRealm) :
Username : slave
Password : 123456
Re-enter Password :
About to add user ‘slave’ for realm ‘ManagementRealm’
Is this correct yes/no? yes
Added user ‘slave’ to file ‘/opt/jboss-eap-6.0/standalone/configuration/mgmt-users.properties’
Added user ‘slave’ to file ‘/opt/jboss-eap-6.0/domain/configuration/mgmt-users.properties’
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value=”MTIzNDU2″ />

Obs: o usuário “slave” será utilizado para se conectar ao master através do host2, portanto devemos definir o nome “slave” para o host2. Tal tarefa será descrita adiante.

Host Controller (host2)

Remova o arquivo /opt/jboss-eap-6.0/domain/configuration/domain.xml, pois a configuração do host1 será utilizada pelo host2. Esta é a ideia quando se monta um grupo de servidores: ter um grupo de servidores compartilhando uma única configuração, nessa caso o arquivo domain.xml do host1.

$ rm domain.xml

Altere o arquivo /opt/jboss-eap-6.0/domain/configuration/host.xml

Linha 3 aprox.)

<host name=”slave” xmlns=”urn:jboss:domain:1.3″>

Linha 36 aprox.)

<domain-controller>
<remote host=”host1″ port=”9999″ security-realm=”ManagementRealm”/>
</domain-controller>

Lembram do usuário “slave” criado na primeira máquina através do add-user.sh? Precisamos converter a senha 123456 para Base64. Há diversas maneiras para codificar uma senha, vamos utilizar o link http://www.base64online.com tal tarefa. O resultado é o seguinte:

MTIzNDU2

Obs: em versões mais novas do EAP 6, como esta que estamos utilizando, esta tarefa não é necessária, pois a senha já é convertida automaticamente assim que criamos algum usuário:

To represent the user add the following to the server-identities definition <secret value=”MTIzNDU2” />

Depois de codificar a senha para Base64, precisamos adicioná-la dentro da tag <server-identities> do arquivo host.xml do host2:

Linha 8 aprox.)

<security-realm name=”ManagementRealm”>
<server-identities>
<secret value=”MTIzNDU2” />
</server-identities>

Iniciar o Host Controller

./domain.sh -b host2 -bmanagement host2

No próximo post ensinarei como montar um cluster utilizando algumas instâncias do EAP6.


Fedora/CentOS/RHEL – Instalando o EAP 6

EAP6_installerpanel_100x360

Pré-requisito

Antes de instalarmos o EAP 6 devemos instalar o JDK.

Segue o link >>>aqui<<<.

Download e Instalação

Download do EAP 6 >>> aqui <<<:

Como root, descompacte o pacote jboss-eap-6.0.1.zip utilizando a flag -d que define o destino da pasta:

# unzip diretorio_onde_esta_o_jboss/jboss-eap-6.0.1.zip -d /opt

O comando acima descompacta o EAP 6 no diretório /opt/jboss-eap-6.0

Depois de descompactar a pasta, como root, dê permissão para que o usuário tenha acesso a todos os arquivos da pasta /opt/jboss-eap-6.0:

# chown -fR sergio. /opt/jboss-eap-6.0

Obs: sergio é o nome do meu usuário no sistema operacional

Start do EAP 6

Aponte o terminal para o diretório /opt/jboss-eap-6.0/bin e execute o seguinte comando:

./domain.xml -b host1 -bmanagement host1

Obs: host1 é o hostname da minha máquina, que pode ser visualizado com o seguinte comando:

# vim /etc/hosts

192.168.122.1 sfantin
192.168.122.146 host1
192.168.122.239 host2

Para verificar se a instalação ocorreu com sucesso, aponte o browser para a seguinte URL:

http://host1:8080

Resultado

jboss1


Fedora/CentOS/RHEL – Instalando o Oracle JDK 6

Para este exemplo utilizaremos o JDK da Oracle, que pode ser baixado >>>aqui<<<.

O arquivo jdk-6u43-linux-x64-rpm.bin por padrão não é executável, para torná-lo executável digite o seguinte comando como root:

# chmod +x jdk-6u43-linux-x64-rpm.bin

Em seguida (também como root) execute o arquivo:

# ./jdk-6u43-linux-x64-rpm.bin

Depois de instalado, edite o arquivo .bashrc:

# vim ~/.bashrc

Adicione a seguinte linha no fim do arquivo .bashrc:

$ export JAVA_HOME=/usr/java/jdk1.6.0_43

Como root, execute o seguinte comando:

# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_43/bin/java 15000

Como root, execute o seguinte comando:

# alternatives --config java

As seguintes informações serão exibidas:

There are 2 programs which provide ‘java’.

Selection    Command
———————————————–
*+ 1      /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
2           /usr/java/jdk1.6.0_43/bin/java

Obs: o sinal de [+] indica que a JRE OpenJDK está sendo utilizada.

Para alterar para o JDK instalado por nós, vamos digitar o número 2 e apertar ENTER:

Enter to keep the current selection[+], or type selection number: 2

Obs: Caso haja outras instalações, o número pode mudar.

Para verificar a instalacão digite o seguinte comando:

$ java -version

A saída deverá ser bem algo bem parecido com:

java version “1.6.0_43”
Java(TM) SE Runtime Environment (build 1.6.0_43-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)


Livro – JBoss AS 7 Configuration, Deployment and Administration

Adquiri recentemente  o livro JBoss AS 7 Configuration, Deployment and Administration escrito por Francesco Marchioni. O livro pode ser indicado tanto para desenvolvedores quanto para administradores, pois cobre os principais conceitos da nova versão do JBoss AS 7 como configuração, gerenciamento, deployment, administração, clustering, balanceamento de carga e computação em nuvem.

O que o livro ensina

  • Entender a nova estrutura do servidor de aplicações
  • Configurar serviços como conexões entre bancos de dados, JMS e transações
  • Gerenciar o servidor de aplicações utilizando Admin Console e Command Line Interface (CLI)
  • Configurar e executar cluster entre nós e prover alta escalabilidade as suas aplicações
  • Garantir segurança nas aplicações
  • Instalar aplicações na nuvem através do OpenShift
  • Customizar o servidor de aplicações para ganho de performance

Pontos interessantes

  • Separação entre Domain e Standalone
  • Configuração via linha de comando (CLI)
  • Gerenciamento de mod_cluster via CLI
  • Configuração Infinispam
  • Balanceamento de carga entre nós
  • Configuração JGroups
  • Instalação do OpenShift e criação de aplicação preparada para a nuvem

Se você desenvolve aplicações JEE que rodam no JBoss AS 7 ou pretende migrar de versões mais antigas para esta versão, recomendo que compre o livro, pois o autor aborda de uma forma simples e agradável os conceitos e configurações onde cada capítulo pode ser lido separadamente, não obrigando o leitor a ler todo o livro.

Mais detalhes

Páginas: 380
Editora: Packt Publishing (16/Dez/2011)
Idioma: Inglês
ISBN-10: 1849516782


Cluster Standalone EAP 6/JBoss AS 7: MacBook e Ubuntu


A Red Hat veio com tudo com o novo JBoss AS 7, e dessa vez a nova versão do servidor de aplicações de código aberto mais conhecido do mundo tem suporte completo à especificação JEE 6 e sobe em pouco mais de dois segundos.

Depois de baixar e fazer os primeiros testes, resolvi criar um tutorial que ensina a criar um cluster standalone em duas máquinas. Este é o tipo mais simples de cluster, pois é executado em duas máquinas diferentes. Como cada JBoss está sendo executado em uma máquina dedicada, podemos definir o cluster como Horizontal.

Antes de iniciarmos, precisamos saber os IPs dos nós envolvidos:

  1. IP do MacBook: 192.168.11.50
  2. IP do Ubuntu:  192.168.11.70

Pra descobrir o IP de cada máquina digite no Terminal:

ifconfig | grep inet

Dica para habilitar o SSH no MacBook:
  • Systems Preferences –> Sharing –> Marque a opção Remote Login.

Para verificar se a operação teve sucesso tente acessar o MacBook da máquina Ubuntu digitando: ssh usuarioDoMacBook@ipDoMacBook, no meu caso:

ssh sergiofantin@192.168.11.50

Digite login/senha para o usuário do MacBook.

Instalando o JBoss AS 7

Cada máquina irá precisar de uma instalação do JBoss. Para isso baixe o JBoss 7 aqui: http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.tar.gz

  • Descompacte o JBoss 7 no diretório raíz do usuário de cada máquina, ou em outro diretório de sua escolha:

tar -vzxf jboss-as-7.1.1.Final.tar.gz

Subindo a JBoss 7 no Ubuntu

  • Aponte o terminal para o diretório bin do JBoss:

cd ~/jboss-as-7.1.1.Final/bin

  • Execute o seguinte comando:

./standalone.sh -c standalone-ha.xml -b 192.168.11.70 -u 230.0.0.4 -Djboss.server.base.dir=../standalone -Djboss.node.name=nodeUbuntu

Importante:

Para que o cluster funcione corretamente, tenha certeza que:

  • Os dois servidores devem ter o mesmo endereço de multicast: -u 230.0.0.4
  • Os dois servidores devem ter nomes diferentes: O nó Ubuntu foi chamado de nodeUbuntu e o nó MacBook de nodeMacBook
  • Os dois servidores devem ser executados nos respectivos endereços IPs de suas máquinas: O nó Ubuntu -b 192.168.11.70 e o nó MacBook -b 192.168.11.50

Leia o resto deste post »