{"id":91635,"date":"2020-08-15T19:42:23","date_gmt":"2020-08-15T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem"},"modified":"2020-08-15T19:42:23","modified_gmt":"2020-08-15T17:42:23","slug":"na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","title":{"rendered":"No caminho para bancos de dados sem servidor \u2014 como e por que","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1 a todos! Meu nome \u00e9 Nikolai Golov. Antes, trabalhei na Avito e por seis anos liderava a Data Platform, ou seja, lidava com todos os bancos de dados: anal\u00edticos (Vertica, ClickHouse), de fluxo e OLTP (Redis, Tarantool, VoltDB, MongoDB, PostgreSQL). Durante esse tempo, me aprofundei em uma grande variedade de bancos de dados \u2014 os mais diversos e incomuns, assim como casos de uso n\u00e3o convencionais.<\/p>\n<p>Atualmente, trabalho na ManyChat. Basicamente, \u00e9 uma startup \u2014 nova, ambiciosa e em r\u00e1pido crescimento. E quando eu entrei na empresa, surgiu a pergunta cl\u00e1ssica: \"O que uma startup jovem deve escolher no mercado de SGBDs e bancos de dados?\". <\/p>\n<p>Neste artigo, baseado na minha apresenta\u00e7\u00e3o no <noindex><a rel=\"nofollow\" href=\"https:\/\/ritfest.ru\/2020\/\">festival online RIT++2020<\/a><\/noindex>, responderei a essa pergunta. A vers\u00e3o em v\u00eddeo da apresenta\u00e7\u00e3o est\u00e1 dispon\u00edvel em <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/H23f_z13ro4\">YouTube<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/6a5df9b75ad435ebe88adf920ab9ea8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Bancos de dados bem conhecidos de 2020<\/h2>\n<p>\nEstamos em 2020, olhei ao meu redor e vi tr\u00eas tipos de bancos de dados. <\/p>\n<p>O primeiro tipo \u2014 <b>bancos OLTP cl\u00e1ssicos<\/b>: PostgreSQL, SQL Server, Oracle, MySQL. Eles foram criados h\u00e1 muito tempo, mas ainda s\u00e3o relevantes, pois s\u00e3o bem conhecidos pela comunidade de desenvolvedores.<\/p>\n<p>O segundo tipo \u2014 <b>bancos dos anos 2000<\/b>. Eles tentaram se distanciar dos padr\u00f5es cl\u00e1ssicos abandonando o SQL, estruturas tradicionais e ACID, introduzindo sharding embutido e outras funcionalidades atraentes. Por exemplo, Cassandra, MongoDB, Redis ou Tarantool. Todas essas solu\u00e7\u00f5es queriam oferecer algo realmente novo ao mercado e encontraram seu nicho, pois se mostraram extremamente convenientes para tarefas espec\u00edficas. Esses bancos ser\u00e3o designados pelo termo gen\u00e9rico NOSQL.<\/p>\n<p>\"Os anos 2000\" acabaram, os bancos NOSQL se tornaram familiares, e o mundo, na minha vis\u00e3o, deu o pr\u00f3ximo passo \u2014 para <b>bancos gerenciados<\/b>. Com esses bancos, o n\u00facleo \u00e9 o mesmo dos bancos OLTP cl\u00e1ssicos ou dos novos NoSQL. Mas eles n\u00e3o t\u00eam a necessidade de DBA e DevOps e operam em hardware gerenciado na nuvem. Para o desenvolvedor, \u00e9 \"apenas um banco\", que funciona em algum lugar, e como foi instalado no servidor, quem configurou o servidor e quem o atualiza, ningu\u00e9m se importa.<\/p>\n<p>Exemplos desses bancos:<\/p>\n<ul>\n<li>AWS RDS \u2014 camada gerenciada sobre PostgreSQL\/MySQL.<\/li>\n<li>DynamoDB \u2014 an\u00e1logo da AWS de um banco baseado em documentos, parece com Redis e MongoDB.<\/li>\n<li>Amazon Redshift \u2014 banco anal\u00edtico gerenciado.<\/li>\n<\/ul>\n<p>\nS\u00e3o bancos antigos, mas elevados em um ambiente gerenciado, sem a necessidade de trabalhar com hardware. <\/p>\n<p><i>Nota. Os exemplos foram retirados do ambiente AWS, mas seus an\u00e1logos tamb\u00e9m existem no Microsoft Azure, Google Cloud ou Yandex.Cloud.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/06e50904f795b3b5dc62ca45622b2dd7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO que h\u00e1 de novo nisso? Em 2020, nada disso.<\/p>\n<h2>A conceito Serverless<\/h2>\n<p>\nO que realmente \u00e9 novo no mercado em 2020 s\u00e3o as solu\u00e7\u00f5es serverless ou sem servidor.<\/p>\n<p>Vou tentar explicar o que isso significa, usando o exemplo de um servi\u00e7o comum ou de um aplicativo backend.<br \/>\nPara implantar um aplicativo backend comum, compramos ou alugamos um servidor, copiamos o c\u00f3digo para ele, publicamos um endpoint para o exterior e pagamos regularmente pelo aluguel, eletricidade e servi\u00e7os do data center. Este \u00e9 o esquema padr\u00e3o.<\/p>\n<p>H\u00e1 uma maneira diferente de fazer isso? Com servi\u00e7os serverless \u00e9 poss\u00edvel.<\/p>\n<p>Qual \u00e9 o foco dessa abordagem: sem servidor, sem mesmo alugar uma inst\u00e2ncia virtual na nuvem. Para implantar o servi\u00e7o, apenas copiamos o c\u00f3digo (fun\u00e7\u00f5es) para um reposit\u00f3rio e publicamos um endpoint. Depois, pagamos apenas por cada chamada dessa fun\u00e7\u00e3o, ignorando totalmente o hardware onde ela \u00e9 executada.<\/p>\n<p>Vou tentar ilustrar essa abordagem com imagens.<br \/>\n<img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/705cf89c51b8166da772b1d877262b44.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Implanta\u00e7\u00e3o cl\u00e1ssica<\/b>. Temos um servi\u00e7o com uma carga espec\u00edfica. Subimos duas inst\u00e2ncias: servidores f\u00edsicos ou inst\u00e2ncias na AWS. As solicita\u00e7\u00f5es externas s\u00e3o direcionadas para essas inst\u00e2ncias, onde s\u00e3o processadas. <\/p>\n<p>Como pode ser visto na imagem, os servidores n\u00e3o est\u00e3o sendo utilizados de maneira uniforme. Um est\u00e1 100% utilizado, com duas solicita\u00e7\u00f5es, enquanto o outro est\u00e1 apenas 50% utilizado \u2014 parcialmente inativo. Se recebemos n\u00e3o tr\u00eas solicita\u00e7\u00f5es, mas 30, o sistema n\u00e3o conseguir\u00e1 suportar a carga e come\u00e7ar\u00e1 a desacelerar.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/005b1f91ced2f2b29363cf975ed085e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Implanta\u00e7\u00e3o serverless<\/b>. Em um ambiente serverless, esse tipo de servi\u00e7o n\u00e3o possui inst\u00e2ncias ou servidores. Existe uma certa quantidade de recursos aquecidos \u2014 pequenos cont\u00eaineres Docker preparados com o c\u00f3digo da fun\u00e7\u00e3o implantada. O sistema recebe solicita\u00e7\u00f5es externas e para cada uma delas, o framework serverless inicia um pequeno cont\u00eainer com o c\u00f3digo: processa exatamente essa solicita\u00e7\u00e3o e encerra o cont\u00eainer.<\/p>\n<p>Uma solicita\u00e7\u00e3o \u2014 um cont\u00eainer iniciado, 1000 solicita\u00e7\u00f5es \u2014 1000 cont\u00eaineres. E a implanta\u00e7\u00e3o em servidores f\u00edsicos \u00e9 trabalho do provedor da nuvem. Isso est\u00e1 completamente oculto pelo framework serverless. Nesta concep\u00e7\u00e3o, pagamos por cada chamada. Por exemplo, se chega uma chamada por dia \u2014 pagamos por uma chamada, se chegam um milh\u00e3o por minuto \u2014 pagamos por um milh\u00e3o. Ou por segundo, o que tamb\u00e9m acontece.<\/p>\n<p>O conceito de publicar uma fun\u00e7\u00e3o serverless \u00e9 adequado para servi\u00e7os stateless. Mas se voc\u00ea precisa de um servi\u00e7o statefull, adicionamos um banco de dados ao servi\u00e7o. Nesse caso, quando se trata de trabalhar com o state, cada fun\u00e7\u00e3o statefull simplesmente l\u00ea e grava no banco de dados. E isso pode ser feito em qualquer um dos tr\u00eas tipos de banco de dados descritos no in\u00edcio do artigo.<\/p>\n<p>Qual \u00e9 a limita\u00e7\u00e3o comum a todos esses bancos? Os custos de um servidor em nuvem ou f\u00edsico (ou v\u00e1rios servidores) em uso constante. N\u00e3o importa se usamos um banco cl\u00e1ssico ou gerenciado, se temos DevOps e um administrador ou n\u00e3o, ainda assim pagamos 24 horas por dia, 7 dias por semana, pelo hardware, eletricidade e loca\u00e7\u00e3o do data center. Se temos um banco cl\u00e1ssico, pagamos pelo master e pelo slave. Se \u00e9 um banco sharded de alta carga \u2014 pagamos por 10, 20 ou 30 servidores e pagamos constantemente.<\/p>\n<p>A presen\u00e7a de servidores constantemente reservados na estrutura de custos era antes vista como um mal necess\u00e1rio. Bancos convencionais tamb\u00e9m enfrentam outras complexidades, como limites no n\u00famero de conex\u00f5es, restri\u00e7\u00f5es de escalabilidade, consenso geodistribu\u00eddo \u2014 algumas delas podem ser resolvidas em certos bancos, mas n\u00e3o todas ao mesmo tempo e de forma ideal.<\/p>\n<h2>Banco de dados serverless \u2014 teoria<\/h2>\n<p>\nPergunta de 2020: \u00e9 poss\u00edvel tornar um banco de dados serverless tamb\u00e9m? Todos ouviram sobre o backend serverless... ent\u00e3o, por que n\u00e3o tentar tornar o banco de dados serverless?<\/p>\n<p>Isso soa estranho, porque um banco de dados \u00e9 um servi\u00e7o statefull, n\u00e3o muito adequado para infraestruturas serverless. Al\u00e9m disso, o state de um banco de dados \u00e9 muito grande: gigabytes, terabytes e, em bancos de dados anal\u00edticos, at\u00e9 petabytes. Isso n\u00e3o \u00e9 f\u00e1cil de executar em cont\u00eaineres Docker leves.<\/p>\n<p>Por outro lado, praticamente todos os bancos modernos envolvem uma enorme quantidade de l\u00f3gica e componentes: transa\u00e7\u00f5es, valida\u00e7\u00e3o de integridade, procedimentos, depend\u00eancias relacionais e muita l\u00f3gica. Uma parte consider\u00e1vel da l\u00f3gica de um banco de dados requer um state pequeno. Gigabytes e terabytes s\u00e3o usados apenas por uma pequena parte da l\u00f3gica do banco de dados, relacionada \u00e0 execu\u00e7\u00e3o direta das consultas.<\/p>\n<p>Assim, a ideia \u00e9: se parte da l\u00f3gica permite execu\u00e7\u00e3o stateless, por que n\u00e3o dividir o banco em partes Stateful e Stateless.<\/p>\n<h2>Serverless para solu\u00e7\u00f5es OLAP<\/h2>\n<p>\nVamos ver como pode ser a divis\u00e3o de um banco de dados em partes Stateful e Stateless atrav\u00e9s de exemplos pr\u00e1ticos.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/51793a5649e68dafc9e7ce395da9e065.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Por exemplo, temos um banco de dados anal\u00edtico<\/b>: dados externos (cilindro vermelho \u00e0 esquerda), um processo ETL que carrega dados no banco e um analista que envia consultas SQL para o banco. Este \u00e9 o esquema cl\u00e1ssico de funcionamento de um armaz\u00e9m de dados. <\/p>\n<p>Neste esquema, condicionalmente, o ETL \u00e9 executado uma vez. Depois, precisamos pagar continuamente pelos servidores nos quais o banco com os dados carregados pelo ETL opera, para que haja algo para enviar consultas. <\/p>\n<p>Vamos considerar uma abordagem alternativa implementada no banco AWS Athena Serverless. Aqui, n\u00e3o h\u00e1 hardware designado constantemente onde os dados carregados s\u00e3o armazenados. Em vez disso:<\/p>\n<ul>\n<li>O usu\u00e1rio envia uma consulta SQL para o Athena. O otimizador do Athena analisa a consulta SQL e procura no armazenamento de metadados os dados espec\u00edficos necess\u00e1rios para executar a consulta.<\/li>\n<li>Com base nos dados coletados, o otimizador extrai os dados necess\u00e1rios de fontes externas para um armazenamento tempor\u00e1rio (banco de dados tempor\u00e1rio).<\/li>\n<li>No armazenamento tempor\u00e1rio, a consulta SQL do usu\u00e1rio \u00e9 executada e o resultado \u00e9 retornado ao usu\u00e1rio. <\/li>\n<li>O armazenamento tempor\u00e1rio \u00e9 limpo e os recursos s\u00e3o liberados.<\/li>\n<\/ul>\n<p>Nesta arquitetura, pagamos apenas pelo processo de execu\u00e7\u00e3o da consulta. N\u00e3o h\u00e1 consultas \u2014 n\u00e3o h\u00e1 gastos.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/0e21282b66e3120524c2324811cb04a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEsta \u00e9 uma abordagem funcional e \u00e9 implementada n\u00e3o apenas no Athena Serverless, mas tamb\u00e9m no Redshift Spectrum (na AWS).<\/p>\n<p>No exemplo do Athena, fica claro que o banco de dados Serverless funciona com consultas reais contendo dezenas e centenas de terabytes de dados. Para centenas de terabytes, precisar\u00edamos de centenas de servidores, mas n\u00e3o precisamos pagar por eles \u2014 pagamos pelas consultas. A velocidade de cada consulta \u00e9 (muito) baixa em compara\u00e7\u00e3o com bancos de dados anal\u00edticos especializados como o Vertica, mas, em troca, n\u00e3o pagamos por per\u00edodos de inatividade.<\/p>\n<p>Esse banco de dados \u00e9 aplic\u00e1vel para consultas anal\u00edticas ad-hoc raras. Por exemplo, quando decidimos espontaneamente verificar uma hip\u00f3tese em um volume gigantesco de dados. Para esses casos, o Athena \u00e9 ideal. Para consultas regulares, esse sistema se torna caro. Neste caso, fa\u00e7a cache dos dados em alguma solu\u00e7\u00e3o especializada. <\/p>\n<h2>Serverless para solu\u00e7\u00f5es OLTP<\/h2>\n<p>\nNo exemplo anterior, foram consideradas tarefas OLAP (anal\u00edticas). Agora, vamos considerar tarefas OLTP.<\/p>\n<p>Vamos apresentar um PostgreSQL ou MySQL escal\u00e1vel. Vamos levantar uma inst\u00e2ncia gerenciada comum de PostgreSQL ou MySQL com recursos m\u00ednimos. Quando a inst\u00e2ncia enfrentar uma carga maior, adicionaremos r\u00e9plicas adicionais, nas quais distribuiremos parte da carga de leitura. Se n\u00e3o houver solicita\u00e7\u00f5es e carga, desativamos as r\u00e9plicas. A primeira inst\u00e2ncia \u00e9 o mestre, e as demais s\u00e3o as r\u00e9plicas.<\/p>\n<p>Essa ideia est\u00e1 implementada em uma base chamada Aurora Serverless da AWS. O princ\u00edpio \u00e9 simples: as solicita\u00e7\u00f5es de aplicativos externos s\u00e3o recebidas por uma frota de proxy. Ao perceber um aumento na carga, ela allocate recursos computacionais das inst\u00e2ncias m\u00ednimas previamente aquecidas \u2014 a conex\u00e3o \u00e9 realizada o mais r\u00e1pido poss\u00edvel. A desativa\u00e7\u00e3o das inst\u00e2ncias ocorre da mesma forma.<\/p>\n<p>Dentro da Aurora, existe o conceito de Unidade de Capacidade Aurora, ACU. Isso \u00e9 (condicionalmente) uma inst\u00e2ncia (servidor). Cada ACU espec\u00edfico pode ser mestre ou escravo. Cada Unidade de Capacidade possui sua pr\u00f3pria mem\u00f3ria RAM, processador e disco m\u00ednimo. Portanto, um \u00e9 o mestre, e os demais s\u00e3o r\u00e9plicas somente de leitura.<\/p>\n<p>O n\u00famero dessas Unidades de Capacidade Aurora em funcionamento \u00e9 um par\u00e2metro configur\u00e1vel. O n\u00famero m\u00ednimo pode ser um ou zero (neste caso, a base n\u00e3o funciona se n\u00e3o houver solicita\u00e7\u00f5es).<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/ab034e66fbd8874f062a656afa7044c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuando a base recebe solicita\u00e7\u00f5es, a frota de proxy ativa as Unidades de Capacidade Aurora, aumentando os recursos produtivos do sistema. A capacidade de aumentar e diminuir recursos permite que o sistema \"jogue\" com os recursos: desativando automaticamente ACUs individuais (substituindo-os por novos) e aplicando todas as atualiza\u00e7\u00f5es relevantes nos recursos desativados.<\/p>\n<p>A base Aurora Serverless pode escalar a carga de leitura. Mas isso n\u00e3o \u00e9 dito explicitamente na documenta\u00e7\u00e3o. Pode parecer que eles conseguem levantar um multi-mestre. No entanto, n\u00e3o h\u00e1 nenhuma m\u00e1gica. <\/p>\n<p>Essa base \u00e9 ideal para evitar gastar grandes quantias em sistemas com acesso imprevis\u00edvel. Por exemplo, ao criar um MVP ou sites de marketing, geralmente n\u00e3o esperamos uma carga est\u00e1vel. Assim, na aus\u00eancia de acesso, n\u00e3o pagamos por inst\u00e2ncias. Quando uma carga inesperada ocorre, como ap\u00f3s uma confer\u00eancia ou campanha publicit\u00e1ria, grandes volumes de visitantes acessam o site e a carga aumenta rapidamente; o Aurora Serverless assume automaticamente essa carga e conecta rapidamente os recursos ausentes (ACU). Depois da confer\u00eancia, todos esquecem do prot\u00f3tipo, os servidores (ACU) desligam e os custos caem para zero \u2014 \u00e9 conveniente.<\/p>\n<p>Esta solu\u00e7\u00e3o n\u00e3o \u00e9 adequada para alta carga est\u00e1vel, pois n\u00e3o consegue escalar a carga de grava\u00e7\u00e3o. Todas essas conex\u00f5es e desconex\u00f5es de recursos ocorrem no chamado \"ponto de escala\" \u2014 o momento em que a base n\u00e3o est\u00e1 bloqueada por uma transa\u00e7\u00e3o ou por tabelas tempor\u00e1rias. Por exemplo, ao longo de uma semana, o ponto de escala pode n\u00e3o ocorrer, e a base opera com os mesmos recursos sem poder se expandir ou se contrair. <\/p>\n<p>N\u00e3o h\u00e1 m\u00e1gica \u2014 \u00e9 um PostgreSQL comum. Mas o processo de adicionar m\u00e1quinas e desconectar \u00e9 parcialmente automatizado.<\/p>\n<h2>Serverless por design<\/h2>\n<p>\nO Aurora Serverless \u00e9 uma base antiga reescrita para a nuvem, aproveitando as vantagens do Serverless. Agora, deixe-me falar sobre uma base que foi escrita desde o in\u00edcio para a nuvem, com uma abordagem serverless \u2014 Serverless-by-design. Ela foi desenvolvida sem a suposi\u00e7\u00e3o de que funcionaria em servidores f\u00edsicos.<\/p>\n<p>Essa base \u00e9 chamada Snowflake. Ela possui tr\u00eas blocos principais.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/15f9f07ed0281686e509ca6ced387db3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO primeiro \u2014 \u00e9 o bloco de metadados. \u00c9 um servi\u00e7o r\u00e1pido em mem\u00f3ria que resolve quest\u00f5es relacionadas \u00e0 seguran\u00e7a, metadados, transa\u00e7\u00f5es e otimiza\u00e7\u00e3o de consultas (na ilustra\u00e7\u00e3o \u00e0 esquerda).<\/p>\n<p>O segundo bloco \u2014 \u00e9 um conjunto de v\u00e1rios clusters computacionais virtuais para c\u00e1lculos (na ilustra\u00e7\u00e3o \u2014 um conjunto de c\u00edrculos azuis).<\/p>\n<p>O terceiro bloco \u2014 \u00e9 um sistema de armazenamento de dados baseado em S3. O S3 \u00e9 um armazenamento de objetos escal\u00e1vel na AWS, semelhante a um Dropbox sem limites para empresas.<\/p>\n<p>Vamos ver como o Snowflake funciona, assumindo um in\u00edcio a frio. Ou seja, o banco de dados existe, os dados est\u00e3o carregados, mas n\u00e3o h\u00e1 consultas em execu\u00e7\u00e3o. Assim, se n\u00e3o h\u00e1 consultas ao banco, temos um r\u00e1pido servi\u00e7o de Metadados em mem\u00f3ria levantado (o primeiro bloco). E temos um armazenamento S3, onde os dados das tabelas est\u00e3o armazenados, divididos em chamadas micr\u00f4parti\u00e7\u00f5es. Para simplificar: se a tabela cont\u00e9m neg\u00f3cios, as micr\u00f4parti\u00e7\u00f5es s\u00e3o dias de neg\u00f3cios. Cada dia \u00e9 uma micr\u00f4parti\u00e7\u00e3o separada, um arquivo separado. E quando o banco est\u00e1 operando nesse modo, voc\u00ea paga apenas pelo espa\u00e7o ocupado pelos dados. Al\u00e9m disso, a tarifa por espa\u00e7o \u00e9 muito baixa (especialmente considerando a compress\u00e3o significativa). O servi\u00e7o de metadados tamb\u00e9m est\u00e1 sempre ativo, mas para otimiza\u00e7\u00e3o de consultas, n\u00e3o precisa de muitos recursos, e o servi\u00e7o pode ser considerado condicionalmente gratuito. <\/p>\n<p>Agora, vamos imaginar que um usu\u00e1rio se conectou ao nosso banco de dados e enviou uma consulta SQL. A consulta SQL \u00e9 imediatamente enviada para processamento pelo servi\u00e7o de Metadados. Assim, ao receber a consulta, esse servi\u00e7o analisa a consulta, os dados dispon\u00edveis, as permiss\u00f5es do usu\u00e1rio e, se tudo estiver bem, elabora um plano de processamento da consulta.<\/p>\n<p>Em seguida, o servi\u00e7o inicia a execu\u00e7\u00e3o de um cluster de computa\u00e7\u00e3o. O cluster de computa\u00e7\u00e3o \u00e9 um conjunto de servidores que realizam c\u00e1lculos. Ou seja, \u00e9 um cluster que pode conter 1 servidor, 2 servidores, 4, 8, 16, 32 \u2014 quantos voc\u00ea quiser. Voc\u00ea envia a consulta e, imediatamente, o in\u00edcio desse cluster come\u00e7a. Isso realmente leva apenas alguns segundos.<\/p>\n<p><img decoding=\"async\" alt=\"No caminho para bancos de dados sem servidor \u2014 como e por que\" src=\"\/wp-content\/uploads\/2020\/08\/51b11aee0b0868681c4978f5becd1f1d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDepois que o cluster \u00e9 iniciado, microparti\u00e7\u00f5es necess\u00e1rias para processar a sua solicita\u00e7\u00e3o come\u00e7am a ser copiadas do S3 para o cluster. Ou seja, suponha que para executar uma consulta SQL sejam necess\u00e1rias duas parti\u00e7\u00f5es de uma tabela e uma de outra. Nesse caso, somente tr\u00eas parti\u00e7\u00f5es necess\u00e1rias ser\u00e3o copiadas para o cluster, e n\u00e3o todas as tabelas inteiras. \u00c9 por isso que, devido a tudo estar dentro de um \u00fanico data center e conectado por canais muito r\u00e1pidos, todo o processo de transfer\u00eancia ocorre muito rapidamente: em segundos, e raramente em minutos, a menos que se trate de consultas extremamente complexas. Assim, as microparti\u00e7\u00f5es s\u00e3o copiadas para o cluster computacional, e, ao final, essa consulta SQL \u00e9 executada nesse cluster. O resultado dessa consulta pode ser uma linha, v\u00e1rias linhas ou uma tabela \u2014 que s\u00e3o enviadas para o usu\u00e1rio, para que ele possa exportar, exibir em sua ferramenta de BI, ou utiliz\u00e1-las de qualquer outra forma.<\/p>\n<p>Cada consulta SQL pode n\u00e3o apenas calcular agregados a partir de dados previamente carregados, mas tamb\u00e9m carregar\/formar novos dados no banco. Ou seja, pode ser uma consulta que, por exemplo, insere novos registros em outra tabela, o que resulta na cria\u00e7\u00e3o de uma nova parti\u00e7\u00e3o no cluster computacional, que, por sua vez, \u00e9 automaticamente salva no armazenamento S3 unificado.<\/p>\n<p>O cen\u00e1rio descrito acima, desde a chegada do usu\u00e1rio at\u00e9 a ativa\u00e7\u00e3o do cluster, carregamento de dados, execu\u00e7\u00e3o de consultas e obten\u00e7\u00e3o de resultados, \u00e9 cobrado por tarifa por minutos de uso do cluster computacional virtual ativado, o warehouse virtual. A tarifa varia dependendo da zona AWS e do tamanho do cluster, mas, em m\u00e9dia, custa alguns d\u00f3lares por hora. Um cluster de quatro m\u00e1quinas \u00e9 duas vezes mais caro do que um de duas m\u00e1quinas, e um de oito m\u00e1quinas \u00e9 ainda duas vezes mais caro. Est\u00e3o dispon\u00edveis op\u00e7\u00f5es de 16, 32 m\u00e1quinas, dependendo da complexidade das consultas. Mas voc\u00ea paga apenas pelos minutos em que o cluster realmente est\u00e1 em opera\u00e7\u00e3o, pois, quando n\u00e3o h\u00e1 consultas, voc\u00ea 'retira a m\u00e3o', e ap\u00f3s 5-10 minutos de espera (um par\u00e2metro configur\u00e1vel), ele se desligar\u00e1 automaticamente, liberando recursos e tornando-se gratuito.<\/p>\n<p>\u00c9 completamente vi\u00e1vel que voc\u00ea fa\u00e7a uma solicita\u00e7\u00e3o, e o cluster apare\u00e7a, digamos, em um minuto, depois ele leva mais um minuto para calcular, em seguida, cinco minutos para desligar, e no final voc\u00ea paga apenas por sete minutos de opera\u00e7\u00e3o desse cluster, e n\u00e3o por meses ou anos.<\/p>\n<p>O primeiro cen\u00e1rio descreveu o uso do Snowflake em um modo para um \u00fanico usu\u00e1rio. Agora vamos imaginar que h\u00e1 muitos usu\u00e1rios, o que j\u00e1 se aproxima de um cen\u00e1rio real.<\/p>\n<p>Suponha que temos muitos analistas e relat\u00f3rios do Tableau que est\u00e3o constantemente bombardeando nosso banco de dados com uma grande quantidade de consultas SQL anal\u00edticas simples.<\/p>\n<p>Al\u00e9m disso, suponha que temos Data Scientists inventivos que est\u00e3o tentando fazer coisas monstruosas com os dados, lidando com dezenas de Terabytes, analisando bilh\u00f5es e trilh\u00f5es de linhas de dados. <\/p>\n<p>Para os dois tipos de carga descritos acima, o Snowflake permite a cria\u00e7\u00e3o de v\u00e1rios clusters de computa\u00e7\u00e3o independentes de diferentes pot\u00eancias. Esses clusters de computa\u00e7\u00e3o funcionam de maneira independente, mas com dados comuns e consistentes.<\/p>\n<p>Para um grande n\u00famero de consultas leves, \u00e9 poss\u00edvel criar 2-3 pequenos clusters, com, digamos, 2 m\u00e1quinas cada. Esse comportamento \u00e9 vi\u00e1vel, inclusive, por meio de configura\u00e7\u00f5es autom\u00e1ticas. Ou seja, voc\u00ea diz: \"Snowflake, levante um pequeno cluster. Se a carga aumentar al\u00e9m de um par\u00e2metro espec\u00edfico, levante um segundo ou terceiro semelhante. Quando a carga diminuir, desligue os extras.\" Assim, independentemente de quantos analistas se apresentem e comecem a olhar os relat\u00f3rios, todos ter\u00e3o recursos suficientes.<\/p>\n<p>Nesse caso, se os analistas estiverem dormindo e ningu\u00e9m estiver olhando os relat\u00f3rios, os clusters podem ser completamente desligados, e voc\u00ea para de pagar por eles.<\/p>\n<p>Para consultas pesadas (dos Data Scientists), voc\u00ea pode levantar um grande cluster com cerca de 32 m\u00e1quinas. Esse cluster tamb\u00e9m ser\u00e1 cobrado apenas pelos minutos e horas em que sua consulta gigante estiver sendo executada.<\/p>\n<p>A possibilidade descrita acima permite dividir em clusters n\u00e3o apenas 2, mas tamb\u00e9m mais tipos de carga (ETL, monitoramento, materializa\u00e7\u00e3o de relat\u00f3rios,...).<\/p>\n<p>Vamos resumir sobre o Snowflake. A base combina uma ideia bonita com uma implementa\u00e7\u00e3o funcional. No ManyChat, usamos o Snowflake para a an\u00e1lise de todos os dados dispon\u00edveis. Temos clusters n\u00e3o tr\u00eas, como no exemplo, mas entre 5 e 9, de tamanhos diferentes. Temos clusters de 16 m\u00e1quinas, de 2 m\u00e1quinas e at\u00e9 super pequenos, com 1 m\u00e1quina para algumas tarefas. Eles distribuem a carga com sucesso e nos permitem economizar significativamente.<\/p>\n<p>A base escala com sucesso a carga de leitura e escrita. Esta \u00e9 uma grande diferen\u00e7a e um grande avan\u00e7o em compara\u00e7\u00e3o com a 'Aurora', que apenas suportava a carga de leitura. O Snowflake permite escalar tamb\u00e9m a carga de escrita com esses clusters computacionais. Ou seja, como mencionei, usamos v\u00e1rios clusters no ManyChat, sendo que os pequenos e super pequenos clusters s\u00e3o usados principalmente para ETL, para carregar dados. E os analistas operam em clusters m\u00e9dios, que n\u00e3o s\u00e3o afetados pela carga de ETL, portanto trabalham muito rapidamente. <\/p>\n<p>Assim, a base \u00e9 bem adequada para tarefas OLAP. No entanto, infelizmente, ainda n\u00e3o \u00e9 aplic\u00e1vel a cargas OLTP. Primeiro, esta base \u00e9 coluna, com todas as consequ\u00eancia que isso traz. Em segundo lugar, essa abordagem, onde se cria um cluster computacional para cada consulta \u00e0 medida que necess\u00e1rio e o alimenta com dados, infelizmente, n\u00e3o \u00e9 r\u00e1pida o suficiente para cargas OLTP. Segundos de espera para tarefas OLAP s\u00e3o aceit\u00e1veis, mas para OLTP, \u00e9 inaceit\u00e1vel, \u00e9 melhor ter 100 ms, e ainda melhor \u2014 10 ms.<\/p>\n<h2>Resultado<\/h2>\n<p>\nA base de dados sem servidor \u00e9 poss\u00edvel devido \u00e0 separa\u00e7\u00e3o da base de dados em partes Stateless e Stateful. Voc\u00ea deve ter notado que em todos os exemplos citados, a parte Stateful \u00e9, por assim dizer, o armazenamento de microparti\u00e7\u00f5es no S3, enquanto a parte Stateless \u00e9 o otimizador, a manipula\u00e7\u00e3o de metadados e o tratamento de quest\u00f5es de seguran\u00e7a, que podem ser levantadas como servi\u00e7os Stateless leves e independentes.<\/p>\n<p>A execu\u00e7\u00e3o de consultas SQL tamb\u00e9m pode ser vista como servi\u00e7os com estado leve, que podem surgir em modo sem servidor, como clusters computacionais do Snowflake, baixar apenas os dados necess\u00e1rios, executar a consulta e 'desligar-se'.<\/p>\n<p>As bases de dados serverless de n\u00edvel de produ\u00e7\u00e3o j\u00e1 est\u00e3o dispon\u00edveis para uso e est\u00e3o operacionais. Essas bases de dados serverless j\u00e1 est\u00e3o prontas para lidar com tarefas OLAP. Infelizmente, para tarefas OLTP, elas s\u00e3o aplicadas... com nuances, uma vez que existem limita\u00e7\u00f5es. Por um lado, isso \u00e9 uma desvantagem. Mas, por outro lado, \u00e9 uma oportunidade. \u00c9 poss\u00edvel que algum dos leitores encontre uma maneira de tornar uma base de dados OLTP completamente serverless, sem as limita\u00e7\u00f5es do Aurora.<\/p>\n<p>Espero que tenha achado interessante. Rumo ao futuro serverless \ud83d\ude42<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/514298\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u0410\u0432\u0438\u0442\u043e \u0438 \u0448\u0435\u0441\u0442\u044c \u043b\u0435\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u043b Data Platform, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438: \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 (Vertica, ClickHouse), \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0438 OLTP (Redis, Tarantool, VoltDB, MongoDB, PostgreSQL). \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0445, \u0438 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043a\u0435\u0439\u0441\u0430\u043c\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91636,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91635","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.\" \/>\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\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem\" \/>\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\u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem\" \/>\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=\"2020-08-15T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-15T17:42:23+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\udd47No caminho para bases de dados sem servidor \u2014 como e por que | ProHoster","description":"Ol\u00e1 a todos! Meu nome \u00e9 Nikolai Golov.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","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\u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","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":"2020-08-15T17:42:23+00:00","article:modified_time":"2020-08-15T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91635","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:23:25","updated":"2022-09-27 17:18:10","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\/91635","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=91635"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/91636"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=91635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=91635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=91635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}