No último post, vimos toda a parte teórica sobre a escalabilidade do GeoServer. Tudo visto até esse momento pode soar um pouco complicado, quando na realidade, com as ferramentas certas não tem que ser. Usando docker e docker-compose, podemos criar diferentes topologias de clusters para o geoserver com relativa facilidade, graças às extensões mencionadas.
O primeiro passo é migrar para o Java 11. O GeoServer 2.15.0 pode ser executado em uma JVM 11. O OpenJDK 11 vem com suporte para contêineres (isto é, ele respeita os limites de uso dos recursos da CPU e memória RAM estabelecidos para o contêiner, enquanto as últimas versões do Java 8 respeitam apenas os limites de memória). Com isso, você pode executar vários contêineres na mesma máquina física controlando os recursos que cada contêiner deve respeitar, evitando o superdimensionamento das instâncias e esgotando os recursos do host desnecessariamente.
Para começar, vamos usar um container com geoserver pronto para uso, abrindo um terminal e executando:
docker run -it -p 8080:8080 oscarfonts/geoserver --name geoserver
O -it nos permitirá “desligar” o contêiner com CTRL-C, -p 8080:8080 irá expor a porta TCP 8080 do contêiner como porta 8080 do host ( -p
Feito isso, podemos acessar o GeoServer através do http://localhost:8080/geoserver usando o nome de usuário admin e senha clássica geoserver. Nós não vamos parar na configuração típica de senha master e outras medidas de segurança. Nosso objetivo é aprender como configurar um cluster de geoservers com docker.
Ao dar um nome ao contêiner ( –name geoserver), podemos nos referir a essa instância através desse nome ao usar outros comandos. Por exemplo:
$ docker exec -it geoserver /bin/bash root@acfa10cc36da:/usr/local/tomcat# apt-get update && apt-get install procps root@acfa10cc36da:/usr/local/tomcat# ps axuf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 524 0.0 0.0 19968 3608 pts/1 Ss 13:49 0:00 /bin/bash root 530 0.0 0.0 38388 3164 pts/1 R+ 13:49 0:00 \_ ps axuf root 1 0.0 0.0 4292 752 pts/0 Ss+ 13:40 0:00 /bin/sh -c start.sh root 6 0.0 0.0 19724 3228 pts/0 S+ 13:40 0:00 /bin/bash /usr/local/bin/start.sh root 8 14.8 0.4 9713484 623864 pts/0 Sl+ 13:40 1:16 \_ /docker-java-home/bin/java -Djava.util.log ...
Deve-se notar que as imagens do docker são imutáveis. Todas as alterações feitas no sistema de arquivos do contêiner (instância de uma imagem) são perdidas quando a imagem é desativada. Portanto, “volumes” e diretórios de host (a máquina que executa o contêiner) são usados para “montá-los” nos diretórios de contêiner que são necessários.
1. Terceirização da configuração e extensões
Esta imagem do docker para o geoserver permite montar o diretório de configuração do geoserver (variável de ambiente GEOSERVER_DATA_DIR), bem como instalar extensões facilmente, usando “pontos de montagem”, isto é, designando diretórios locais (host) para diretórios de contêiner.
O GeoServer está pronto para carregar sua configuração de /var/local/geoserver e as extensões de /var/local/geoserver-exts. O mapeamento de diretórios locais para diretórios do contêiner é feito através do parâmetro -v do docker run, por exemplo:
docker run -v /path/to/local/data_dir:/var/local/geoserver -v /path/to/local/exts_dir:/var/local/geoserver-exts/
Onde ambos os caminhos devem ser absolutos.
2. Diretório de dados externo
Primeiramente, devemos remover o contêiner geoserver anterior porque alteramos a configuração de execução. Veja:
docker rm geoserver docker run -it -p 8080:8080 -v $(pwd)/datadir:/var/local/geoserver --name=geoserver oscarfonts/geoserver
Acessamos o GeoServer através de http://localhost:8080/geoserver e verificamos que as stores e layers que vêm pré-instaladas não estão mais. Nós tentamos criar um Store de GeoPackage com o arquivo que deveria estar no diretório de dados chamado ign.gpkg. Derrubamos o container (CTRL-C) e subimos novamente, e verificamos que a configuração ainda está lá, porque estamos “mapeando” o diretório local para o diretório de dados do contêiner.
2.1 Configurar extensões
Para adicionar extensões, você deve fornecer um diretório por extensão com seu conteúdo descompactado dentro do diretório local para extensões:
unzip plugins/geoserver-2.15.0-vectortiles-plugin.zip -d extensiones/vectortiles
E coloque o contêiner extensiones/ em /var/local/geoserver-exts:
docker rm geoserver docker run -it -p 8080:8080 -v $(pwd)/extensiones:/var/local/geoserver-exts/ -v $(pwd)/datadir:/var/local/geoserver --name=geoserver oscarfonts/geoserver
Novamente, devemos remover o contêiner geoserver porque alteramos a configuração de execução.
3. Instalar o cluster ativo
Ok, agora vamos instalar a extensão que permite configurar um cluster ativo:
docker rm geoserver unzip -d extensiones/activeclustering plugins/geoserver-2.15-SNAPSHOT-jms-cluster-plugin.zip docker run -it -p 8080:8080 -v $(pwd)/extensiones:/var/local/geoserver-exts/ -v $(pwd)/datadir:/var/local/geoserver --name=geoserver oscarfonts/geoserver
Nós vamos para http://localhost:8080/geoserver. No menu da interface do usuário, um novo item deve ser encontrado: “Configuração de cluster”:
4. Configurar o cluster com o docker-compose
O docker-compose é uma ferramenta que usa um arquivo docker-compose.yml para definir a topologia de um grupo de contêineres e gerenciá-los. Essa configuração se estende além da execução de vários contêineres na mesma máquina, para os quais existem várias ferramentas que permitem criar verdadeiros “enxames” de serviços por meio de conectores docker. Entre eles estão docker swarm, Kubernetes, Rancher, entre outros.
5. Contêiner para o Message Oriented Middleware
O GeoSolutions criou um aplicativo web separado do GeoServer que é distribuído como um arquivo .war. Com isso, primeiro criaremos uma imagem do docker para poder exibi-lo como um broker independente, em vez de cada instância do geoserver tenha um broker incorporado.
Dentro de taller_geoserver/docker/broker se encontra o Dockerfile. A imagem deve gerada agora:
cd docker/broker_externo docker-compose build
Esse contêiner usa a mesma imagem do tomcat que a do geoserver, mas executa o broker baseado no ActiveMQ e expõe a porta TCP 61666 para que as instâncias do geoserver de outros contêineres se conectem.
6. Cluster Master-Slave
Examine o arquivo docker/broker_externo/docker-compose.yml e também os arquivos cluster.properties e embedded-broker.properties em datadir/cluster/master e datadir/cluster/slave.
As propriedades mais importantes são:
- activemq.transportConnectors.server.uri=tcp://broker:61666?….
- brokerURL=tcp://broker:61666
7. Cluster escalonável
A topologia anterior nos permite definir as instâncias uma a uma. Mas o que acontece se você quiser escalar (tanto para cima quanto para baixo) o número de instâncias. Por exemplo, para atender a demanda de pico e, em seguida, retornar ao normal, sem provisionar recursos em excesso o tempo todo.
Veja a configuração do docker/broker_externo_scale.
Agora podemos ter quantas instâncias forem necessárias sem alterar qualquer configuração. O provisionamento do mesmo em diferentes servidores físicos ou virtuais está a cargo das ferramentas acima mencionadas para este fim, que estão além do objetivo do tutorial.
Fonte: GitHub do Gabriel Roldan