{"id":8361,"date":"2019-07-22T07:30:23","date_gmt":"2019-07-22T10:30:23","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8361"},"modified":"2019-07-24T08:32:57","modified_gmt":"2019-07-24T11:32:57","slug":"escalabilidade-do-geoserver-com-docker-parte-1","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/22\/escalabilidade-do-geoserver-com-docker-parte-1\/","title":{"rendered":"Clusteriza\u00e7\u00e3o do GeoServer com Docker &#8211; Parte 1"},"content":{"rendered":"<p>No <a href=\"http:\/\/foss4g-ar.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">FOSS4G Argentina<\/a> desse ano (2019), o Gabriel Roldan ministrou um treinamento de GeoServer Avan\u00e7ado. Neste treinamento, ele ensinou como escalar o GeoServer com o Docker. Eu achei o material muito interessante, originalmente escrito em espanhol, e resolvi traduzir e postar aqui no blog.<\/p>\n<p><strong>1. Clustering no GeoServer<\/strong><\/p>\n<p>Clustering \u00e9 um sistema de processamento paralelo ou distribu\u00eddo que envolve computadores independentes (ou m\u00e1quinas virtuais, cont\u00eaineres docker, etc.).<\/p>\n<p>No GeoServer, ele pode ser aplicado para obter uma configura\u00e7\u00e3o de alta disponibilidade ou para obter maior escalabilidade. Independentemente do motivo, existem algumas limita\u00e7\u00f5es que devem ser levadas em considera\u00e7\u00e3o e, quando poss\u00edvel, devem ser resolvidas.<\/p>\n<p>Na parte restante desta se\u00e7\u00e3o, ser\u00e3o fornecidas informa\u00e7\u00f5es para obter um entendimento b\u00e1sico de clustering e, em seguida, analisar as v\u00e1rias possibilidades de agrupamento do GeoServer, usando o docker e o docker-compose para definir as caracter\u00edsticas do cluster.<\/p>\n<p><strong>2. Introdu\u00e7\u00e3o ao Clustering e Alta Disponibilidade<\/strong><\/p>\n<p>T\u00e9cnicas de clustering s\u00e3o usadas para melhorar o desempenho e a disponibilidade de um sistema complexo. Em termos gerais, um cluster \u00e9 considerado como um conjunto redundante de servi\u00e7os que fornece o mesmo conjunto de funcionalidades.<\/p>\n<p>A qualidade do cluster pode ser medida por:<\/p>\n<p><strong>Confiabilidade:<\/strong> a capacidade de fornecer respostas bem-sucedidas em todas as solicita\u00e7\u00f5es recebidas. <strong>Disponibilidade<\/strong> do tempo de atividade do servidor (geralmente medido como % do tempo de atividade anual). <strong>Desempenho<\/strong> medido pelo tempo m\u00e9dio gasto pelo servi\u00e7o para fornecer respostas ou desempenho. <strong>Escalabilidade<\/strong> \u00e9 a capacidade de lidar com uma quantidade crescente de trabalho de um maneira eficiente, sem degrada\u00e7\u00e3o na qualidade do servi\u00e7o.<\/p>\n<p><strong>2.1 Alta disponibilidade<\/strong><\/p>\n<p>Clusters de alta disponibilidade (HA) s\u00e3o grupos de servi\u00e7os que podem ser usados \u200b\u200bde forma confi\u00e1vel com tempo de inatividade m\u00ednimo (ou nulo). Sem o armazenamento em cluster, se um servi\u00e7o falhar ou estiver muito ocupado, o usu\u00e1rio que solicitar esse servi\u00e7o nunca receber\u00e1 uma resposta r\u00e1pida. O pool de alta disponibilidade deve ser projetado para remediar essa situa\u00e7\u00e3o, detectando um servi\u00e7o inativo (por meio de um <em>watchdog<\/em>) e reiniciando-o imediatamente. Durante esta opera\u00e7\u00e3o, o servi\u00e7o ser\u00e1 fornecido por uma inst\u00e2ncia de <em>failover<\/em> do mesmo servi\u00e7o.<\/p>\n<p><strong>2.2 Escalabilidade<\/strong><\/p>\n<p>&#8220;Escalar&#8221; um sistema geralmente significa adicionar mais inst\u00e2ncias do produto. Podemos distinguir duas maneiras diferentes de escalar:<\/p>\n<p><strong>A escalabilidade horizontal<\/strong> tamb\u00e9m \u00e9 conhecida como <em>scale-out<\/em>, que pode ser feito adicionando recursos de hardware (HW) extras ao grupo existente. Em nosso contexto, isso significa adicionar mais m\u00e1quinas f\u00edsicas ou virtuais com o GeoServer instalado.<\/p>\n<p><strong>A escalabilidade vertical<\/strong> pode ser atingida com a obten\u00e7\u00e3o de hardware mais potente (mais CPU\/mem\u00f3ria) e normalmente deve ser combinada adicionando mais inst\u00e2ncias de software tamb\u00e9m no mesmo servidor (na pr\u00e1tica, n\u00e3o \u00e9 um software 100% escal\u00e1vel linearmente). Em nosso contexto, isso significa instalar mais inst\u00e2ncias do GeoServer no HW existente para utilizar totalmente os recursos dispon\u00edveis, particularmente as CPUs adicionais.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Scale-Up-Out.png\" alt=\"\" width=\"414\" height=\"393\" class=\"aligncenter size-full wp-image-8365\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Scale-Up-Out.png 414w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Scale-Up-Out-300x285.png 300w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><br \/>\n<\/center><\/p>\n<p><strong>3. Configura\u00e7\u00e3o de alta disponibilidade para o GeoServer<\/strong><\/p>\n<p>Isso requer o agrupamento de inst\u00e2ncias do GeoServer para implementar uma configura\u00e7\u00e3o de alta disponibilidade, bem como para obter uma maior escalabilidade.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/geoserver_FS_cluster.png\" alt=\"\" width=\"607\" height=\"325\" class=\"aligncenter size-full wp-image-8367\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/geoserver_FS_cluster.png 607w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/geoserver_FS_cluster-300x161.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/geoserver_FS_cluster-600x321.png 600w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><br \/>\n<\/center><\/p>\n<p>Esse tipo de configura\u00e7\u00e3o envolve uma s\u00e9rie de problemas e s\u00f3 \u00e9 vi\u00e1vel para um servi\u00e7o est\u00e1tico. Isto \u00e9, uma vez configurado, assume somente leitura em termos da configura\u00e7\u00e3o do cat\u00e1logo. Do contr\u00e1rio a falta de comunica\u00e7\u00e3o entre as inst\u00e2ncias resulta em um desastre.<\/p>\n<p><strong>4. Backoffice &#8211; Configura\u00e7\u00e3o de produ\u00e7\u00e3o (Diret\u00f3rio de Dados separado)<\/strong><\/p>\n<p>Ao configurar um cluster do GeoServer com um diret\u00f3rio de dados compartilhado, \u00e9 recomend\u00e1vel configurar um GeoServer off-line que trabalhe com uma c\u00f3pia do diret\u00f3rio de dados do cluster (\u00e1rea de prepara\u00e7\u00e3o), fa\u00e7a altera\u00e7\u00f5es at\u00e9 que um novo design de configura\u00e7\u00e3o satisfat\u00f3rio seja alcan\u00e7ado e, em seguida, propague as altera\u00e7\u00f5es para o cluster de produ\u00e7\u00e3o com as seguintes etapas:<\/p>\n<ul>\n<li> Copie o diret\u00f3rio de dados (configura\u00e7\u00e3o) da \u00e1rea de prepara\u00e7\u00e3o para a \u00e1rea de produ\u00e7\u00e3o.<\/li>\n<li> Execute o <strong>comando de configura\u00e7\u00e3o REST &#8220;reload&#8221; em cada n\u00f3<\/strong> do cluster para que a nova configura\u00e7\u00e3o seja carregada no disco.<\/li>\n<\/ul>\n<p>Essa abordagem come\u00e7a a mostrar suas limita\u00e7\u00f5es quando qualquer uma das seguintes situa\u00e7\u00f5es se aplica:<\/p>\n<ul>\n<li> Altera\u00e7\u00f5es freq\u00fcentes de configura\u00e7\u00e3o que devem ser aplicadas imediatamente a todo o cluster.<\/li>\n<li> A configura\u00e7\u00e3o cont\u00e9m muitas camadas de dados (centenas ou mais), o que implica um longo tempo de recarga. Durante a fase de recarga, o servidor pode n\u00e3o responder corretamente \u00e0s solicita\u00e7\u00f5es OGC porque a configura\u00e7\u00e3o est\u00e1 em um estado inconsistente e incompleto.<\/li>\n<\/ul>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/backoffice_prod_2.jpeg\" alt=\"\" width=\"689\" height=\"402\" class=\"aligncenter size-full wp-image-8369\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/backoffice_prod_2.jpeg 689w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/backoffice_prod_2-300x175.jpeg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/backoffice_prod_2-600x350.jpeg 600w\" sizes=\"auto, (max-width: 689px) 100vw, 689px\" \/><br \/>\n<\/center><\/p>\n<p><strong>5. Clustering ativo do GeoServer<\/strong><\/p>\n<p>Como foi visto nas se\u00e7\u00f5es anteriores, existem v\u00e1rias abordagens para implementar um cluster do GeoServer com base em diferentes op\u00e7\u00f5es para compartilhar\/sincronizar diret\u00f3rios de dados e recarregar a configura\u00e7\u00e3o. No entanto, essas t\u00e9cnicas t\u00eam limita\u00e7\u00f5es intr\u00ednsecas em termos de escalabilidade em rela\u00e7\u00e3o ao n\u00famero de camadas, ent\u00e3o decidimos criar uma Extens\u00e3o de Cluster no GeoServer espec\u00edfica para super\u00e1-las.<\/p>\n<p>Implementamos uma extens\u00e3o <strong>Multi-Master<\/strong> para o GeoServer que aproveita o <strong>Message Oriented Middleware (MOM)<\/strong> para manter todos os n\u00f3s do cluster sincronizados em rela\u00e7\u00e3o \u00e0s suas configura\u00e7\u00f5es.<\/p>\n<ul>\n<li> As inst\u00e2ncias <em>Master<\/em> aceitam altera\u00e7\u00f5es na configura\u00e7\u00e3o interna, mant\u00eam-nas em seu pr\u00f3prio diret\u00f3rio de dados e as enviam para os <em>Slaves<\/em> atrav\u00e9s do MOM (com entrega garantida) <\/li>\n<li> As inst\u00e2ncias <em>Slave<\/em> n\u00e3o devem ser usadas para alterar a configura\u00e7\u00e3o do REST ou da interface do usu\u00e1rio, pois elas s\u00e3o configuradas para receber e injetar (diretamente na mem\u00f3ria) as altera\u00e7\u00f5es de configura\u00e7\u00e3o transmitidas pelo(s) <em>Master<\/em>(s) pelo MOM<\/li>\n<li> O MOM \u00e9 usado nos bastidores para que os <em>Masters<\/em> e <em>Slaves<\/em> troquem mensagens contendo altera\u00e7\u00f5es de configura\u00e7\u00e3o. Em aluns casos, usaremos o termo <em>Broker<\/em> como sin\u00f4nimo de MOM <\/li>\n<\/ul>\n<p>Cada <em>slave<\/em> pode ser configurado para ter seu pr\u00f3prio diret\u00f3rio de dados (privado), neste caso ele ser\u00e1 configurado para usar uma assinatura dur\u00e1vel no MOM para manter seu diret\u00f3rio de dados sincronizado com o do <em>Master<\/em>, para que quando seja feita uma altera\u00e7\u00e3o de configura\u00e7\u00e3o do master, atrav\u00e9s do MOM seja recebida e tamb\u00e9m persistida. Com esta configura\u00e7\u00e3o, no caso dos dados de um slave ser apagado quando subir novamente, ele receber\u00e1 uma s\u00e9rie de mudan\u00e7as de configura\u00e7\u00e3o para alinhar seu diret\u00f3rio de dados com o do mestre. Na ilustra\u00e7\u00e3o a seguir, esta configura\u00e7\u00e3o \u00e9 mostrada (com um \u00fanico <em>master<\/em>: foco de v\u00e1rios <em>slaves<\/em>).<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Master-Slave_Private_Data_Dir.png\" alt=\"\" width=\"509\" height=\"492\" class=\"aligncenter size-full wp-image-8372\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Master-Slave_Private_Data_Dir.png 509w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/Master-Slave_Private_Data_Dir-300x290.png 300w\" sizes=\"auto, (max-width: 509px) 100vw, 509px\" \/><br \/>\n<\/center><\/p>\n<p>Uma configura\u00e7\u00e3o semelhante \u00e9 \u00fatil nos casos em que \u00e9 poss\u00edvel compartilhar o diret\u00f3rio de dados em v\u00e1rias inst\u00e2ncias (por exemplo, dimensionar ou dimensionar verticalmente em uma \u00fanica inst\u00e2ncia grande, mas at\u00e9 dimensionar enquanto um sistema de arquivos compartilhado em cluster ainda estiver dispon\u00edvel) . Vale ressaltar que, embora as altera\u00e7\u00f5es na configura\u00e7\u00e3o atrav\u00e9s da interface do usu\u00e1rio ou da interface REST devam ser endere\u00e7adas ao m\u00e1ximo poss\u00edvel ao mesmo mestre (portanto, recomendamos configur\u00e1-las em &#8220;<em>failover<\/em>&#8221; ou Ativo\/Passivo). No entanto, \u00e9 poss\u00edvel configurar todas as inst\u00e2ncias em Ativo\/Ativo ao tentar responder a consultas OGC.<\/p>\n<p>Vale ressaltar que com a extens\u00e3o de clustering ativo do GeoServer, um n\u00f3 pode ser <em>master<\/em> e <em>slave<\/em> ao mesmo tempo, o que permite uma configura\u00e7\u00e3o &#8220;<em>peer to peer<\/em>&#8220;. Em termos gerais, todos os n\u00f3s podem ser <em>master<\/em> e <em>slave<\/em> ao mesmo tempo, entretanto, como mencionado acima, seria bom configurar o balanceador de carga para usar um <em>switch <\/em>no modo &#8220;<em>failover<\/em>&#8221; para altera\u00e7\u00f5es de configura\u00e7\u00e3o (GUI ou REST). <\/p>\n<p>Na ilustra\u00e7\u00e3o a seguir, \u00e9 mostrada uma configura\u00e7\u00e3o com um design P2P e um diret\u00f3rio de dados compartilhado.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/P2p.png\" alt=\"\" width=\"476\" height=\"432\" class=\"aligncenter size-full wp-image-8373\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/P2p.png 476w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/07\/P2p-300x272.png 300w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><br \/>\n<\/center><\/p>\n<p>At\u00e9 agora vimos apenas a teoria, e todo o cr\u00e9dito pela <a href=\"https:\/\/geoserver.geo-solutions.it\/edu\/en\/clustering\/\" rel=\"noopener noreferrer\" target=\"_blank\">documenta\u00e7\u00e3o<\/a> e implementa\u00e7\u00e3o deve ser dado a <a href=\"https:\/\/www.geo-solutions.it\/\" rel=\"noopener noreferrer\" target=\"_blank\">GeoSolutions<\/a>. No pr\u00f3ximo post, iremos ver como implementar tudo o que foi explicado acima. Ent\u00e3o n\u00e3o perca o <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/24\/clusterizacao-do-geoserver-com-docker-parte-2\/\" rel=\"noopener noreferrer\" target=\"_blank\">post de amanh\u00e3<\/a>!<\/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 FOSS4G Argentina desse ano (2019), o Gabriel Roldan ministrou um treinamento de GeoServer Avan\u00e7ado. Neste treinamento, ele ensinou como escalar o GeoServer com o Docker. Eu achei o material muito interessante, originalmente escrito em espanhol, e resolvi traduzir e&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2019\/07\/22\/escalabilidade-do-geoserver-com-docker-parte-1\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8376,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[340,304,208],"class_list":["post-8361","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\/8361","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=8361"}],"version-history":[{"count":17,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8361\/revisions"}],"predecessor-version":[{"id":8395,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8361\/revisions\/8395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8376"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}