Este é um laboratório prático para a instalação e testes de um cluster de servidores de aplicações GlassFish em sua versão 3.1. Apresentado durante o evento JustJava 2011 em São Paulo/SP. Os slides utilizados durante a apresentação estão em JustJava2011.pdf. Você pode baixar este documento, e os arquivos utilizados por ele no evento, através do download do arquivo JustJava2011.zip.
Para compreender melhor este tutorial, você precisará de:
Neste tutorial, eu utilizo a vm-curso-ladoservidor (VM) como uma segunda máquina (Linux Ubuntu 10.10), para a execução de um cluster remoto. O HOST (máquina que executará a VM) é um Mac OS X (10.6.7) e executará a VM através do VirtualBox 4.0.6. Siga os procedimentos de instalação descritos na página da vm-curso-ladoservidor estando atento às seguintes questões:
Após realizar a instalação da vm-curso-ladoservidor, verifique se a rede entre o HOST e a VM funcionam adequadamente. Antes de colocar a VM em execução, é preciso verificar se as configurações de rede no VirtualBox estão adequadas. O Ubuntu (executado na VM) deverá obter um IP na mesma rede do HOST e, para isto, uma configuração de rede rápida que deverá funcionar será colocar a placa da VM em modo "Host-Only". Após iniciar a VM, para verificar o IP obtido pelo Linux é só abrir um shell e digitar:
$ ifconfig eth0
Voltando ao HOST, é interessante "pingar" o IP da VM, verificando a conectividade entre eles (substitua o IP abaixo pelo IP da VM em teu ambiente):
$ ping 192.168.56.101
Os scripts que serão comandados abaixo estão pré-configurados para executar a partir do nome da VM (curso-ladoservidor). Desta forma, é preciso averiguar se este nome está corretamente associado ao IP da VM, editando o arquivo /etc/hosts do HOST:
$ sudo vim /etc/hosts
Da mesma forma, o nome completo do HOST deverá ser reconhecido pelo VM. Para isto, você deverá cadastrar este nome no arquivo /etc/hosts na VM (utilize o mesmo comando mostrado acima).
Estes scripts também executarão tarefas relativas a cópias de arquivos e execuções de programas, de forma remota e segura, através de SSH. O GlassFish suporta a execução de vários comandos através de SSH e, para não ser necessário a entrada de senhas, as autenticações necessárias são realizadas através de arquivos de chaves. Sendo assim, iremos gerar estas chaves (no HOST), através do seguinte comando:
$ ssh-keygen -t rsa
Precisaremos exportar a chave pública do HOST para a VM, inserindo o seu conteúdo no arquivo ~/.ssh/authorized_keys da VM para o usuário aluno. Uma forma fácil de fazer isto é executar o script ssh-copy-id (presente em distros Linux). Entretanto, no Mac OS X este comando não existe e, por isto, ele foi inserido no diretório bin do lab.
Instale o lab através do comando a seguir, que apagará o conteúdo que existir em ~/JustJava2011/lab e recriará este diretório:
$ d=~/JustJava2011/lab; rm -rf $d && mkdir -p $d $ tar xvfj lab.tar.bz2 -C $d && cd $d
O próximo passo será carregar o arquivo que configura o ambiente para execução do lab. Isto deixará o script ssh-copy-id disponível no $PATH além de outros que utilizaremos. Após subir o arquivo .ambiente para o shell corrente com o comando source, para não ser preciso repetir isto em todo o shell que for aberto, também podemos executar a função instalar_ambiente. Ela alterará o arquivo ~/.bashrc (ou o ~/.profile do Mac OS X) fazendo com que este carregamento seja realizado de forma automática, ao abrirmos um novo shell:
$ source .ambiente && instalar_ambiente
Em seguida, deveremos executar:
$ ssh-copy-id aluno@curso-ladoservidor
Para garantir que tudo funcionará adequadamente, é bom realizar um ssh para a VM e verificar se realmente não está sendo necessária a entrada de alguma senha (o comando deverá apresentar o shell da VM, sem que haja a necessidade de informarmos uma senha):
$ ssh aluno@curso-ladoservidor
Se tudo deu certo até aqui, poderemos finalizar a execução da VM a fim de garantir memória para a continuação deste lab. Isto nos trará de volta ao shell do HOST, dentro do diretório do lab.
Faremos a instalação do GlassFish no HOST através de um script que efetua o seu download e instalação:
$ instalar-glassfish.sh
Ao final da execução deste comando, o zip de instalação do GlassFish estará disponível no diretório instaladores e extraído no diretório ferramentas. As configurações de que zip será baixado, para qual diretório, e onde ele será extraído estão todas realizadas no arquivo .ambiente.
Nossa primeira atividade será a instalação do GlassFish no servidor remoto (curso-ladoservidor). A variável installdir será criada e utilizada em outros comandos abaixo. Ela contém a localização do GlassFish que será instalado na máquina remota. A comando asadmin install-node utilizará a conta do usuário aluno para realizar esta instalação.
$ installdir=/home/aluno/JustJava2011/lab/ferramentas/glassfish3 $ asadmin install-node --sshuser aluno \ --installdir $installdir curso-ladoservidor
O GlassFish utiliza o conceito de Domain Administration Server (DAS) para a realização das tarefas que serão executadas pelos comandos a seguir. Então, agora precisamos iniciá-lo:
$ asadmin start-domain
Como fizemos a instalação do GlassFish na máquina curso-ladoservidor, agora vamos criar (ou registrar) este nó (node) no DAS. O comando abaixo realiza esta tarefa:
$ asadmin create-node-ssh --nodehost curso-ladoservidor \ --sshuser aluno --installdir $installdir curso-ladoservidor
Todos os nós do GlassFish podem ser visualizados pelo comando a seguir:
$ asadmin list-nodes
Vamos criar um cluster:
$ asadmin create-cluster c1
Neste cluster, vamos criar duas instâncias (i1 e i2):
$ asadmin create-instance --cluster c1 --node curso-ladoservidor i1 $ asadmin create-instance --cluster c1 --node curso-ladoservidor i2
Para sabermos que instâncias temos registradas no DAS e seu estado atual:
$ asadmin list-instances
Agora, vamos subir as instâncias do cluster:
$ asadmin start-cluster c1
Se desejássemos, poderíamos ir até a máquina curso-ladoservidor e verificar que o GlassFish está sendo executado por dois processos (um para cada instância do cluster):
$ ssh aluno@curso-ladoservidor jps -Vvlm
Entretanto, o comando acima é desnecessário! O mais simples seria repetirmos o comando anterior e averiguar o estado das instâncias ;-):
$ asadmin list-instances
Vamos baixar uma aplicação de exemplo para ser implantada no cluster:
$ wget -c \ http://wikis.sun.com/download/attachments/209655304/clusterjsp.ear \ -O exemplos/clusterjsp.ear
Para implantar a aplicação, vamos utilizar o comando a seguir:
$ asadmin deploy --availabilityenabled=true \ --target c1 exemplos/clusterjsp.ear
A opção --availabilityenabled informa ao GlassFish que a aplicação implantada deverá suportar alta disponibilidade. Se não a utilizássemos seria necessário incluirmos a tag <distributable\> no arquivo WEB-INF/web.xml da aplicação para que obtivéssemos esta característica.
Podemos testá-la através das seguintes URLs:
i1):
i2):
Para testar a replicação de dados da sessão, entre as instâncias, você deverá adicionar um valor a um atributo de sessão a instância i1 e, em seguida, atualizar a tela da segunda instância i2 para verificar se este valor também está inserido nela.
Da mesma forma que podemos criar um cluster, instalar o GlassFish em um host remoto e adicioná-lo ao cluster, iniciar instâncias remotamente, etc, o GlassFish também oferece comandos para desfazer estas operações. Vamos a eles...
Para parar as instâncias do cluster:
$ asadmin stop-cluster c1
Para deletar as instâncias:
$ asadmin delete-instance i1 $ asadmin delete-instance i2
Para deletar o cluster:
$ asadmin delete-cluster c1
Para deletar o nó remoto:
$ asadmin delete-node-ssh curso-ladoservidor
Para desinstalar o nó remoto:
$ asadmin uninstall-node --sshuser aluno \ --installdir $installdir curso-ladoservidor
Para parar o DAS:
$ asadmin stop-domain
Esta versão do GlassFish oferece bons mecanismos para facilitar a administração e a montagem de um cluster. Apesar de não termos citado neste tutorial, a interface gráfica para a administração deste servidor também pode ser utilizada como uma boa alternativa para a realização das várias tarefas demonstradas aqui. Explore as referências, especialmente os posts e screencasts publicados por Arun Gupta em seu blog.