JBoss mod_cluster

Configurando Ambiente de Produção no JBoss AS 7.1.3 (JBoss EAP 6.0.1) – Parte 2

Postado em Atualizado em

Olá amigos,

Continuando o post anterior hoje nós vamos iniciar a configuração do JBoss AS 7.1.3 (JBoss EAP 6). Muitos pessoas que acompanham o blog devem estar se perguntando o por que de utizar o JBoss EAP 6 e não o JBoss AS 7.1.1.
Isso é bem simples!! O JBoss EAP 6 é baseado no JBos AS 7.1.1. Nessa versão Enterprise todos os bugs que tínhamos no JBoss AS 7.1.1 já estão corrigidos e futuramente todas essas correções irão voltar para a versão comunidade que virá a ser o JBoss AS 7.2.0. Para baixar o JBoss EAP é necessário ter uma conta em http://access.redhat.com/.Você pode criar uma conta de testes e ter acesso por 30 dias. Se decidir comprar o produto terá a sua disposição um dos melhores suportes do mundo (sem propaganda). Caso nao tenha grana como eu, você ainda poderá continuar utilizando o JBoss EAP 6 só que você estará por sua conta. O JBoss EAP 6 não “trava” depois de 30 dias, você apenas perde o direito de baixar os produtos e acessar a base de conhecimento disponibilizada no portal.

Você pode ainda compilar o JBoss EAP 6 🙂

Para facilitar vou deixar aqui os binários do JBoss EAP 6 que vamos utilizar nesse post.

Para colocar o JBoss AS 7, como serviço no Linux, existem alguns pré-requisitos. Em hipótese alguma inicie o JBoss utilizando o usuário root, pois a plataforma Java oferece APIs para execução de códigos nativos do sistema operacional e mecanismos de gerenciamento remoto. No Linux crie um usuário com privilégios adequados para iniciar o serviço do JBoss. Já no Windows crie um usuário com poderes administrativos, mas com privilégios reduzidos.

Incialmente vamos criar um grupo:

  groupadd jboss

Adicione o usuário:

  useradd -s /bin/bash -d /home/jboss -m -g jboss jboss

Vamos baixar o JBoss no diretório tmp:

 cd /tmp
 wget https://www.dropbox.com/s/nbij0z285i376h2/jboss-eap-6.0.1.zip

Crie a estrutura de diretórios para armazenar o JBoss:

 mkdir /usr/local/jboss
 chown jboss:jboss /usr/local/jboss
 su jboss
 mkdir /usr/local/jboss/7.1.3
 cd /usr/local/jboss/7.1.3
 unzip /tmp/jboss-eap-6.0.1.zip

Como boa prática antes de iniciar o JBoss pela primeira vez, faça uma cópia do perfil Domain ou Standalone  e renomeie com algum nome objetivo:

 $ cp –Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/example-domain

Uma vez instalado é fortemente aconselhável iniciar o JBoss AS para verificar se existe alguma incompatibilidade com a arquitetura do JDK utilizado ou até mesmo se a memória disponibilizada é suficiente.

 ./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
 -Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/example-domain/

 JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4) started in 29604ms - Started 162 of 245 services (82 services are passive or on-demand)

Para esse post eu decidi utilizar duas instâncias para testarmos o balanceamento de carga com o mod_cluster. Inicialmente vamos subir o Domain Controller  e depois vamos conectar dois Host Controller com uma Instância  JBoss em cada.

ModoDomain

Como já configuramos o Apache Web Server com SSL e Mod Cluster agora devemos criar e configurar o nosso Domain. Um Domain nada mais é que um conjunto de instãncias JBoss (Não tem nada a ver com cluster).  Existem alguns elementos envolvidos nessa arquitetura por exemplo o modelo Domain oferece:

  • Gerenciamento Centralizado;
  • Configuração Centralizada;
  • Deploy Centralizado;
  • Manutenção Centralizada;

A única diferença entre o modo Standalone e modo Domain é a capacidade de gerenciamento. Características como clustering, high availability,  fail-over e outros recursos do Java EE  estão disponíveis nos dois modelos!

Domain Controller  é o ponto central de controle onde está toda política de gerenciamento de todos os servidores. Nele estão as configurações de todas as instâncias que participam do domínio. O Domain Controller é basicamente um processo Host Controller onde dependendo da arquitetura se torna o Domain Controller.

Host Controller  também coordena as instâncias do domain. Por exemplo, ele é o responsável por fazer algo semelhando ao Farm Deployment(nao existe nessa versão), ou seja ele distribui o arquivo deployado para todas as instâncias do domain.

Server são as instâncias em si, onde estão as aplicações deployadas. Um ponto importante é que cada server é  um processo Java.

Continuando a configuração, execute  add-user.sh e siga as instruções como abaixo:

[jboss@localhost /]$ ./usr/local/jboss/7.1.3/jboss-eap-6.0/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) : ManagementRealm
Username : jboss
Password :
Re-enter Password :
About to add user 'jboss' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'jboss' to file '/usr/local/jboss/7.1.3/jboss-eap-6.0/standalone/configuration/mgmt-users.properties'
Added user 'jboss' to file '/usr/local/jboss/7.1.3/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" />

Foi adicionado um usuário chamado jboss com a senha 123456 para que ser utilizado na conexão entre o Host Controller e o Domain Controller.

Crie três novos perfis baseados no modo Domain e renomeie como abaixo:

$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/master
$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01
$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/slave02

Como vimos anteriormente todas as configurações e gerenciamento é realizado de forma centralizada no Domain Controller. Quando for necessário adicionar um novo grupo de servidores, configurar logs, criar datasources, alterar portas entre outras coisas, tudo isso deverá ser feito no domain.xml do Domain Controller que no nosso caso será chamado de master. Sendo assim todas as nossas instâncias JBoss usufruirão das configurações realizadas para o Domain ou para o Server Group em questão.

A primeira coisa a ser feita é definir qual o conjunto de tecnologias (subsystems) serão utilizadas na aplicação. Isso pode variar conforme os requisitos de cada sistema. Um conjunto de tecnologias (subsystems) no JBoss 7 é chamado de profile.

 <profile name="full-ha">

O JBoss AS 7 possui 4 profiles por padrão: “default”, “full”, “ha”, “full-ha” , mas nada impede de nós copiarmos qualquer um deles e renomeá-los conforme nossos requisitos.  No Java EE 6 foi introduzido o conceito de Profiles, onde pode-se criar um subconjunto de tecnologias presentes na spec  Java EE ou até mesmo adicionar novas definidas pela JCP (Java Community Process).

Mais informações: https://community.jboss.org/wiki/JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Nós vamos utilizar o profile ha pois se precisarmos utilizar o recurso de cluster vamos conseguir por que essa tecnologia (subsystem JGroups) já está pré configurada. Nós definimos que vamos utilizar um profile quando vamos criar um Grupo de Servidores: Server Group. Um server group nada mais é que um agrupamento de instâncias JBoss. Nessa arquitetura vamos utilizar apenas um server group. Isso pode ser definido na tag <server-groups> no domain.xml do master (Domain Controller). Crie um Server Group chamado grupo-apps que utilize o profile ha:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/master/configuration/domain.xml

Deixe-o como abaixo:

<server-groups>
 <server-group name="grupo-apps" profile="ha">
  <jvm name="default">
    <heap size="1303m" max-size="1303m"/>
    <permgen max-size="256m"/>
  </jvm>
  <socket-binding-group ref="ha-sockets"/>
  </server-group>
</server-groups>

No profile ha especificamente no subsystem web adicione o atributo instance-id:

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

O instance-id será passado como parâmetro na inicialização do Host Controller.

É de grande importância remover  a “silent authentication” do CLI.  Por padrão nenhum password é solicitado para usuários “locais” do CLI deixando assim uma porta para pessoas mal intencionadas realizarem o que desejarem com nossas instâncias JBoss.  Para remover essa autenticação remova as tags  <local default-user=”$local” /> e  <local default-user=”$local” allowed-users=”*” /> nos arquivos:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/master/configuration/host-master.xml
vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01/configuration/host-slave.xml
vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave02/configuration/host-slave.xml

Agora devemos configurar a autenticação dos Host Controllers. Anteriormente adicionamos um usuário chamado jboss e nesse processo foi gerado um hash com um tag <secret value=”MTIzNDU2″ />. Essa tag será utilizada nos nossos Host Controllers para se autenticarem no Domain Controller.

Edite o arquivo:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01/configuration/host-slave.xml

Adicione a tag <secret value=”MTIzNDU2″ /> em <server-identities> removendo a que estava configurada por default.

<server-identities>
   <secret value="MTIzNDU2" />
</server-identities>

Em  <domain-controller> na tag  <remote> adicione a propriedade username:

<domain-controller>
   <remote host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm" username="jboss"/>
</domain-controller>

Na tag <servers> é onde estão de fato as nossas instâncias JBoss. Quando criamos uma novo  <server> estamos criando uma nova instância JBoss.  Isso é algo similar ao copiarmos um profile all, production, web, etc em versões anteriores.

Conforme definimos o Host Controller 01 conterá apenas uma instância JBoss chamada server-one. Deixe o <servers> como abaixo:

<servers>
  <server name="server-one" group="grupo-apps">
  </server>
</servers>

Definimos que a instância JBoss server-one fará parte do Server Group “grupo-apps”.

Para finalizar na tag  <host> adicione o name slave01.

  <host name="slave01" xmlns="urn:jboss:domain:1.3">

Repita os procedimentos realizados no slave01 para o slave02 alterando apenas o nome do servidor que será server-two  e  do <host> será slave02.

No meu ambiente possuo 3 servidores:

  • Domain Controller + Apache Web Server: 192.168.0.128
  • Hostr Controller 01: 192.168.0.140
  • Hostr Controller 02: 192.168.0.117

Inicie o Domain Controler (master) utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/master
-Djboss.host.default.config=host-master.xml
-Djboss.bind.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.128

Verifique  o log:

JBAS015874: JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4) (Host Controller) started in 6181ms - Started 11 of 11 services (0 services are passive or on-demand)

O Domain Controller foi iniciado com sucesso!

Vamos conectar o primeiro Host Controller 01 (slave01) ao Master. Inicie o Perfil slave01 utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/slave01
-Djboss.host.default.config=host-slave.xml
-Djboss.domain.master.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.140
-Djboss.bind.address=192.168.0.140
-Djboss.server.name=server-one

Agora observe os logs no Domain Controller e perceba que o Host Controller 01 se conectou do Domain:

JBAS010918: Registered remote slave host "slave01", JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4)

Abra também o Mod Cluster Manager em http://192.168.0.140/mod_cluster-manager e veja que a nossa primeira instância já apareceu:

node01

Inicie o Host Controller 02 (slave02) utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/slave02
-Djboss.host.default.config=host-slave.xml
-Djboss.domain.master.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.117
-Djboss.bind.address=192.168.0.117
-Djboss.server.name=server-two

Agora observe novamente os logs no Domain Controller e perceba que o Host Controller 02 se também conectou:

JBAS010918: Registered remote slave host "slave02", JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4)

Novamente no Mod Cluster Manager agora temos as nossas duas instâncias:

node2

Para testar o Balanceamento vamos fazer o deploy da aplicação SystemProps que pode ser baixada  aqui.

Para fazer o deploy conecte do domain controller utilizando o CLI:

$ ./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/jboss-cli.sh -c --controller=192.168.0.128:9999
Authenticating against security realm: ManagementRealm
Username: jboss
Password:
[domain@192.168.0.128:9999 /]

Faça o deploy da aplicação:

[domain@192.168.0.128:9999 /] deploy /home/jboss/jboss-files/systemprops.war --server-groups=grupo-apps

A aplicação foi deployada para as instâncias do server group ( server-one e server-two).

Acesse a url do nosso balanceador e verifique se a aplicação está disponível: http://192.168.0.140/systemprops/

server-2

Perceba que estamos no server-two. Entao para testarmos o funcionamento do balanceador vamos parar o server-two e quando tentarmos um novo acesso seremos redirecionados para o server-one.

No CLI execute o seguinte comando para parar o server-two:

[domain@192.168.0.128:9999 /] /host=slave02/server-config=server-two:stop
{
"outcome" => "success",
"result" => "STOPPING"
}

Acesse novamente a aplicação: http://192.168.0.140/systemprops/

server-1

Perceba que agora estamos no server-one.

Nosso objetivo foi alcançado 🙂

Na proxima parte vamos aprender como tornar esse ambiente clusterizado!

Abraços