sexta-feira, 15 de maio de 2015

Como criar um Load Balancer e Cluster com WildFly 8

UPDATE: Fiz um novo tutorial para o WildFly 10: http://localhost8080.blogspot.com.br/2016/09/load-balancer-com-wildfly-10.html


Olá galera!

Esse post mostra como montar um ambiente com um Apache HTTP Server como loadbalancer e vários WildFly 8 em Cluster utilizando o modo domain para facilitar a gestão do ambiente.



Esse ambiente foi apresentado em uma palestra no TDC Floripa 2015. Para ver os slides: TDC Floripa - Palestra WildFly Avançado

Utilizei como base para montar esse ambiente os posts do Mauricio Magnani e ajuda do pessoal do JBUG Brasil.

Todas as máquinas utilizadas para montar esse ambiente utilizam CentOs 7. Você pode utilizar o S.O. que desejar, caso tenha alguma dificuldade é só entrar em contato.

Você precisará de 4 máquinas:
- maq01: Apache HTTP Server
- maq02: WildFly Master
- maq03: WildFly Server1
- maq04: WildFly Server2

Em todas as máquinas

- Configure a rede conforme desejado:
/etc/init.d/network stop
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/sysconfig/network
vi /etc/resolv.conf
/etc/init.d/network start

- Teste se a rede está OK
ping www.google.com
ifconfig

Maq01 - Apache HTTP Server
yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y

sudo service httpd start

- Acesse no browser de sua máquina se o Apache HTTP Server está no ar, só acessar pelo ip: http://<ip_da_maquina>

- Baixe o mod_cluster
wget http://downloads.jboss.org/mod_cluster//1.3.1.Final/linux-x86_64/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
tar -zxvf mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
cp mod_advertise.so /etc/httpd/modules/
cp mod_manager.so /etc/httpd/modules/
cp mod_proxy_cluster.so /etc/httpd/modules/
cp mod_cluster_slotmem.so /etc/httpd/modules/

- Comente a linha do mod_proxy_balancer pois será usado o mod_cluster
cd /etc/httpd/conf.modules.d
vi 00-proxy.conf

- A linha deve ficar assim:
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so


- Crie e adicione o conteúdo do arquivo mod_cluster.conf
cd /etc/httpd/conf.d/
touch mod_cluster.conf
vi mod_cluster.conf

LoadModule cluster_slotmem_module modules/mod_cluster_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

MemManagerFile /var/cache/mod_cluster

Maxcontext 100
Maxnode 100
Maxhost 100

<VirtualHost *:80>

<Directory />
Order deny,allow
Allow from all
</Directory>

<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
#Order deny,allow
#Deny from all
#Allow from all
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0
ServerAdvertise Off
EnableMCPMReceive Off

</VirtualHost>

- Crie um usuário e senha
htpasswd -c /etc/modclusterpassword admin

- Reinicie o Apache:
sudo service httpd stop
sudo service httpd start

- Teste novamente no browser: http://<ip_da_maquina>

- Teste no browser o mod_cluster: http://<ip_da_maquina>/mod_cluster_manager



Maq02, Maq03, Maq04

- Instale e configure o Java
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm

rpm -Uvh jdk-7u79-linux-x64.rpm

alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000

- Instale o WildFly 8:
wget http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip

yum install unzip

unzip wildfly-8.2.0.Final.zip  -d /opt/
ln -s /opt/wildfly-8.2.0.Final /opt/wildfly


- Configure um usuário no linux:
groupadd wildfly
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly
chown -R wildfly:wildfly /opt/wildfly-8.2.0.Final
chown -h wildfly:wildfly /opt/wildfly

sudo vi /etc/sudoers
wildfly ALL=(ALL) NOPASSWD:ALL

passwd wildfly
su wildfly

- Configure o WildFly
cd /etc/default
vi wildfly.conf
descomentar JBOSS_USER

- Inicie o WildFly
sudo service wildfly start

- Veja no log se não deu erros
vi /opt/wildfly/standalone/log/server.log

- Pare o WildFly
sudo service wildfly stop


Maq02 - WildFly Master

- Configure o WildFly
sudo vi /etc/default/wildfly.conf

JBOSS_MODE=domain
JBOSS_DOMAIN_CONFIG=domain.xml
JBOSS_HOST_CONFIG=host-master.xml
STARTUP_WAIT=30
SHUTDOWN_WAIT=30
JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log

- Faça login com o usuário wildlfy
su wildfly

- Adicione a linha para setar o parametro jboss.bind.address.management, adicione junto com as outras linhas de JAVA_OPTS
vi /opt/wildfly/bin/domain.conf
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address.management=<IP_DA_MAQUINA>"

- Configure o domain.xml
vi /opt/wildfly/domain/configuration/domain.xml

de:
 <server-groups>
[...]
 </server-groups>

para:
<server-groups>
   <server-group name="arquitetura-grupo-1" profile="full-ha">
    <jvm name="default">
      <heap size="512m" max-size="512m"/>
      <permgen max-size="256m"/>
    </jvm>
    <socket-binding-group ref="full-ha-sockets"/>
   </server-group>
</server-groups>

- Crie um usuário dentro do WildFly para comunicação no modo domain, usaremos mais para frente
sh /opt/wildfly/bin/add-user.sh
[enter]
wuser
mortadela@1
mortadela@1
[enter]
yes
yes

- Anote o secret gerado após criar o usuáro pois usaremos adiante:
 <secret value="bW9ydGFkZWxhQDE=" />

- Crie um usuário para acessar o webconsole
sh /opt/wildfly/bin/add-user.sh
[enter]
domainadmin
mortadela@1
mortadela@1
[enter]
yes
no


Maq03 e Maq04

- Configure o WildFly:
sudo vi /etc/default/wildfly.conf

JBOSS_USER=wildfly
JBOSS_MODE=domain
JBOSS_HOST_CONFIG=host-slave.xml
STARTUP_WAIT=30
SHUTDOWN_WAIT=30
JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log


- Adicione as linhas de JAVA_OPTS:
vi /opt/wildfly/bin/domain.conf

JAVA_OPTS="$JAVA_OPTS -Djboss.domain.master.address=<IP MASTER>"
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=<IP MAQUINA>"

- Configure o slave:
vi /opt/wildfly/domain/configuration/host-slave.xml

- adicione name no <host (na maq03 adicione host1, na maq04 adicione host2)
<host name="server-host1-widfly"

- altere o <secret> para o secret gerado no master

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

- Altere o servers para: (na maq03 adicione arquitetura-1, na maq04 adicione arquitetura-2)
<servers>
   <server name="arquitetura-1" group="arquitetura-grupo-1"/>
</servers>


Maq02, Maq03, Maq04

- Inicie o WildFly
sudo service wildfly start

Maq02
- Faça deploy de uma aplicação de testes
1) Entre via browser no console admin do WildFly master: http://<ip_wildfly_master>:9990/
2) Digite usuário domainadmin e a senha mortadela@1
3) Acesse a parte de deployments
4) Faça o deploy da aplicação systemprops: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/systemprops.war
5) Clique em Assign e associe ao grupo grupo-arquitetura-1

- Teste o load balancer
1) Acesse via broser a aplicação pelo apache http server: http://<ip_do_apache>/systemprops
2) A aplicação mostrará em qual host você vai estar: arquitetura-1 ou arquitetura-2. Vai depender de onde o loadbalancer te direcionou
3) Vá até a máquina que você foi direcionado (arquitetura-1 por exemplo) e pare o WildFly: sudo service wildfly stop
4) Acesse a mesma URL e veja que você foi redirecionado para o arquitetura-2, ou seja, o loadbalancer está funcinando
5) Suba novamente o wildfly: sudo service wildfly start

- Teste o cluster:
1) Faça deploy da aplicação de teste do cluster: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/cluster-example.war
2) Acesse http://<ip_do_apache>/cluster
3) Veja uma contagem acontecendo, esse valor está num EJB Stateful
4) Pare um wildfly
5) A contagem deve continuar
6) Suba a máquina que parou e pare a outra
7) A contagem deve continuar, ou seja, o cluster está funcionando.

Mais detalhes:
- Esse tutorial foi baseado neste:
https://jbossdivers.wordpress.com/2014/03/23/configurando-um-ambiente-wildfly-8-profissional/
https://jbossdivers.wordpress.com/2014/03/23/configurando-um-ambiente-wildfly-8-profissional-parte-2/

- Para mais informações sobre mod_cluster
http://mod-cluster.jboss.org/

- Dúvidas podem ser tiradas no JBUG Brasil:
https://developer.jboss.org/groups/jbug-brasil

Vaaaaleu!!
Adriano Schmidt

18 comentários:

  1. Olá Adriano, essa configuração funciona para jboss EAP-6.1 ?

    ResponderExcluir
    Respostas
    1. opa, funciona sim! já montei esse mesmo ambiente com o EAP-6.1, talvez vc encontre alguma pequena diferença na configuração, mas nada complicado de identificar... qualquer coisa é só abrir um tópico no JBug Brasil que vamos resolvendo por lá: https://developer.jboss.org/groups/jbug-brasil abração!!!

      Excluir
  2. Cara ta faltando coisa ai, coloque a parte que deve ser colocado o ip do balanceador no master.

    ResponderExcluir
    Respostas
    1. Seu tutorial pode ajudar muita gente, porém ta muito bagunçado.

      Excluir
    2. Fala Raymesson, agora que vi seu comentário... esse post fiz enquanto anotava o que fazia para montar o ambiente, talvez faltou essa parte sim, mas a princípio o master não precisa do load balancer... o load balancer enxerga apenas os nós que contém a aplicação... já faz um tempo q vc comentou, mas você ainda lembra o que era exatamente que faltava? abraço!

      Excluir
    3. opa... fiz um novo tutorial com wildfly 10: http://localhost8080.blogspot.com.br/2016/09/load-balancer-com-wildfly-10.html

      Excluir
  3. Opa Adriano estou seguindo seu tutorial, assim como outros e por algum motivo não consigo colocar para funcionar.
    Estou usando WildFly 9.0.2, o master registra o slave, mas assim como em todos os tutoriais no final não consigo dar deploy em nenhuma aplicação, já estou quase jogando a tolha. Acredito que deva ser algo simples, pois uso duas maquinas virtuals com VirtualBox e usando linux centoOS.
    Alguma ideia do que possa ser?
    Obrigado.

    Sandro Marques

    ResponderExcluir
    Respostas
    1. Muitas vezes quando o deploy não sobe é por conta de alguma incompatibilidade entre o wildfly e a aplicação. Já aconteceu comigo.

      Excluir
    2. sim, pode ser isso que o Raymesson falou... talvez vc poderia testar fszendo deploy de uma aplicação mais simples..

      Excluir
  4. Adriano, ótimo tutorial. Estou precisando de um desses para Windows, não tem ai não??? Hehehe

    ResponderExcluir
  5. Adriano seu Tuto ficou show. Faltou a configuração de conexão do Wildfly ao Apache Web Server.







    Se eu estiver errado corrija por favor. Acho que é isso. Um abraço.

    ResponderExcluir
    Respostas
    1. opa... acho q sim...

      veja esse tutorial com wildfly 10 que eu montei: http://localhost8080.blogspot.com.br/2016/09/load-balancer-com-wildfly-10.html

      Excluir
  6. Boa noite.

    Após a instalação do apache ao tentar iniciar o mesmo alerta a seguinte mensagem:
    Redirecting to /bin/systemctl start httpd.service

    Após isso não consigo acessar por ip via console.
    Oque devo fazer?

    ResponderExcluir
  7. Opa, não vou conseguir ver agora, mas abre um tópico no JBug Brasil https://developer.jboss.org/groups/jbug-brasil
    Lá fica mais fácil de responder... e além de mim, tem uma galera lá q pode ajudar tmb! abraço!

    ResponderExcluir
  8. Bom dia, Adriano!
    você tem esses arquivos pra mim disponibilizar systemprops.war cluster-example.war, porque através dos links acima os arquivos não está mais dipsonivéis.
    Grato

    ResponderExcluir
    Respostas
    1. tenho sim... me manda e-mail no adriano@localhost8080.com.br

      Excluir
  9. Este comentário foi removido pelo autor.

    ResponderExcluir
  10. Seu artigo ficou muito bom. Praticamente uma receita de bolo. Foi o mais completo que achei. Parabéns! Ficaram faltando algumas coisas no meio da receita. Por exemplo, como o load balancer escuta o master pra fazer o balanceamento. Pra você deve ser tão automático que omitiu essa parte. Abraço!

    ResponderExcluir