Cluster JBoss A-MQ : Master/Slave com File System compartilhado

Introdução

O ponto fundamental desta abordagem é prover Alta Disponibilidade (HA) em cenários de produção utilizando ActiveMQ. Na configuração master/slave existe somente um broker Master e vários slaves aguardando a falha do master para serem promovidos, na verdade somente um será. A falha do master é detectada pela falta de conectividade entre o master e os slaves.
masterslave

Duas configurações

A versão 6.0 do Red Hat JBoss A-MQ suporta dois diferentes tipos de configurações master/slave:

  • Shared nothing, onde cada broker ActiveMQ tem seu próprio message storage;
  • Shared storage (proposta deste tutorial), onde múltiplos brokers ActiveMQ brokers podem se contectar ao message store (banco relacional ou sistema de arquivos) compartilhado mas somente um broker estará ativo ao mesmo tempo. Nenhum intervenção manual é requerida para manter a integridade de aplicação. Nenhum limitação de número de brokers slave. O master terá o lock do DB.

Três tipos de Message Stores

  1. File System Master Slave compartilhado: por exemplo SAN, NFS, etc.
  2. JDBC Master Slave:  Um banco de dados compartilhado. Não é a melhor opção tem termos de performance porque não utiliza journal de alta performance, mas a configuração é bem simples.

Por que usar File System ao invés de Banco de Dados?

Utilizar file system compartilhado é a melhor solução para prover Alta Disponibilidade, pois combina o alto throughput do KahaDB e a simplicidade de se utilizar um recurso compartilhado. KahaDB é extremamente rápido e é limitado somente pela performance do file system.
Não é necessário configuração adicional dos brokers e não existe limite de slaves acessando o file system.

Neste tutorial utilizarei o Network File System (NFS) como file system compartilhado, porém poderia ter escolhido outros como Global File System (GFS) 2 ou Storage Area Network (SAN).

Como acessar o broker?

Clientes ActiveMQ Java e C++ provêem um protocolo de transferência chamado de failover,  que tenta se conectar automaticamente ao novo broker master sem perda de mensagens. Os clientes dos brokers utilizarão o seguinte protocolo de transporte:

failover://(tcp://host1:61616,tcp://host2:61616)?randomize=false

Dica: a URI acima irá tentar automaticamente estabelecer uma conexão com o mesmo broker no caso de queda. Portanto, mesmo que haja somente um broker no ambiente, é recomendado que o protocolo failover seja utilizado, pois no caso de queda, ele tentará se conectar novamente.

Instalação

1) Download

O Red Hat JBoss A-MQ 6.0 pode ser baixo aqui: https://www.jboss.org/products/amq.html

Obs: disponível somente para fins de Desenvolvimento.

2) Descompactar

Descompacte o A-MQ nas duas máquinas. No meu caso descopactei em /opt de cada RHEL virtual.

3) Conectividade

Tenha certeza que as máquinas conseguem se comunicar entre elas: localhost (física), host1 (virtual) e host2 (virtual).

4) Diretório compartilhado

Criei um /shared na minha máquina física utilizando NFS e o exportei para as máquinas virtuais: host1 e host2

Configurações host1

1) users.properties

Altere o arquivo $jboss-a-mq-diretorio/etc/users.properties descomentando a linha:

#admin=admin,admin

2) system.properties

Altere o arquivo $jboss-a-mq-diretorio/etc/system.properties substituindo localhost pelo hostname da máquina virtual. No meu caso é o host1:

# Activemq configuration
activemq.port = 61616
activemq.host = host1 
activemq.url = tcp://${activemq.host}:${activemq.port}

3) activemq.xml

Altere o arquivo $jboss-a-mq-diretorio/etc/activemq.xml

<broker xmlns=”http://activemq.apache.org/schema/core&#8221;
brokerName=”broker_host1
dataDirectory=”${data}”
useJmx=”true”
start=”false”>

<transportConnectors>
<!– Na perspectiva do cliente a uri é usada para criar uma conexão com o broker para enviar/receber mensages –>
<transportConnector name=”openwire” uri=”tcp://host1:61616″/>
</transportConnectors>

<persistenceAdapter>
<kahaDB directory=“/shared“>
</persistenceAdapter>

<managementContext>
<managementContext createConnector=”trueconnectorPort=”1091″/>
</managementContext>

Obs: coloquei somente os trechos alterados.

Configurações host2

1) users.properties

Altere o arquivo $jboss-a-mq-diretorio/etc/users.properties descomentando a linha:

#admin=admin,admin

2) system.properties

Altere o arquivo $jboss-a-mq-diretorio/etc/system.properties substituindo localhost pelo hostname da máquina virtual. No meu caso é o host2:

# Activemq configuration
activemq.port = 61616
activemq.host = host2 
activemq.url = tcp://${activemq.host}:${activemq.port}

3) activemq.xml

Altere o arquivo $jboss-a-mq-diretorio/etc/activemq.xml

<broker xmlns=”http://activemq.apache.org/schema/core&#8221;
brokerName=”broker_host2
dataDirectory=”${data}”
useJmx=”true”
start=”false”>

<transportConnectors>
<!– Na perspectiva do cliente a uri é usada para criar uma conexão com o broker para enviar/receber mensages –>
<transportConnector name=”openwire” uri=”tcp://host2:61616″/>
</transportConnectors>

<persistenceAdapter>
<kahaDB directory=“/shared“>
</persistenceAdapter>

<managementContext>
<managementContext createConnector=”true” connectorPort=”1092″/>
</managementContext>

Obs: coloquei somente os trechos alterados.

Start do host1

Execute o seguinte arquivo $jboss-a-mq-diretorio/bin 

./amq 

Console host1

2013-11-05 12:26:30,843 | INFO | veMQ Broker: amq | PListStoreImpl | tore.kahadb.plist.PListStoreImpl 331 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | PListStore:[/opt/jboss-a-mq-6.0.0.redhat-024/data/amq/broker_host1/tmp_storage] started
2013-11-05 12:26:31,004 | INFO | JMX connector | ManagementContext | q.broker.jmx.ManagementContext$1 138 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1091/jmxrmi
2013-11-05 12:26:31,016 | INFO | veMQ Broker: amq | BrokerService | he.activemq.broker.BrokerService 595 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Using Persistence Adapter: KahaDBPersistenceAdapter[/shared]
2013-11-05 12:26:32,252 | INFO | veMQ Broker: amq | MessageDatabase | .kahadb.MessageDatabase$Metadata 147 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | KahaDB is version 4
2013-11-05 12:26:32,264 | INFO | veMQ Broker: amq | MessageDatabase | emq.store.kahadb.MessageDatabase 552 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Recovering from the journal …
2013-11-05 12:26:32,265 | INFO | veMQ Broker: amq | MessageDatabase | emq.store.kahadb.MessageDatabase 565 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Recovery replayed 1 operations from the journal in 0.009 seconds.
2013-11-05 12:26:32,403 | INFO | veMQ Broker: amq | BrokerService | he.activemq.broker.BrokerService 634 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Apache ActiveMQ 5.8.0.redhat-60024 (broker_host1, ID:host1-60970-1383672392281-0:1) is starting
2013-11-05 12:26:32,434 | INFO | veMQ Broker: amq | TransportServerThreadSupport | ort.TransportServerThreadSupport 72 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Listening for connections at: tcp://host1:61616
2013-11-05 12:26:32,435 | INFO | veMQ Broker: amq | TransportConnector | tivemq.broker.TransportConnector 254 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Connector openwire Started
2013-11-05 12:26:32,437 | INFO | veMQ Broker: amq | BrokerService | he.activemq.broker.BrokerService 658 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Apache ActiveMQ 5.8.0.redhat-60024 (broker_host1, ID:host1-60970-1383672392281-0:1) started
2013-11-05 12:26:32,476 | INFO | veMQ Broker: amq | ActiveMQServiceFactory | q.fabric.ActiveMQServiceFactory$ 52 | 120 – org.jboss.amq.mq-fabric – 6.0.0.redhat-024 | Broker amq has started.
2013-11-05 12:35:59,091 | INFO | qtp252820188-194 | RemoteJMXBrokerFacade | tivemq.web.RemoteJMXBrokerFacade 153 | 133 – org.jboss.amq.mq-web-console – 5.8.0.redhat-60024 | Connected via JMX to the broker at service:jmx:rmi:///jndi/rmi://host1:1091/karaf-root

Start do host2

Execute o seguinte arquivo $jboss-a-mq-diretorio/bin 

./amq 

Console host2

2013-11-05 12:26:37,533 | INFO | veMQ Broker: amq | PListStoreImpl | tore.kahadb.plist.PListStoreImpl 331 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | PListStore:[/opt/jboss-a-mq-6.0.0.redhat-024/data/amq/broker_host2/tmp_storage] started
2013-11-05 12:26:37,588 | INFO | Executor: 1 | DispatcherServlet | ork.web.servlet.FrameworkServlet 463 | 133 – org.jboss.amq.mq-web-console – 5.8.0.redhat-60024 | FrameworkServlet ‘dispatcher’: initialization completed in 338 ms
2013-11-05 12:26:37,657 | INFO | JMX connector | ManagementContext | q.broker.jmx.ManagementContext$1 138 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1092/jmxrmi
2013-11-05 12:26:37,667 | INFO | veMQ Broker: amq | BrokerService | he.activemq.broker.BrokerService 595 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Using Persistence Adapter: KahaDBPersistenceAdapter[/shared]
2013-11-05 12:26:37,778 | INFO | veMQ Broker: amq | SharedFileLocker | .activemq.store.SharedFileLocker 58 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Database /shared/lock is locked… waiting 10 seconds for the database to be unlocked. Reason: java.io.IOException: File ‘/shared/lock’ could not be locked.
2013-11-05 12:26:47,899 | INFO | veMQ Broker: amq | SharedFileLocker | .activemq.store.SharedFileLocker 58 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Database /shared/lock is locked… waiting 10 seconds for the database to be unlocked. Reason: java.io.IOException: File ‘/shared/lock’ could not be locked.
2013-11-05 12:26:58,012 | INFO | veMQ Broker: amq | SharedFileLocker | .activemq.store.SharedFileLocker 58 | 104 – org.apache.activemq.activemq-osgi – 5.8.0.redhat-60024 | Database /shared/lock is locked… waiting 10 seconds for the database to be unlocked. Reason: java.io.IOException: File ‘/shared/lock’ could not be locked.

Ou seja: aguardando a liberação do lock, tentando checar a cada 10 segundos

Na maquina física

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;

public class SampleClient {

public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory =

new ActiveMQConnectionFactory(“failover:(tcp://host1:61616,tcp://maquina2:61616)?timeout=1000“);

Connection connection = factory.createConnection(“admin”, “admin”);
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
Queue queue = session.createQueue(“SampleQueue“);
MessageProducer producer = session.createProducer(queue);

producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

// send messages
for (int i = 0; i < 100; i++) {
producer.send(session.createTextMessage(i + ” message”));
System.out.println(“Sent message ” + i);
Thread.sleep(1000);
}
producer.close(); session.close(); connection.close();
}
}

O programa acima envia 100 mensagens para o broker.

fuse-amq

Vou deixar enviando até completar 10 mensagens e em seguida derrubarei o broker que está recebendo as mensagens:

[ActiveMQ Task-1] FailoverTransport INFO Successfully connected to tcp://host1:61616
Sent message 0
Sent message 1
Sent message 2
Sent message 3
Sent message 4
Sent message 5
Sent message 6
Sent message 7
Sent message 8
Sent message 9
Sent message 10
[na/192.168.122.153:61616@52382] FailoverTransport WARN Transport (tcp://192.168.122.153:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect
[ActiveMQ Task-1] FailoverTransport INFO Successfully reconnected to tcp://host2:61616
Sent message 11
Sent message 12
Sent message 13
Sent message 14
Sent message 15
Sent message 16
Sent message 17
Sent message 18
Sent message 19
Sent message 20

Acessando o console

http://host2:8181/activemqweb/queueGraph.jsp

queue-view


Compilando mod_jk no Fedora 18

Pré-requisitos

Instale o compilador gcc

[root@sfantin]# yum install gcc

Instale o módulo gcc-c++

[root@sfantin]# yum install gcc-c++

Instale o Apache

[root@sfantin]# yum install httpd

Compilando o mod_jk

Download do código fonte

tomcat-connectors-1.2.37-src.tar.gz

Descompactar

[root@sfantin tmp]# tar xzvf tomcat-connectors-1.2.37-src.tar.gz

Entrar no diretório

[root@sfantin tmp]# cd tomcat-connectors-1.2.37-src/native

Localize o apxs

[root@sfantin tomcat-connectors-1.2.37-src]# whereis apxs

apxs: /bin/apxs /usr/bin/apxs /usr/share/man/man1/apxs.1.gz

Execute

[root@sfantin native]# ./configure --with-apxs=/usr/bin/apxs

checking build system type… x86_64-unknown-linux-gnu
checking host system type… x86_64-unknown-linux-gnu
checking target system type… x86_64-unknown-linux-gnu
checking for a BSD-compatible install… /bin/install -c
checking whether build environment is sane… yes
checking for gawk… gawk

APRINCLUDEDIR is -I/usr/include/apr-1 -I/usr/include/apr-1
building connector for “apache-2.0”
checking for gcc… gcc -std=gnu99
checking for C compiler default output file name… a.out
checking whether the C compiler works… yes

checking for sys/stat.h… yes

checking for g++… g++
checking whether we are using the GNU C++ compiler… yes
checking whether g++ accepts -g… yes
checking dependency style of g++… none
checking how to run the C++ preprocessor… g++ -E

checking the maximum length of command line arguments… 32768
checking command to parse /bin/nm -B output from gcc -std=gnu99 object… ok
checking for objdir… .libs
checking for ar… ar
checking for ranlib… ranlib
checking for strip… strip
checking if gcc -std=gnu99 supports -c -o file.o… yes
checking whether the gcc -std=gnu99 linker (/bin/ld -m elf_x86_64) supports shared libraries… yes

checking for shl_load in -ldld… no
checking for dlopen… no
checking for dlopen in -ldl… yes
checking whether a program can dlopen itself… yes
checking whether a statically linked program can dlopen itself… yes

checking for dlopen in -ldl… (cached) yes
checking whether a program can dlopen itself… (cached) yes
checking whether a statically linked program can dlopen itself… (cached) yes
appending configuration tag “F77” to libtool
checking if libtool supports shared libraries… yes
checking whether to build shared libraries… yes
checking whether to build static libraries… yes
checking for f95 option to produce PIC… -fPIC
checking if f95 PIC flag -fPIC works… yes
checking if f95 supports -c -o file.o… yes
checking whether the f95 linker (/bin/ld -m elf_x86_64) supports shared libraries… yes
checking dynamic linker characteristics… GNU/Linux ld.so
checking how to hardcode library paths into programs… immediate
checking whether stripping libraries is possible… yes

configure: creating ./config.status
config.status: creating Makefile
config.status: creating apache-1.3/Makefile

config.status: creating common/config.h
config.status: executing depfiles commands

Execute o comando

[root@sfantin native]# make

Making all in common
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/common’
/usr/lib64/apr-1/build/libtool –silent –mode=compile gcc -std=gnu99 -I/usr/include/httpd -DHAVE_CONFIG_H -O2 -g -pipe -Wall -Wp,-

Making all in apache-2.0
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′
/usr/lib64/apr-1/build/libtool –silent –mode=compile gcc -std=gnu99 -I/usr/include/httpd -DHAVE_CONFIG_H -DUSE_APACHE_MD5 -I ../common -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic -pthread -DHAVE_APR -I/usr/include/apr-1 -I/usr/include/apr-1 -DHAVE_CONFIG_H -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -c mod_jk.c -o mod_jk.lo
/usr/lib64/apr-1/build/libtool –silent –mode=link gcc -std=gnu99 -I/usr/include/httpd -DHAVE_CONFIG_H -DUSE_APACHE_MD5 -I ../common -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic -pthread -DHAVE_APR -I/usr/include/apr-1 -I/usr/include/apr-1 -DHAVE_CONFIG_H -pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -Wl,-z,relro,-z,now -o mod_jk.la -module -rpath /usr/lib64/httpd/modules -avoid-version mod_jk.lo ../common/jk_ajp12_worker.lo ../common/jk_connect.lo ../common/jk_msg_buff.lo ../common/jk_util.lo ../common/jk_ajp13.lo ../common/jk_pool.lo ../common/jk_worker.lo ../common/jk_ajp13_worker.lo ../common/jk_lb_worker.lo ../common/jk_sockbuf.lo ../common/jk_map.lo ../common/jk_uri_worker_map.lo ../common/jk_ajp14.lo ../common/jk_ajp14_worker.lo ../common/jk_md5.lo ../common/jk_shm.lo ../common/jk_ajp_common.lo ../common/jk_context.lo ../common/jk_url.lo ../common/jk_status.lo
../scripts/build/instdso.sh SH_LIBTOOL=’/usr/lib64/apr-1/build/libtool –silent’ mod_jk.la `pwd`
/usr/lib64/apr-1/build/libtool –silent –mode=install cp mod_jk.la /tmp/tomcat-connectors-1.2.37-src/native/apache-2.0/
libtool: install: warning: remember to run `libtool –finish /usr/lib64/httpd/modules’
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native’
make[1]: Nothing to be done for `all-am’.
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native’
target=”all”; \
list=’common apache-2.0′; \
for i in $list; do \
echo “Making $target in $i”; \
if test “$i” != “.”; then \
(cd $i && make $target) || exit 1; \
fi; \
done;
Making all in common
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/common’
make[1]: Nothing to be done for `all’.
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native/common’
Making all in apache-2.0
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′
../scripts/build/instdso.sh SH_LIBTOOL=’/usr/lib64/apr-1/build/libtool –silent’ mod_jk.la `pwd`
/usr/lib64/apr-1/build/libtool –silent –mode=install cp mod_jk.la /tmp/tomcat-connectors-1.2.37-src/native/apache-2.0/
libtool: install: warning: remember to run `libtool –finish /usr/lib64/httpd/modules’
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′

Execute o comando

[root@sfantin native]# make install

Making install in common
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/common’
make[1]: Nothing to be done for `install’.
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native/common’
Making install in apache-2.0
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′

Installing files to Apache Modules Directory…
/usr/bin/apxs -i mod_jk.la
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL=’/usr/lib64/apr-1/build/libtool’ mod_jk.la /usr/lib64/httpd/modules
/usr/lib64/apr-1/build/libtool –mode=install install mod_jk.la /usr/lib64/httpd/modules/
libtool: install: install .libs/mod_jk.so /usr/lib64/httpd/modules/mod_jk.so
libtool: install: install .libs/mod_jk.lai /usr/lib64/httpd/modules/mod_jk.la
libtool: install: install .libs/mod_jk.a /usr/lib64/httpd/modules/mod_jk.a
libtool: install: chmod 644 /usr/lib64/httpd/modules/mod_jk.a
libtool: install: ranlib /usr/lib64/httpd/modules/mod_jk.a
libtool: finish: PATH=”/usr/local/apache-maven/apache-maven-3.0.5/bin:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/sbin” ldconfig -n /usr/lib64/httpd/modules
———————————————————————-
Libraries have been installed in:
/usr/lib64/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR’
flag during linking and do at least one of the following:
– add LIBDIR to the `LD_LIBRARY_PATH’ environment variable
during execution
– add LIBDIR to the `LD_RUN_PATH’ environment variable
during linking
– use the `-Wl,-rpath -Wl,LIBDIR’ linker flag
– have your system administrator add LIBDIR to `/etc/ld.so.conf’

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
———————————————————————-
chmod 755 /usr/lib64/httpd/modules/mod_jk.so

Please be sure to arrange /etc/httpd/conf/httpd.conf…

make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native/apache-2.0′
make[1]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native’
make[2]: Entering directory `/tmp/tomcat-connectors-1.2.37-src/native’
make[2]: Nothing to be done for `install-exec-am’.
make[2]: Nothing to be done for `install-data-am’.
make[2]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native’
make[1]: Leaving directory `/tmp/tomcat-connectors-1.2.37-src/native’

O conector que acabou de ser criado está em:

/usr/lib64/httpd/modules/mod_jk.so

PS: dica do meu caro Raul Leite

Pronto!

 


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)