{"id":54366,"date":"2019-12-24T00:00:00","date_gmt":"2019-12-23T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster"},"modified":"2020-02-18T14:02:22","modified_gmt":"2020-02-18T11:02:22","slug":"kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster","title":{"rendered":"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Ol\u00e1, pessoal do Habr. Hoje come\u00e7am as aulas do primeiro grupo do curso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/nwhU\/\">\u00abPostgreSQL\u00bb<\/a><\/noindex>. Com isso, queremos contar a voc\u00eas como foi o webinar aberto sobre este curso.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/e66e0d4919d45284dbdc4696d6cab555.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEm <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=yiXP8ihL2eA\">pr\u00f3xima aula aberta<\/a><\/noindex> falamos sobre os desafios enfrentados pelos bancos de dados SQL na era das nuvens e Kubernetes. Al\u00e9m disso, discutimos como os bancos de dados SQL se adaptam e mutam sob a influ\u00eancia desses desafios.<\/p>\n<p>O webinar foi conduzido <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/IVe0\/\">Valery Bezrukov<\/a><\/noindex>, Gerente de Entrega da Pr\u00e1tica do Google Cloud na EPAM Systems.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Quando as \u00e1rvores eram pequenas...<\/h3>\n<p>\nPara come\u00e7ar, vamos lembrar como ocorreu a escolha dos SGBDs no final do s\u00e9culo passado. Contudo, n\u00e3o ser\u00e1 dif\u00edcil, pois a escolha dos SGBDs naquela \u00e9poca come\u00e7ava e terminava <b>Oracle<\/b>. <\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/5fdf02523892e7477fd47dd01eb21d04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo final dos anos 90 e in\u00edcio dos anos 2000, n\u00e3o havia muitas op\u00e7\u00f5es, se falarmos sobre bancos de dados escal\u00e1veis industriais. Sim, existiam IBM DB2, Sybase e alguns outros bancos de dados que apareciam e desapareciam, mas no geral, eles n\u00e3o eram t\u00e3o vis\u00edveis em compara\u00e7\u00e3o com a Oracle. Consequentemente, as habilidades dos engenheiros da \u00e9poca estavam, de uma maneira ou de outra, ligadas \u00e0quela \u00fanica escolha que existia.<\/p>\n<p>Um DBA Oracle deveria saber:<\/p>\n<ul>\n<li> instalar o Oracle Server a partir do distribuidor;<\/li>\n<li> configurar o Oracle Server:<\/li>\n<\/ul>\n<p><\/p>\n<ul>\n<li>init.ora;<\/li>\n<li>listener.ora;<\/li>\n<\/ul>\n<p>\n\u2014 criar:<\/p>\n<ul>\n<li>tablespaces;<\/li>\n<li>esquemas;<\/li>\n<li>usu\u00e1rios;<\/li>\n<\/ul>\n<p>\u2014 realizar backup e recupera\u00e7\u00e3o;<br \/>\n\u2014 monitorar;<br \/>\n\u2014 combater consultas n\u00e3o otimizadas.<\/p>\n<p>Ao mesmo tempo, n\u00e3o era exigido do DBA Oracle:<\/p>\n<ul>\n<li>saber escolher o SGBD ou outra tecnologia de armazenamento e processamento de dados;<\/li>\n<li>garantir alta disponibilidade e escalabilidade horizontal (isso nem sempre era uma preocupa\u00e7\u00e3o do DBA);<\/li>\n<li>ter bom conhecimento da \u00e1rea de aplica\u00e7\u00e3o, infraestrutura, arquitetura de aplicativo e sistemas operacionais;<\/li>\n<li>realizar cargas e descargas de dados, migra\u00e7\u00e3o de dados entre diferentes SGBDs.<\/li>\n<\/ul>\n<p>Em geral, se falarmos sobre as escolhas da \u00e9poca, elas lembram a escolha em uma loja sovi\u00e9tica no final dos anos 80:<\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/70b37faf295170d8507d5c605f4b2047.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Nosso tempo<\/h3>\n<p>\nDesde ent\u00e3o, claro, as \u00e1rvores cresceram, o mundo mudou, e ficou assim:<\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/e8698d658bd09e0071f02a672a5cb81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO mercado dos SGBDs tamb\u00e9m mudou, o que \u00e9 claramente demonstrado pelo recente relat\u00f3rio da empresa Gartner:<\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/745f3969a3ad2e65162ef41cda6c0658.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE aqui n\u00e3o podemos deixar de notar que as nuvens encontraram seu espa\u00e7o, cuja popularidade est\u00e1 crescendo. Se lermos o mesmo relat\u00f3rio da Gartner, veremos as seguintes conclus\u00f5es:<\/p>\n<ol>\n<li>Muitos clientes est\u00e3o no caminho de migrar aplicativos para a nuvem. <\/li>\n<li>Novas tecnologias aparecem primeiro na nuvem e n\u00e3o h\u00e1 garantia de que algum dia elas se mudar\u00e3o para uma infraestrutura n\u00e3o baseada em nuvem.<\/li>\n<li>O modelo de precifica\u00e7\u00e3o baseado no princ\u00edpio pay-as-you-go se tornou comum. Todos desejam pagar apenas pelo que utilizam, e isso j\u00e1 n\u00e3o \u00e9 mais uma tend\u00eancia, mas uma constata\u00e7\u00e3o. <\/li>\n<\/ol>\n<p><\/p>\n<h3>E agora?<\/h3>\n<p>\nHoje todos n\u00f3s estamos na nuvem. E as quest\u00f5es que surgem s\u00e3o quest\u00f5es de escolha. E essa escolha \u00e9 vasta, mesmo se falarmos apenas sobre a sele\u00e7\u00e3o de tecnologias de SGBD em formato On-premises. Al\u00e9m disso, temos servi\u00e7os gerenciados e SaaS. Assim, a escolha s\u00f3 se torna mais complexa a cada ano.<\/p>\n<p>Junto com as quest\u00f5es de escolha, existem tamb\u00e9m <b>fatores limitantes<\/b>:<\/p>\n<ul>\n<li><b>o pre\u00e7o<\/b>. Muitas tecnologias ainda custam dinheiro;<\/li>\n<li><b>habilidades<\/b>. Se falarmos sobre software livre, surge a quest\u00e3o das habilidades, pois o software gratuito exige de quem o implanta e opera uma compet\u00eancia suficiente;<\/li>\n<li><b>funcionalidade<\/b>. Nem todos os servi\u00e7os dispon\u00edveis na nuvem e constru\u00eddos, digamos, at\u00e9 mesmo sobre a mesma base do Postgres, possuem as mesmas funcionalidades que o Postgres On-premises. Este \u00e9 um fator significativo que deve ser conhecido e compreendido. Al\u00e9m disso, esse fator adquire import\u00e2ncia ainda maior do que o conhecimento de quaisquer recursos ocultos de um SGBD espec\u00edfico. <\/li>\n<\/ul>\n<p>\n<b>O que se espera atualmente de DA\/DE:<\/b><\/p>\n<ul>\n<li>um bom entendimento da \u00e1rea de conhecimento e da arquitetura aplicada;<\/li>\n<li>a habilidade de escolher corretamente a tecnologia de SGBD considerando a tarefa proposta;<\/li>\n<li>a habilidade de selecionar o m\u00e9todo ideal para implementar a tecnologia escolhida no contexto das restri\u00e7\u00f5es existentes;<\/li>\n<li>a habilidade de realizar a transfer\u00eancia e migra\u00e7\u00e3o de dados;<\/li>\n<li>capacidade de implementar e operar as solu\u00e7\u00f5es escolhidas.<\/li>\n<\/ul>\n<p>\nO exemplo a seguir <b>baseado no GCP<\/b> demonstra como a escolha de uma tecnologia de trabalho com dados \u00e9 determinada pela sua estrutura:<\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/fe324d8af9ed8f6afb58ed930dc21327.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObserve que o PostgreSQL est\u00e1 ausente no esquema, e isso ocorre porque ele est\u00e1 escondido sob a terminologia <b>Cloud SQL<\/b>. E quando estamos na Cloud SQL, precisamos novamente fazer uma escolha:<\/p>\n<p><img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/bdf523e0b10fbfe753318a02a686a5af.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVale ressaltar que essa escolha nem sempre \u00e9 clara, portanto, os desenvolvedores de aplicativos muitas vezes se guiam pela intui\u00e7\u00e3o. <\/p>\n<p><b>No total:<\/b><\/p>\n<ol>\n<li>Quanto mais se avan\u00e7a, mais relevante se torna a quest\u00e3o da escolha. E mesmo ao olhar apenas para o GCP, servi\u00e7os gerenciados e SaaS, alguma men\u00e7\u00e3o ao SGBD aparece apenas no 4\u00ba passo (e l\u00e1 est\u00e1 o Spanner ao lado). Al\u00e9m disso, a escolha do PostgreSQL s\u00f3 aparece no 5\u00ba passo, com MySQL e SQL Server ao lado, ou seja, <b>h\u00e1 muitas op\u00e7\u00f5es, e \u00e9 preciso escolher<\/b>. <\/li>\n<li>N\u00e3o podemos esquecer das limita\u00e7\u00f5es diante das tenta\u00e7\u00f5es. No geral, todos querem o Spanner, mas ele \u00e9 caro. No final, a solicita\u00e7\u00e3o t\u00edpica se parece mais ou menos com isso: <i>\u00abPor favor, fa\u00e7am para n\u00f3s um Spanner, mas pelo pre\u00e7o do Cloud SQL, voc\u00eas s\u00e3o profissionais!\u00bb<\/i><\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/cc656b46d37d08fc6aeca937e1e9085b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>E agora, o que fazer?<\/h3>\n<p>\nSem pretender ter a verdade absoluta, podemos dizer o seguinte:<\/p>\n<p><b>\u00c9 preciso mudar a abordagem de ensino:<\/b><\/p>\n<ul>\n<li>ensinar como se fazia antes com DBA n\u00e3o faz sentido;<\/li>\n<li>o conhecimento sobre um \u00fanico produto j\u00e1 n\u00e3o \u00e9 suficiente;<\/li>\n<li>e conhecer dezenas de produtos no mesmo n\u00edvel \u00e9 imposs\u00edvel.<\/li>\n<\/ul>\n<p>\n\u00c9 necess\u00e1rio saber n\u00e3o apenas o produto, mas:<\/p>\n<ul>\n<li>o caso de uso de sua aplica\u00e7\u00e3o;<\/li>\n<li>os diferentes m\u00e9todos de implementa\u00e7\u00e3o;<\/li>\n<li>as vantagens e desvantagens de cada m\u00e9todo;<\/li>\n<li>produtos semelhantes e alternativos, para tomar decis\u00f5es conscientes e otimais, e nem sempre a favor do produto que j\u00e1 se conhece.<\/li>\n<\/ul>\n<p>\nE tamb\u00e9m \u00e9 preciso saber migrar dados e entender os princ\u00edpios b\u00e1sicos de integra\u00e7\u00e3o com ETL.<\/p>\n<h3>Um caso real<\/h3>\n<p>\nRecentemente, tive que desenvolver o backend para um aplicativo m\u00f3vel. No momento em que comecei a trabalhar nele, o backend j\u00e1 tinha sido desenvolvido e estava pronto para ser implementado, e a equipe de desenvolvedores havia trabalhado neste projeto por cerca de dois anos. As seguintes tarefas foram definidas:<\/p>\n<ul>\n<li>construir CI\/CD;<\/li>\n<li>fazer a revis\u00e3o da arquitetura;<\/li>\n<li>colocar tudo isso em opera\u00e7\u00e3o. <\/li>\n<\/ul>\n<p>\nO pr\u00f3prio aplicativo era microservi\u00e7os, e o c\u00f3digo em Python\/Django foi desenvolvido do zero e diretamente no GCP. Quanto ao p\u00fablico-alvo, considerou-se que haveria duas regi\u00f5es \u2014 US e EU, e o tr\u00e1fego foi distribu\u00eddo atrav\u00e9s do Load Balancer Global. Todas as cargas de trabalho e a carga computacional funcionaram no Google Kubernetes Engine. <\/p>\n<p>Quanto aos dados, havia 3 estruturas:<\/p>\n<ul>\n<li>Cloud Storage;<\/li>\n<li>Datastore;<\/li>\n<li>Cloud SQL (PostgreSQL).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Como as bases de dados SQL sobrevivem no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster\" src=\"\/wp-content\/uploads\/2019\/12\/e6e38b1d861b2871edf20fb09378b491.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPode surgir a pergunta por que o Cloud SQL foi escolhido? Para ser sincero, tal pergunta nos \u00faltimos anos gera uma certa pausa constrangedora \u2014 parece que as pessoas come\u00e7aram a se envergonhar de bancos de dados relacionais, mas, no entanto, continuam a us\u00e1-los ativamente ;-). <\/p>\n<p>Quanto ao nosso caso, o Cloud SQL foi escolhido pelas seguintes raz\u00f5es:<\/p>\n<ol>\n<li>Como mencionado, o aplicativo foi desenvolvido com Django, e nele h\u00e1 um modelo para exibir dados persistentes do banco de dados SQL em objetos Python (Django ORM).<\/li>\n<li>O pr\u00f3prio framework suportava uma lista consideravelmente limitada de SGBDs:<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>PostgreSQL;<\/li>\n<li>MariaDB;<\/li>\n<li>MySQL;<\/li>\n<li>Oracle;<\/li>\n<li>SQLite.<\/li>\n<\/ul>\n<p>\nPortanto, o PostgreSQL foi escolhido dessa lista de forma mais intuitiva (realmente, n\u00e3o vamos escolher o Oracle).<\/p>\n<p><b>O que estava faltando:<\/b><\/p>\n<ul>\n<li>o aplicativo foi implantado apenas em 2 regi\u00f5es, e agora havia planos para uma 3\u00aa (\u00c1sia);<\/li>\n<li>O banco de dados estava na regi\u00e3o da Am\u00e9rica do Norte (Iowa);<\/li>\n<li>havia preocupa\u00e7\u00f5es do cliente sobre poss\u00edveis <b>atrasos de acesso<\/b> da Europa e da \u00c1sia e <b>interrup\u00e7\u00f5es <\/b><b>no servi\u00e7o<\/b> em caso de inatividade do SGBD. <\/li>\n<\/ul>\n<p>\nEmbora o pr\u00f3prio Django possa trabalhar com v\u00e1rios bancos de dados simultaneamente e dividi-los entre leitura e escrita, as grava\u00e7\u00f5es no aplicativo n\u00e3o eram muitas (mais de 90% \u2014 leitura). No geral, se fosse poss\u00edvel fazer uma <b>replica de leitura do banco principal na Europa e na \u00c1sia<\/b>, isso seria uma op\u00e7\u00e3o de comprometimento. Mas o que h\u00e1 de t\u00e3o dif\u00edcil nisso?<\/p>\n<p>A dificuldade estava no fato de que o cliente n\u00e3o queria abrir m\u00e3o do uso de servi\u00e7os gerenciados e Cloud SQL. E as capacidades do Cloud SQL, neste momento, s\u00e3o limitadas. O Cloud SQL suporta alta disponibilidade (HA) e r\u00e9plica de leitura (RR), mas a mesma RR \u00e9 suportada apenas em uma regi\u00e3o. Ao criar um banco de dados na regi\u00e3o americana, n\u00e3o \u00e9 poss\u00edvel fazer uma r\u00e9plica de leitura na regi\u00e3o europeia utilizando os recursos do Cloud SQL, embora o pr\u00f3prio PostgreSQL n\u00e3o impe\u00e7a isso. A correspond\u00eancia com os funcion\u00e1rios do Google n\u00e3o levou a nada e terminou com promessas no estilo \"sabemos do problema e estamos trabalhando nele, em algum momento a quest\u00e3o ser\u00e1 resolvida.\" <\/p>\n<p>Se enumerarmos as capacidades do Cloud SQL em formato de t\u00f3picos, ficaria aproximadamente assim:<\/p>\n<p><b>1. Alta disponibilidade (HA):<\/b><\/p>\n<ul>\n<li>dentro de uma \u00fanica regi\u00e3o;<\/li>\n<li>por meio de replica\u00e7\u00e3o de disco;<\/li>\n<li>n\u00e3o s\u00e3o utilizados mecanismos do PostgreSQL;<\/li>\n<li>pode haver gerenciamento autom\u00e1tico e manual \u2014 failover\/failback;<\/li>\n<li>durante a troca, o SGBD n\u00e3o est\u00e1 dispon\u00edvel por alguns minutos.<\/li>\n<\/ul>\n<p>\n<b>2. R\u00e9plica de leitura (RR):<\/b><\/p>\n<ul>\n<li>dentro de uma \u00fanica regi\u00e3o;<\/li>\n<li>standby quente;<\/li>\n<li>replica\u00e7\u00e3o em streaming do PostgreSQL.<\/li>\n<\/ul>\n<p>\nAl\u00e9m disso, como \u00e9 comum, ao escolher a tecnologia voc\u00ea sempre se depara com alguma <b>limita\u00e7\u00e3o;<\/b>:<\/p>\n<ul>\n<li>o cliente n\u00e3o queria criar entidades e usar IaaS, exceto atrav\u00e9s do GKE;<\/li>\n<li>o cliente n\u00e3o gostaria de implantar PostgreSQL\/MySQL self service;<\/li>\n<li>Ali\u00e1s, o Google Spanner seria uma boa op\u00e7\u00e3o, se n\u00e3o fosse pelo seu pre\u00e7o. No entanto, ele n\u00e3o \u00e9 compat\u00edvel com o Django ORM, mas \u00e9 uma boa solu\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>\nDiante da situa\u00e7\u00e3o, o cliente lan\u00e7ou uma pergunta desafiadora: <i>\u00abVoc\u00eas podem fazer algo semelhante ao Google Spanner, mas que funcione tamb\u00e9m com o Django ORM?\u00bb<\/i><\/p>\n<h3>Op\u00e7\u00e3o de solu\u00e7\u00e3o n\u00ba 0<\/h3>\n<p>\nA primeira ideia que veio \u00e0 mente foi:<\/p>\n<ul>\n<li>permanecer dentro do CloudSQL;<\/li>\n<li>n\u00e3o haver\u00e1 replica\u00e7\u00e3o integrada entre regi\u00f5es de forma alguma;<\/li>\n<li>tentar conectar uma r\u00e9plica ao Cloud SQL existente by PostgreSQL;<\/li>\n<li>iniciar uma inst\u00e2ncia PostgreSQL de alguma forma, mas n\u00e3o tocar no master.<\/li>\n<\/ul>\n<p>\nInfelizmente, descobriu-se que isso n\u00e3o era poss\u00edvel, pois n\u00e3o h\u00e1 acesso ao host (que est\u00e1 em outro projeto) \u2014 pg_hba e assim por diante, e tamb\u00e9m n\u00e3o h\u00e1 acesso como superusu\u00e1rio.<\/p>\n<h3>Op\u00e7\u00e3o de solu\u00e7\u00e3o n\u00ba 1<\/h3>\n<p>\nAp\u00f3s mais reflex\u00f5es e considerando as circunst\u00e2ncias anteriores, a linha de pensamento mudou um pouco:<\/p>\n<ul>\n<li>continuamos tentando permanecer dentro do CloudSQL, mas mudamos para MySQL, pois o Cloud SQL by MySQL possui um master externo que:<\/li>\n<\/ul>\n<p>\n\u2014 \u00e9 um proxy para o MySQL externo;<br \/>\n\u2014 se parece com uma inst\u00e2ncia MySQL;<br \/>\n\u2014 foi criado para migra\u00e7\u00e3o de dados de outras nuvens ou localmente.<\/p>\n<p>Visto que a configura\u00e7\u00e3o de replica\u00e7\u00e3o MySQL n\u00e3o requer acesso ao host, tudo funcionou, mas de maneira muito inst\u00e1vel e desconfort\u00e1vel. E quando avan\u00e7amos, ficou ainda mais assustador, pois est\u00e1vamos implantando toda a estrutura com terraform e, de repente, descobrimos que o master externo n\u00e3o era suportado pelo terraform. Sim, o Google tem uma CLI, mas inexplicavelmente, aqui tamb\u00e9m, tudo funcionava de vez em quando \u2014 \u00e0s vezes criava, \u00e0s vezes n\u00e3o. Possivelmente, porque a CLI foi desenvolvida para migra\u00e7\u00e3o de dados de fora, e n\u00e3o para r\u00e9plicas.<\/p>\n<p>De fato, ficou claro que o Cloud SQL n\u00e3o era adequado de maneira alguma. Como dizem, fizemos tudo o que pudemos. <\/p>\n<h3>Op\u00e7\u00e3o de solu\u00e7\u00e3o n\u00ba 2<\/h3>\n<p>\nComo n\u00e3o foi poss\u00edvel permanecer no Cloud SQL, tentamos formular as exig\u00eancias para uma solu\u00e7\u00e3o de compromisso. As exig\u00eancias foram as seguintes:<\/p>\n<ul>\n<li>trabalho no Kubernetes, m\u00e1xima utiliza\u00e7\u00e3o de recursos e capacidades do Kubernetes (DCS, &#8230;) e GCP (LB, &#8230;);<\/li>\n<li>aus\u00eancia de excessos de uma pilha de coisas desnecess\u00e1rias na nuvem, como HA proxy;<\/li>\n<li>capacidade de executar HA PostgreSQL ou MySQL na regi\u00e3o principal; nas outras regi\u00f5es \u2014 HA do RR da regi\u00e3o principal mais sua c\u00f3pia (para maior confiabilidade);<\/li>\n<li>multi master (n\u00e3o era desej\u00e1vel se conectar a ela, mas isso n\u00e3o era muito cr\u00edtico)<\/li>\n<\/ul>\n<p>. <br \/>\nComo resultado dessas exig\u00eancias, finalmente, uma solu\u00e7\u00e3o come\u00e7ou a surgir no horizonte.<b>op\u00e7\u00f5es adequadas de SGBD e bibliotecas<\/b>:<\/p>\n<ul>\n<li>MySQL Galera;<\/li>\n<li>CockroachDB;<\/li>\n<li>ferramentas PostgreSQL<\/li>\n<\/ul>\n<p>:<br \/>\n\u2014 pgpool-II;<br \/>\n\u2014 Patroni.<\/p>\n<h3>MySQL Galera<\/h3>\n<p>\nA tecnologia MySQL Galera foi desenvolvida pela Codership e \u00e9 um plugin para InnoDB. Caracter\u00edsticas:<\/p>\n<ul>\n<li>multi mestre;<\/li>\n<li>replica\u00e7\u00e3o s\u00edncrona;<\/li>\n<li>leitura de qualquer n\u00f3;<\/li>\n<li>grava\u00e7\u00e3o em qualquer n\u00f3;<\/li>\n<li>mecanismo HA embutido;<\/li>\n<li>existe um Helm chart da Bitnami.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CockroachDB<\/h3>\n<p>\nPela descri\u00e7\u00e3o, \u00e9 um projeto incr\u00edvel e representa um projeto open source escrito em Go. O principal participante \u00e9 a Cockroach Labs (fundada por ex-membros do Google). Este SGBD relacional foi criado para ser distribu\u00eddo (com escalabilidade horizontal \"out of the box\") e tolerante a falhas. Seus autores declararam o objetivo de \"combinar a riqueza de funcionalidade do SQL com a disponibilidade horizontal, comum em solu\u00e7\u00f5es NoSQL.\"<\/p>\n<p>Como b\u00f4nus agrad\u00e1vel \u2014 suporte ao protocolo de conex\u00e3o PostgreSQL. <\/p>\n<h3>Pgpool<\/h3>\n<p>\n\u00c9 uma camada sobre o PostgreSQL, na verdade, uma nova entidade que assume todas as conex\u00f5es e as processa. Tem seu pr\u00f3prio balanceador de carga e parser, e \u00e9 licenciada sob a licen\u00e7a BSD. Oferece amplas possibilidades, mas parece um pouco assustadora, pois a presen\u00e7a de uma nova entidade poderia ser a fonte de algumas aventuras adicionais. <\/p>\n<h3>Patroni<\/h3>\n<p>\nEsta foi a \u00faltima op\u00e7\u00e3o considerada, e, como se viu, n\u00e3o foi em v\u00e3o. Patroni \u00e9 uma ferramenta open source que, na pr\u00e1tica, \u00e9 um daemon em Python, permitindo gerenciar automaticamente clusters PostgreSQL com diferentes tipos de replica\u00e7\u00e3o e com troca autom\u00e1tica de pap\u00e9is. A solu\u00e7\u00e3o foi bastante interessante, pois se integra bem com Kubernetes e n\u00e3o traz novas entidades. <\/p>\n<h3>O que foi escolhido no final<\/h3>\n<p>\nA escolha n\u00e3o foi f\u00e1cil:<\/p>\n<ol>\n<li><b>CockroachDB <\/b>\u2014 excelente, mas arriscado;<\/li>\n<li><b>MySQL Galera<\/b> \u2014 tamb\u00e9m n\u00e3o \u00e9 ruim, bastante utilizado, mas MySQL;<\/li>\n<li><b>Pgpool <\/b>\u2014 muitas entidades desnecess\u00e1rias, integra\u00e7\u00e3o fraca com a nuvem e K8s;<\/li>\n<li><b>Patroni <\/b>\u2014 \u00f3tima integra\u00e7\u00e3o com K8s, sem entidades desnecess\u00e1rias, bem integrada com GCP LB.<\/li>\n<\/ol>\n<p>\nDessa forma, a escolha recaiu sobre o Patroni. <\/p>\n<h3>Como resultado, obtemos um servi\u00e7o de \"monitoramento como servi\u00e7o\", automatizado na linha de produ\u00e7\u00e3o de integra\u00e7\u00e3o cont\u00ednua. O desenvolvedor ou testador precisa apenas definir a lista de m\u00e9tricas em um arquivo JSON, e tudo o mais acontece automaticamente. Obtemos um controle de qualidade transparente dos lan\u00e7amentos: todas as notifica\u00e7\u00f5es sobre desempenho, consumo de recursos ou regress\u00f5es arquitet\u00f4nicas.<\/h3>\n<p>\nChegou a hora de fazer um breve resumo. Sim, o mundo da infraestrutura de TI mudou significativamente, e isso \u00e9 apenas o come\u00e7o. Se antes as nuvens eram apenas um tipo diferente de infraestrutura, agora tudo \u00e9 diferente. Al\u00e9m disso, inova\u00e7\u00f5es nas nuvens est\u00e3o surgindo constantemente, continuar\u00e3o a aparecer e, possivelmente, s\u00f3 aparecer\u00e3o nas nuvens e, mais tarde, atrav\u00e9s de startups, ser\u00e3o transferidas para on-premises.<\/p>\n<p>No que diz respeito ao SQL, o SQL continuar\u00e1 a existir. Isso significa que \u00e9 necess\u00e1rio conhecer PostgreSQL e MySQL e saber como trabalhar com eles, mas \u00e9 ainda mais importante saber aplic\u00e1-los corretamente.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/481644\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0437\u0430\u043d\u044f\u0442\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u0443\u0440\u0441\u0430 \u00abPostgreSQL\u00bb. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0432\u0435\u0431\u0438\u043d\u0430\u0440 \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u0443\u0440\u0441\u0443. \u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0443\u0440\u043e\u043a\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0442\u043e\u043c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c SQL-\u0431\u0430\u0437\u044b \u0432 \u044d\u0440\u0443 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u0438 Kubernetes. \u0410 \u0437\u0430\u043e\u0434\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 SQL \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u0430\u0431\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0434 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54366","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0437\u0430\u043d\u044f\u0442\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u0443\u0440\u0441\u0430 \u00abPostgreSQL\u00bb.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u0432\u044b\u0436\u0438\u0442\u044c SQL-\u0431\u0430\u0437\u0435 \u0432 21 \u0432\u0435\u043a\u0435: \u043e\u0431\u043b\u0430\u043a\u0430, Kubernetes \u0438 PostgreSQL multimaster | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0437\u0430\u043d\u044f\u0442\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u0443\u0440\u0441\u0430 \u00abPostgreSQL\u00bb.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-23T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:22+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Como sobreviver com banco de dados SQL no s\u00e9culo 21: nuvens, Kubernetes e PostgreSQL multimaster | ProHoster","description":"Ol\u00e1, habrianos. Hoje come\u00e7am as aulas do primeiro grupo do curso \"PostgreSQL\".","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u0432\u044b\u0436\u0438\u0442\u044c SQL-\u0431\u0430\u0437\u0435 \u0432 21 \u0432\u0435\u043a\u0435: \u043e\u0431\u043b\u0430\u043a\u0430, Kubernetes \u0438 PostgreSQL multimaster | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0437\u0430\u043d\u044f\u0442\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043a\u0443\u0440\u0441\u0430 \u00abPostgreSQL\u00bb.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-vyzhit-sql-baze-v-21-veke-oblaka-kubernetes-i-postgresql-multimaster","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-23T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54366","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 11:06:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:30:12","updated":"2026-01-24 11:06:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/54366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=54366"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/54366\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=54366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=54366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=54366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}