{"id":8382,"date":"2019-07-24T07:30:51","date_gmt":"2019-07-24T10:30:51","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8382"},"modified":"2019-07-24T08:34:23","modified_gmt":"2019-07-24T11:34:23","slug":"clusterizacao-do-geoserver-com-docker-parte-2","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/24\/clusterizacao-do-geoserver-com-docker-parte-2\/","title":{"rendered":"Clusteriza\u00e7\u00e3o do GeoServer com Docker &#8211; Parte 2"},"content":{"rendered":"<p>No <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/22\/escalabilidade-do-geoserver-com-docker-parte-1\/\" rel=\"noopener noreferrer\" target=\"_blank\">\u00faltimo post<\/a>, vimos toda a parte te\u00f3rica sobre a escalabilidade do GeoServer. Tudo visto at\u00e9 esse momento pode soar um pouco complicado, quando na realidade, com as ferramentas certas n\u00e3o tem que ser. Usando docker e docker-compose, podemos criar diferentes topologias de clusters para o geoserver com relativa facilidade, gra\u00e7as \u00e0s extens\u00f5es mencionadas.<\/p>\n<p>O primeiro passo \u00e9 migrar para o Java 11. O <a href=\"http:\/\/geoserver.org\/release\/2.15.0\/\" rel=\"noopener noreferrer\" target=\"_blank\">GeoServer 2.15.0<\/a> pode ser executado em uma JVM 11. O <a href=\"http:\/\/jdk.java.net\/11\" rel=\"noopener noreferrer\" target=\"_blank\">OpenJDK 11<\/a> vem com suporte para cont\u00eaineres (isto \u00e9, ele respeita os limites de uso dos recursos da CPU e mem\u00f3ria RAM estabelecidos para o cont\u00eainer, enquanto as \u00faltimas vers\u00f5es do <a href=\"http:\/\/jdk.java.net\/8\" rel=\"noopener noreferrer\" target=\"_blank\">Java 8<\/a> respeitam apenas os limites de mem\u00f3ria). Com isso, voc\u00ea pode executar v\u00e1rios cont\u00eaineres na mesma m\u00e1quina f\u00edsica controlando os recursos que cada cont\u00eainer deve respeitar, evitando o superdimensionamento das inst\u00e2ncias e esgotando os recursos do host desnecessariamente.<\/p>\n<p>Para come\u00e7ar, vamos usar um container com geoserver pronto para uso, abrindo um terminal e executando:<\/p>\n<pre>\r\ndocker run -it -p 8080:8080 oscarfonts\/geoserver --name geoserver\r\n<\/pre>\n<p>O <strong>-it<\/strong> nos permitir\u00e1 &#8220;desligar&#8221; o cont\u00eainer com CTRL-C, <strong>-p 8080:8080<\/strong> ir\u00e1 expor a porta TCP 8080 do cont\u00eainer como porta 8080 do host ( -p <host port>:<container port>).<\/p>\n<p>Feito isso, podemos acessar o GeoServer atrav\u00e9s do http:\/\/localhost:8080\/geoserver usando o nome de usu\u00e1rio <strong>admin<\/strong> e senha cl\u00e1ssica <strong>geoserver<\/strong>. N\u00f3s n\u00e3o vamos parar na configura\u00e7\u00e3o t\u00edpica de senha master e outras medidas de seguran\u00e7a. Nosso objetivo \u00e9 aprender como configurar um cluster de geoservers com docker.<\/p>\n<p>Ao dar um nome ao cont\u00eainer ( &#8211;name geoserver), podemos nos referir a essa inst\u00e2ncia atrav\u00e9s desse nome ao usar outros comandos. Por exemplo:<\/p>\n<pre>\r\n$ docker exec -it geoserver \/bin\/bash\r\nroot@acfa10cc36da:\/usr\/local\/tomcat# apt-get update && apt-get install procps\r\nroot@acfa10cc36da:\/usr\/local\/tomcat# ps axuf\r\nUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND\r\nroot        524  0.0  0.0  19968  3608 pts\/1    Ss   13:49   0:00 \/bin\/bash\r\nroot        530  0.0  0.0  38388  3164 pts\/1    R+   13:49   0:00  \\_ ps axuf\r\nroot          1  0.0  0.0   4292   752 pts\/0    Ss+  13:40   0:00 \/bin\/sh -c start.sh\r\nroot          6  0.0  0.0  19724  3228 pts\/0    S+   13:40   0:00 \/bin\/bash \/usr\/local\/bin\/start.sh\r\nroot          8 14.8  0.4 9713484 623864 pts\/0  Sl+  13:40   1:16  \\_ \/docker-java-home\/bin\/java -Djava.util.log ...\r\n<\/pre>\n<p>Deve-se notar que as imagens do docker s\u00e3o imut\u00e1veis. Todas as altera\u00e7\u00f5es feitas no sistema de arquivos do cont\u00eainer (inst\u00e2ncia de uma imagem) s\u00e3o perdidas quando a imagem \u00e9 desativada. Portanto, &#8220;volumes&#8221; e diret\u00f3rios de host (a m\u00e1quina que executa o cont\u00eainer) s\u00e3o usados \u200b\u200bpara &#8220;mont\u00e1-los&#8221; nos diret\u00f3rios de cont\u00eainer que s\u00e3o necess\u00e1rios.<\/p>\n<p><strong>1. Terceiriza\u00e7\u00e3o da configura\u00e7\u00e3o e extens\u00f5es<\/strong><\/p>\n<p>Esta imagem do docker para o geoserver permite montar o diret\u00f3rio de configura\u00e7\u00e3o do geoserver (vari\u00e1vel de ambiente GEOSERVER_DATA_DIR), bem como instalar extens\u00f5es facilmente, usando &#8220;pontos de montagem&#8221;, isto \u00e9, designando diret\u00f3rios locais (host) para diret\u00f3rios de cont\u00eainer.<\/p>\n<p>O GeoServer est\u00e1 pronto para carregar sua configura\u00e7\u00e3o de <strong>\/var\/local\/geoserver<\/strong> e as extens\u00f5es de <strong>\/var\/local\/geoserver-exts<\/strong>. O mapeamento de diret\u00f3rios locais para diret\u00f3rios do cont\u00eainer \u00e9 feito atrav\u00e9s do par\u00e2metro <em>-v<\/em> do <em>docker run<\/em>, por exemplo:<\/p>\n<pre>\r\ndocker run -v \/path\/to\/local\/data_dir:\/var\/local\/geoserver -v \/path\/to\/local\/exts_dir:\/var\/local\/geoserver-exts\/\r\n<\/pre>\n<p>Onde ambos os caminhos devem ser absolutos.<\/p>\n<p><strong>2. Diret\u00f3rio de dados externo<\/strong><\/p>\n<p>Primeiramente, devemos remover o cont\u00eainer geoserver anterior porque alteramos a configura\u00e7\u00e3o de execu\u00e7\u00e3o. Veja:<\/p>\n<pre>\r\ndocker rm geoserver\r\ndocker run -it -p 8080:8080 -v $(pwd)\/datadir:\/var\/local\/geoserver --name=geoserver oscarfonts\/geoserver\r\n<\/pre>\n<p>Acessamos o GeoServer atrav\u00e9s de http:\/\/localhost:8080\/geoserver e verificamos que as stores e layers que v\u00eam pr\u00e9-instaladas n\u00e3o est\u00e3o mais. N\u00f3s tentamos criar um Store de GeoPackage com o arquivo que deveria estar no diret\u00f3rio de dados chamado <strong>ign.gpkg<\/strong>. Derrubamos o container (CTRL-C) e subimos novamente, e verificamos que a configura\u00e7\u00e3o ainda est\u00e1 l\u00e1, porque estamos &#8220;mapeando&#8221; o diret\u00f3rio local para o diret\u00f3rio de dados do cont\u00eainer.<\/p>\n<p><strong>2.1 Configurar extens\u00f5es<\/strong><\/p>\n<p>Para adicionar extens\u00f5es, voc\u00ea deve fornecer um diret\u00f3rio por extens\u00e3o com seu conte\u00fado descompactado dentro do diret\u00f3rio local para extens\u00f5es:<\/p>\n<pre>\r\nunzip plugins\/geoserver-2.15.0-vectortiles-plugin.zip -d extensiones\/vectortiles\r\n<\/pre>\n<p>E coloque o cont\u00eainer <strong>extensiones\/<\/strong> em <strong>\/var\/local\/geoserver-exts<\/strong>:<\/p>\n<pre>\r\ndocker rm geoserver\r\ndocker run -it -p 8080:8080 -v $(pwd)\/extensiones:\/var\/local\/geoserver-exts\/ -v $(pwd)\/datadir:\/var\/local\/geoserver --name=geoserver oscarfonts\/geoserver\r\n<\/pre>\n<p>Novamente, devemos remover o cont\u00eainer geoserver porque alteramos a configura\u00e7\u00e3o de execu\u00e7\u00e3o.<\/p>\n<p><strong>3. Instalar o cluster ativo<\/strong><\/p>\n<p>Ok, agora vamos instalar a extens\u00e3o que permite configurar um cluster ativo:<\/p>\n<pre>\r\ndocker rm geoserver\r\nunzip -d extensiones\/activeclustering plugins\/geoserver-2.15-SNAPSHOT-jms-cluster-plugin.zip\r\ndocker run -it -p 8080:8080 -v $(pwd)\/extensiones:\/var\/local\/geoserver-exts\/ -v $(pwd)\/datadir:\/var\/local\/geoserver --name=geoserver oscarfonts\/geoserver\r\n<\/pre>\n<p>N\u00f3s vamos para http:\/\/localhost:8080\/geoserver. No menu da interface do usu\u00e1rio, um novo item deve ser encontrado: &#8220;Configura\u00e7\u00e3o de cluster&#8221;:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Clustering_menu.png\" alt=\"\" width=\"219\" height=\"394\" class=\"aligncenter size-full wp-image-8387\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Clustering_menu.png 219w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Clustering_menu-167x300.png 167w\" sizes=\"auto, (max-width: 219px) 100vw, 219px\" \/><br \/>\n<\/center><\/p>\n<p><strong>4. Configurar o cluster com o docker-compose<\/strong><\/p>\n<p>O docker-compose \u00e9 uma ferramenta que usa um arquivo docker-compose.yml para definir a topologia de um grupo de cont\u00eaineres e gerenci\u00e1-los. Essa configura\u00e7\u00e3o se estende al\u00e9m da execu\u00e7\u00e3o de v\u00e1rios cont\u00eaineres na mesma m\u00e1quina, para os quais existem v\u00e1rias ferramentas que permitem criar verdadeiros &#8220;enxames&#8221; de servi\u00e7os por meio de conectores docker. Entre eles est\u00e3o <a href=\"https:\/\/docs.docker.com\/engine\/swarm\/\" rel=\"noopener noreferrer\" target=\"_blank\">docker swarm<\/a>, <a href=\"https:\/\/kubernetes.io\/\" rel=\"noopener noreferrer\" target=\"_blank\">Kubernetes<\/a>, <a href=\"https:\/\/rancher.com\/\" rel=\"noopener noreferrer\" target=\"_blank\">Rancher<\/a>, entre outros.<\/p>\n<p><strong>5. Cont\u00eainer para o Message Oriented Middleware<\/strong><\/p>\n<p>O GeoSolutions criou um aplicativo web separado do GeoServer que \u00e9 distribu\u00eddo 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\u00e2ncia do geoserver tenha um broker incorporado.<\/p>\n<p>Dentro de <strong>taller_geoserver\/docker\/broker<\/strong> se encontra o <em>Dockerfile<\/em>. A imagem deve gerada agora:<\/p>\n<pre>\r\ncd docker\/broker_externo\r\ndocker-compose build\r\n<\/pre>\n<p>Esse cont\u00eainer usa a mesma imagem do tomcat que a do geoserver, mas executa o broker baseado no <a href=\"http:\/\/activemq.apache.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">ActiveMQ<\/a> e exp\u00f5e a porta TCP 61666 para que as inst\u00e2ncias do geoserver de outros cont\u00eaineres se conectem.<\/p>\n<p><strong>6. Cluster Master-Slave<\/strong><\/p>\n<p>Examine o arquivo <strong>docker\/broker_externo\/docker-compose.yml<\/strong> e tamb\u00e9m os arquivos <strong>cluster.properties<\/strong> e <strong>embedded-broker.properties<\/strong> em <strong>datadir\/cluster\/master<\/strong> e <strong>datadir\/cluster\/slave<\/strong>.<\/p>\n<p>As propriedades mais importantes s\u00e3o:<\/p>\n<ul>\n<li> activemq.transportConnectors.server.uri=tcp:\/\/broker:61666?&#8230;.<\/li>\n<li> brokerURL=tcp:\/\/broker:61666 <\/li>\n<\/ul>\n<p><strong>7. Cluster escalon\u00e1vel<\/strong><\/p>\n<p>A topologia anterior nos permite definir as inst\u00e2ncias uma a uma. Mas o que acontece se voc\u00ea quiser escalar (tanto para cima quanto para baixo) o n\u00famero de inst\u00e2ncias. Por exemplo, para atender a demanda de pico e, em seguida, retornar ao normal, sem provisionar recursos em excesso o tempo todo.<\/p>\n<p>Veja a configura\u00e7\u00e3o do <strong>docker\/broker_externo_scale<\/strong>.<\/p>\n<p>Agora podemos ter quantas inst\u00e2ncias forem necess\u00e1rias sem alterar qualquer configura\u00e7\u00e3o. O provisionamento do mesmo em diferentes servidores f\u00edsicos ou virtuais est\u00e1 a cargo das ferramentas acima mencionadas para este fim, que est\u00e3o al\u00e9m do objetivo do tutorial.<\/p>\n<p>Fonte: <a href=\"https:\/\/github.com\/groldan\/2019_foss4g-ar_taller_geoserver\" rel=\"noopener noreferrer\" target=\"_blank\">GitHub do Gabriel Roldan<\/a> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>No \u00faltimo post, vimos toda a parte te\u00f3rica sobre a escalabilidade do GeoServer. Tudo visto at\u00e9 esse momento pode soar um pouco complicado, quando na realidade, com as ferramentas certas n\u00e3o tem que ser. Usando docker e docker-compose, podemos criar&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/24\/clusterizacao-do-geoserver-com-docker-parte-2\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8385,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[340,304,208],"class_list":["post-8382","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-cluster","tag-docker","tag-geoserver"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=8382"}],"version-history":[{"count":7,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8382\/revisions"}],"predecessor-version":[{"id":8396,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8382\/revisions\/8396"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8385"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}