{"id":69568,"date":"2020-02-20T15:24:23","date_gmt":"2020-02-20T12:24:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/google-cloud-spanner-horoshij-plohoj-zloj"},"modified":"2020-03-03T16:14:50","modified_gmt":"2020-03-03T13:14:50","slug":"google-cloud-spanner-horoshij-plohoj-zloj","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: bom, ruim, feio","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Ol\u00e1, comunidade Habr. Tradicionalmente, continuamos a compartilhar material interessante antes do in\u00edcio de novos cursos. Hoje, especialmente para voc\u00eas, traduzimos um artigo sobre o Google Cloud Spanner, em comemora\u00e7\u00e3o ao lan\u00e7amento do curso. <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS para desenvolvedores\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Publicada originalmente em <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">o blog da Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>Como uma empresa que oferece diversas solu\u00e7\u00f5es de POS em nuvem para varejistas, restauradores e vendedores online em todo o mundo, a Lightspeed utiliza v\u00e1rios tipos diferentes de plataformas de bancos de dados para uma variedade de casos de uso transacionais, anal\u00edticos e de pesquisa. Cada uma dessas plataformas de bancos de dados tem seus pontos fortes e fracos. Portanto, quando o Google lan\u00e7ou o Cloud Spanner no mercado \u2014 com recursos promissores nunca vistos no mundo dos bancos de dados relacionais, como escalabilidade horizontal praticamente ilimitada e um SLA de 99,999% \u2014 n\u00e3o poder\u00edamos deixar passar a oportunidade de coloc\u00e1-lo em nossas m\u00e3os!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPara fornecer uma vis\u00e3o abrangente da nossa experi\u00eancia com o Cloud Spanner, bem como dos crit\u00e9rios de avalia\u00e7\u00e3o que utilizamos, abordaremos os seguintes t\u00f3picos:<\/p>\n<ol>\n<li>Nossos crit\u00e9rios de avalia\u00e7\u00e3o<\/li>\n<li>Cloud Spanner em poucas palavras<\/li>\n<li>Nossa avalia\u00e7\u00e3o<\/li>\n<li>Nossas conclus\u00f5es<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. Nossos crit\u00e9rios de avalia\u00e7\u00e3o<\/h2>\n<p>\nAntes de entrarmos nas caracter\u00edsticas do Cloud Spanner, suas semelhan\u00e7as e diferen\u00e7as com outras solu\u00e7\u00f5es no mercado, vamos primeiro falar sobre os principais casos de uso que consideramos ao pensar onde implementar o Cloud Spanner em nossa infraestrutura:<\/p>\n<ul>\n<li>Como substituto da solu\u00e7\u00e3o tradicional de banco de dados SQL<\/li>\n<li>Como uma solu\u00e7\u00e3o OLTP com suporte a OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Nota:<\/b> Para simplicidade e conveni\u00eancia de compara\u00e7\u00e3o, este artigo compara o Cloud Spanner com as op\u00e7\u00f5es MySQL das fam\u00edlias de solu\u00e7\u00f5es GCP Cloud SQL e Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Usando o Cloud Spanner como substituto da solu\u00e7\u00e3o tradicional de banco de dados SQL<\/h4>\n<p>\nEm um ambiente <i>tradicional <\/i>de bancos de dados, quando o tempo de resposta a uma consulta de banco de dados se aproxima ou at\u00e9 mesmo excede os limites pr\u00e9-definidos do aplicativo (principalmente devido ao aumento no n\u00famero de usu\u00e1rios e\/ou consultas), existem v\u00e1rias maneiras de reduzir o tempo de resposta a n\u00edveis aceit\u00e1veis. No entanto, a maioria dessas solu\u00e7\u00f5es envolve interven\u00e7\u00e3o manual.<\/p>\n<p>Por exemplo, o primeiro passo a ser feito \u00e9 analisar os diferentes par\u00e2metros do banco de dados relacionados ao desempenho e ajust\u00e1-los para que se adequem melhor aos padr\u00f5es de uso dos aplicativos. Se isso n\u00e3o for suficiente, pode-se optar por escalar o banco de dados vertical ou horizontalmente.<\/p>\n<p>A escalabilidade vertical de um aplicativo envolve a atualiza\u00e7\u00e3o da inst\u00e2ncia do servidor, geralmente adicionando mais processadores\/n\u00facleos, mais mem\u00f3ria RAM, armazenamento mais r\u00e1pido, etc. A adi\u00e7\u00e3o de mais recursos de hardware resulta em um aumento do desempenho do banco de dados, medido principalmente em transa\u00e7\u00f5es por segundo e na lat\u00eancia das transa\u00e7\u00f5es para sistemas OLTP. Sistemas de bancos de dados relacionais (que utilizam uma abordagem multithreading), como o MySQL, escalam bem verticalmente.<\/p>\n<p>Essa abordagem tem algumas desvantagens, mas a mais \u00f3bvia \u00e9 o limite m\u00e1ximo do tamanho do servidor no mercado. Uma vez alcan\u00e7ado o limite da maior inst\u00e2ncia do servidor, s\u00f3 resta um caminho: a escalabilidade horizontal.<\/p>\n<p>A escalabilidade horizontal \u00e9 uma abordagem em que mais servidores s\u00e3o adicionados ao cluster, idealmente aumentando a performance linearmente com o aumento do n\u00famero de servidores. A maioria <i>tradicional <\/i>dos sistemas de bancos de dados escalonam mal horizontalmente ou n\u00e3o escalonam de forma alguma. Por exemplo, o MySQL pode escalar horizontalmente para opera\u00e7\u00f5es de leitura, adicionando leitores escravo, mas n\u00e3o consegue escalar horizontalmente para opera\u00e7\u00f5es de grava\u00e7\u00e3o.<\/p>\n<p>Por outro lado, devido \u00e0 sua natureza, o Cloud Spanner pode escalar facilmente horizontalmente com m\u00ednima interven\u00e7\u00e3o.<\/p>\n<p>Banco de dados completo<i> como servi\u00e7o<\/i> deve ser avaliado sob diferentes perspectivas. Como base, utilizamos o banco de dados em nuvem mais popular \u2014 para o Google, GCP Cloud SQL e para a Amazon, AWS RDS. Em nossa avalia\u00e7\u00e3o, focamos nas seguintes categorias:<\/p>\n<ul>\n<li>Compara\u00e7\u00e3o de funcionalidades: extens\u00e3o SQL, DDL, DML; bibliotecas de conex\u00e3o\/conectores, suporte a transa\u00e7\u00f5es e assim por diante.<\/li>\n<li>Suporte ao desenvolvimento: facilidade de desenvolvimento e testes.<\/li>\n<li>Suporte para administra\u00e7\u00e3o: gerenciamento de inst\u00e2ncias \u2014 por exemplo, escalonamento para cima\/para baixo e atualiza\u00e7\u00e3o de inst\u00e2ncias; SLA, backup e recupera\u00e7\u00e3o; seguran\u00e7a\/controle de acesso.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Uso do Cloud Spanner como solu\u00e7\u00e3o OLTP com suporte a OLAP<\/h4>\n<p>\nEmbora o Google n\u00e3o afirme explicitamente que o Cloud Spanner \u00e9 destinado ao processamento anal\u00edtico, ele compartilha alguns atributos com outros mecanismos, como Apache Impala &amp; Kudu e YugaByte, que s\u00e3o projetados para cargas de trabalho OLAP.<\/p>\n<p>Mesmo que houvesse apenas uma pequena chance de que o Cloud Spanner incorporasse um mecanismo HTAP escal\u00e1vel horizontalmente consistente (processamento h\u00edbrido transacional\/anal\u00edtico) com um conjunto de fun\u00e7\u00f5es OLAP mais ou menos utiliz\u00e1vel, acreditamos que isso mereceria nossa aten\u00e7\u00e3o.<\/p>\n<p>Tendo isso em mente, consideramos as seguintes categorias:<\/p>\n<ul>\n<li>Carregamento de dados, \u00edndices e suporte a particionamento<\/li>\n<li>Desempenho de consultas e DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner em poucas palavras<\/h2>\n<p>\nGoogle Spanner \u00e9 um sistema de gerenciamento de banco de dados relacional em cluster (SGBDR) que o Google usa para v\u00e1rios de seus pr\u00f3prios servi\u00e7os. O Google o tornou p\u00fablico para os usu\u00e1rios da Google Cloud Platform no in\u00edcio de 2017.<\/p>\n<p>Aqui est\u00e3o alguns dos atributos do Cloud Spanner:<\/p>\n<ul>\n<li>Cluster SGBDR escalon\u00e1vel altamente consistente: utiliza sincroniza\u00e7\u00e3o de hardware de tempo para garantir a consist\u00eancia dos dados.<\/li>\n<li>Suporte a transa\u00e7\u00f5es entre tabelas: transa\u00e7\u00f5es podem abranger v\u00e1rias tabelas \u2014 n\u00e3o se limitando a uma \u00fanica tabela (diferente do Apache HBase ou Apache Kudu).<\/li>\n<li>Tabelas baseadas em chave prim\u00e1ria: todas as tabelas devem ter uma chave prim\u00e1ria (PK) declarada, que pode consistir em v\u00e1rias colunas da tabela. Os dados da tabela s\u00e3o armazenados na ordem da PK, o que os torna muito eficientes e r\u00e1pidos para pesquisa por PK. Assim como outros sistemas baseados em PK, a implementa\u00e7\u00e3o deve ser modelada levando em considera\u00e7\u00e3o casos de uso previamente definidos para alcan\u00e7ar <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">o melhor desempenho<\/a><\/noindex>.<\/li>\n<li>Tabelas intercaladas: as tabelas podem ter depend\u00eancias f\u00edsicas entre si. As linhas da tabela filha podem ser correspondidas com as linhas da tabela pai. Essa abordagem acelera a busca por relacionamentos que podem ser definidos na fase de modelagem de dados, como no caso de co-localiza\u00e7\u00e3o de clientes e suas faturas.<\/li>\n<li>\u00cdndices: o Cloud Spanner suporta \u00edndices secund\u00e1rios. Um \u00edndice consiste em colunas indexadas e todas as colunas da chave prim\u00e1ria. Opcionalmente, o \u00edndice tamb\u00e9m pode conter outras colunas n\u00e3o indexadas. O \u00edndice pode se intercalar com a tabela pai para acelerar as consultas. Existem v\u00e1rias restri\u00e7\u00f5es aplic\u00e1veis aos \u00edndices, como o n\u00famero m\u00e1ximo de colunas adicionais armazenadas no \u00edndice. Al\u00e9m disso, as consultas por meio de \u00edndices podem n\u00e3o ser t\u00e3o diretas quanto em outros SGBDs.<\/li>\n<\/ul>\n<p>\n<i>O Cloud Spanner escolhe o \u00edndice automaticamente apenas em casos raros. Em particular, o Cloud Spanner n\u00e3o escolhe um \u00edndice secund\u00e1rio automaticamente se a consulta solicitar quaisquer colunas que n\u00e3o estejam salvas no <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">\u00edndice <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Acordo de N\u00edvel de Servi\u00e7o (SLA): implanta\u00e7\u00e3o em uma \u00fanica regi\u00e3o com SLA de 99,99%; implanta\u00e7\u00f5es multirregionais com SLA de 99,999%. Embora o pr\u00f3prio acordo de n\u00edvel de servi\u00e7o seja apenas um acordo, e n\u00e3o uma garantia, acredito que os funcion\u00e1rios do Google realmente tenham dados precisos para fazer uma afirma\u00e7\u00e3o t\u00e3o s\u00e9ria. (Para refer\u00eancia, 99,999% significa 26,3 segundos de indisponibilidade do servi\u00e7o por m\u00eas.)<\/li>\n<li>Mais: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/\">https:\/\/cloud.google.com\/spanner\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Nota:<\/b> O projeto Apache Tephra adiciona suporte avan\u00e7ado a transa\u00e7\u00f5es no Apache HBase (agora tamb\u00e9m implementado no Apache Phoenix como beta).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. Nossa avalia\u00e7\u00e3o<\/h2>\n<p>\nEnt\u00e3o, todos n\u00f3s lemos as alega\u00e7\u00f5es do Google sobre as vantagens do Cloud Spanner \u2014 escalabilidade horizontal praticamente ilimitada mantendo alta consist\u00eancia e um SLA muito alto. Embora esses requisitos sejam de fato extremamente dif\u00edceis de alcan\u00e7ar, nosso objetivo n\u00e3o \u00e9 refut\u00e1-los. Em vez disso, vamos nos concentrar em outras quest\u00f5es que preocupam a maioria dos usu\u00e1rios de bancos de dados: paridade e facilidade de uso.<\/p>\n<h4>N\u00f3s avaliamos o Cloud Spanner como uma substitui\u00e7\u00e3o do Sharded MySQL<\/h4>\n<p>\nGoogle Cloud SQL e Amazon AWS RDS, que s\u00e3o os dois sistemas de gerenciamento de banco de dados OLTP mais populares no mercado de nuvem, possuem um conjunto muito abrangente de recursos. No entanto, para escalar esses bancos de dados al\u00e9m do tamanho de um \u00fanico n\u00f3, voc\u00ea precisar\u00e1 implementar a segmenta\u00e7\u00e3o das aplica\u00e7\u00f5es. Essa abordagem cria complexidade adicional tanto para as aplica\u00e7\u00f5es quanto para a administra\u00e7\u00e3o. Analisamos como o Spanner se encaixa no cen\u00e1rio de unir m\u00faltiplos segmentos em uma \u00fanica inst\u00e2ncia e quais recursos (se existirem) podem precisar ser sacrificados.<\/p>\n<h4>Suporte a SQL, DML e DDL, al\u00e9m de conector e bibliotecas?<\/h4>\n<p>\nPrimeiramente, ao iniciar com qualquer banco de dados, \u00e9 necess\u00e1rio criar um modelo de dados. Se voc\u00ea acha que pode conectar o JDBC Spanner ao seu instrumento SQL favorito, descobrir\u00e1 que pode consultar seus dados por meio dele, mas n\u00e3o pode utiliz\u00e1-lo para criar tabelas ou realizar altera\u00e7\u00f5es (DDL) ou qualquer opera\u00e7\u00e3o de inser\u00e7\u00e3o\/atualiza\u00e7\u00e3o\/exclus\u00e3o (DML). O JDBC oficial do Google n\u00e3o suporta nenhuma das duas.<\/p>\n<blockquote><p><i>\u00abAtualmente, os drivers n\u00e3o suportam operadores DML ou DDL\u00bb.<\/i><br \/>\nDocumenta\u00e7\u00e3o do Spanner<\/p><\/blockquote>\n<p>\nCom o console GCP a situa\u00e7\u00e3o n\u00e3o \u00e9 melhor \u2014 voc\u00ea pode enviar apenas consultas SELECT. Felizmente, existe um driver JDBC com suporte a DML e DDL da comunidade, incluindo transa\u00e7\u00f5es. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. Embora este driver seja extremamente \u00fatil, a falta de um driver JDBC pr\u00f3prio do Google \u00e9 surpreendente. Felizmente, o Google oferece suporte bastante amplo a bibliotecas de clientes (com base em gRPC): C#, Go, Java, node.js, PHP, Python e Ruby.<\/p>\n<p>O uso praticamente obrigat\u00f3rio de APIs personalizadas do Cloud Spanner (devido \u00e0 falta de DDL e DML no JDBC) resulta em algumas limita\u00e7\u00f5es para \u00e1reas de c\u00f3digo relacionadas, como pools de conex\u00f5es ou frameworks de vincula\u00e7\u00e3o de banco de dados (por exemplo, Spring MVC). Geralmente, ao usar JDBC, voc\u00ea pode escolher livremente seu pool de conex\u00f5es favorito (por exemplo, HikariCP, DBCP, C3PO, etc.), que \u00e9 testado e funciona bem. No caso de APIs personalizadas do Spanner, devemos confiar em frameworks\/pools de vincula\u00e7\u00e3o\/sess\u00f5es que criamos n\u00f3s mesmos.<\/p>\n<p>A constru\u00e7\u00e3o orientada a chave prim\u00e1ria (PK) permite que o Cloud Spanner seja extremamente r\u00e1pido ao acessar dados atrav\u00e9s da PK, mas tamb\u00e9m traz alguns problemas com consultas.<\/p>\n<ul>\n<li>Voc\u00ea n\u00e3o pode atualizar o valor da chave prim\u00e1ria; voc\u00ea deve primeiro excluir o registro com a PK original e inseri-lo novamente com o novo valor. (Isso \u00e9 semelhante a outros bancos de dados\/mecanismos de armazenamento orientados a PK.)<\/li>\n<li>Qualquer comando UPDATE e DELETE deve especificar a PK na cl\u00e1usula WHERE, portanto, n\u00e3o pode haver comandos DELETE vazios \u2014 sempre deve haver uma subconsulta, por exemplo: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>A aus\u00eancia de uma op\u00e7\u00e3o de auto-incremento ou algo similar que defina a sequ\u00eancia para o campo PK. Para que isso funcione, o valor correspondente deve ser gerado no lado do aplicativo.<\/li>\n<\/ul>\n<p><\/p>\n<h4>\u00cdndices secund\u00e1rios?<\/h4>\n<p>\nO Google Cloud Spanner tem suporte integrado a \u00edndices secund\u00e1rios. Esta \u00e9 uma funcionalidade muito interessante, que nem sempre est\u00e1 presente em outras tecnologias. Apache Kudu atualmente n\u00e3o suporta \u00edndices secund\u00e1rios, enquanto o Apache HBase n\u00e3o suporta \u00edndices diretamente, mas pode adicion\u00e1-los atrav\u00e9s do Apache Phoenix.<\/p>\n<p>Os \u00edndices em Kudu e HBase podem ser modelados como uma tabela separada com um conjunto diferente de chaves prim\u00e1rias, mas a atomicidade das opera\u00e7\u00f5es realizadas com a tabela pai e as tabelas de \u00edndice associadas deve ser tratada no n\u00edvel do aplicativo e n\u00e3o \u00e9 trivial em uma implementa\u00e7\u00e3o correta.<\/p>\n<p>Como mencionado na revis\u00e3o do Cloud Spanner, seus \u00edndices podem ser diferentes dos \u00edndices do MySQL. Portanto, deve-se ter especial cuidado ao construir consultas e profil\u00e1-las, para garantir o uso do \u00edndice adequado onde necess\u00e1rio.<\/p>\n<h4>Vis\u00f5es?<\/h4>\n<p>\nUm objeto muito popular e \u00fatil em bancos de dados s\u00e3o as vis\u00f5es. Elas podem ser \u00fateis para uma grande variedade de casos de uso; meus dois favoritos s\u00e3o o n\u00edvel de abstra\u00e7\u00e3o l\u00f3gica e o n\u00edvel de seguran\u00e7a. Infelizmente, o Cloud Spanner N\u00c3O suporta vis\u00f5es. No entanto, isso nos limita apenas em parte, pois n\u00e3o h\u00e1 detalhamento de permiss\u00f5es de acesso no n\u00edvel de coluna, onde vis\u00f5es podem ser uma solu\u00e7\u00e3o aceit\u00e1vel.<\/p>\n<p>Na documenta\u00e7\u00e3o do Cloud Spanner, na se\u00e7\u00e3o que descreve quotas e limita\u00e7\u00f5es (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), h\u00e1 uma, em particular, que pode ser problem\u00e1tica para algumas aplica\u00e7\u00f5es: o Cloud Spanner, por padr\u00e3o, tem um limite de no m\u00e1ximo 100 bancos de dados por inst\u00e2ncia. \u00c9 evidente que isso pode se tornar um s\u00e9rio obst\u00e1culo para um banco de dados projetado para escalar para mais de 100 bancos de dados. Felizmente, ap\u00f3s conversar com nosso representante t\u00e9cnico da Google, descobrimos que esse limite pode ser aumentado praticamente para qualquer valor por meio do suporte da Google.<\/p>\n<h4>Suporte ao desenvolvimento?<\/h4>\n<p>\nO Cloud Spanner oferece um suporte bastante decente para linguagens de programa\u00e7\u00e3o que trabalham com sua API. As bibliotecas oficialmente suportadas est\u00e3o nas \u00e1reas de C#, Go, Java, node.js, PHP, Python e Ruby. A documenta\u00e7\u00e3o \u00e9 suficientemente detalhada, mas, assim como em outras tecnologias de ponta, a comunidade \u00e9 bastante pequena em compara\u00e7\u00e3o com as tecnologias de banco de dados mais populares, o que pode levar a um aumento no tempo gasto em resolver casos de uso ou problemas menos comuns.<\/p>\n<h4>E quanto ao suporte ao desenvolvimento local?<\/h4>\n<p>\nN\u00e3o encontramos uma maneira de criar uma inst\u00e2ncia do Cloud Spanner em um ambiente local. O mais pr\u00f3ximo que conseguimos foi uma imagem Docker. <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, que, em princ\u00edpio, \u00e9 semelhante, mas na pr\u00e1tica \u00e9 bastante diferente. Por exemplo, o CockroachDB pode utilizar o PostgreSQL JDBC. Visto que o ambiente de desenvolvimento deve ser o mais pr\u00f3ximo poss\u00edvel do ambiente de produ\u00e7\u00e3o, o Cloud Spanner n\u00e3o \u00e9 ideal, pois \u00e9 necess\u00e1rio depender de uma inst\u00e2ncia completa do Spanner. Para economizar custos, voc\u00ea pode optar por uma inst\u00e2ncia para uma \u00fanica regi\u00e3o.<\/p>\n<h4>Suporte \u00e0 administra\u00e7\u00e3o?<\/h4>\n<p>\nCriar uma inst\u00e2ncia do Cloud Spanner \u00e9 muito simples. Basta escolher entre criar uma inst\u00e2ncia multirregional ou para uma \u00fanica regi\u00e3o, especificar a(s) regi\u00e3o(\u00f5es) e o n\u00famero de n\u00f3s. Em menos de um minuto, a inst\u00e2ncia estar\u00e1 em funcionamento e pronta para uso.<\/p>\n<p>V\u00e1rias m\u00e9tricas b\u00e1sicas est\u00e3o dispon\u00edveis diretamente na p\u00e1gina do Spanner no console da Google. Visualiza\u00e7\u00f5es mais detalhadas est\u00e3o dispon\u00edveis atrav\u00e9s do Stackdriver, onde voc\u00ea tamb\u00e9m pode estabelecer limites para m\u00e9tricas e pol\u00edticas de alerta.<\/p>\n<h4>Acesso aos recursos?<\/h4>\n<p>\nMySQL oferece configura\u00e7\u00f5es de permiss\u00f5es e pap\u00e9is de usu\u00e1rios profundas e detalhadas. \u00c9 f\u00e1cil configurar o acesso a uma tabela espec\u00edfica ou at\u00e9 mesmo a um subconjunto de suas colunas. O Cloud Spanner utiliza a ferramenta Google Identity &amp; Access Management (IAM), que permite estabelecer pol\u00edticas e permiss\u00f5es apenas em um n\u00edvel muito alto. A op\u00e7\u00e3o mais detalhada \u00e9 a permiss\u00e3o no n\u00edvel do banco de dados, que n\u00e3o se encaixa na maioria dos casos de produ\u00e7\u00e3o. Essa limita\u00e7\u00e3o obriga voc\u00ea a adicionar medidas de seguran\u00e7a adicionais ao seu c\u00f3digo, infraestrutura ou a ambos para evitar o uso n\u00e3o autorizado dos recursos do Spanner.<\/p>\n<h4>Backups?<\/h4>\n<p>\nFalando de forma simples, n\u00e3o existem backups no Cloud Spanner. Embora as rigorosas exig\u00eancias do SLA do Google possam garantir que voc\u00ea n\u00e3o perca nenhum dado devido a falhas de hardware ou do banco de dados, erros humanos, defeitos de aplicativos, etc. Todos n\u00f3s conhecemos a regra: alta disponibilidade n\u00e3o substitui uma estrat\u00e9gia de backup sensata. At\u00e9 agora, a \u00fanica maneira de fazer backup dos dados \u00e9 transmiti-los programaticamente do banco de dados para um ambiente de armazenamento separado.<\/p>\n<h4>Desempenho de consultas?<\/h4>\n<p>\nPara carregar dados e testar consultas, usamos o Yahoo! Cloud Serving Benchmark. A tabela abaixo apresenta a carga de trabalho B do YCSB com uma propor\u00e7\u00e3o de leitura de 95% e escrita de 5%.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* O teste de carga foi realizado em um Google Compute Engine (CE) n1-standard-32 (32 vCPUs, 120 GB de mem\u00f3ria), e a inst\u00e2ncia de teste nunca foi um gargalo nos testes.<\/i><br \/>\n<i>** O n\u00famero m\u00e1ximo de threads em uma inst\u00e2ncia do YCSB \u00e9 de 400. Foi necess\u00e1rio executar seis inst\u00e2ncias paralelas dos testes do YCSB para obter um total de 2400 threads.<\/i><\/p>\n<p>Observando os resultados dos testes, especialmente a combina\u00e7\u00e3o de carga na CPU e TPS, vemos claramente que o Cloud Spanner se escala muito bem. A alta carga gerada por um grande n\u00famero de threads \u00e9 compensada por um maior n\u00famero de n\u00f3s no cluster do Cloud Spanner. Embora a lat\u00eancia pare\u00e7a bastante alta, especialmente ao trabalhar com 2400 threads, testes adicionais com 6 inst\u00e2ncias menores do mecanismo computacional podem ser necess\u00e1rios para obter n\u00fameros mais precisos. Cada inst\u00e2ncia executar\u00e1 um teste YCSB em vez de uma \u00fanica grande inst\u00e2ncia CE com 6 testes em paralelo. Dessa forma, ser\u00e1 mais f\u00e1cil distinguir entre as lat\u00eancias de solicita\u00e7\u00e3o do Cloud Spanner e as lat\u00eancias introduzidas pela conex\u00e3o de rede entre o Cloud Spanner e a inst\u00e2ncia CE onde o teste \u00e9 executado.<\/p>\n<h3>Como o Cloud Spanner se sai como OLAP?<\/h3>\n<p><\/p>\n<h4>Particionamento?<\/h4>\n<p>\nDividir dados em segmentos f\u00edsicos e\/ou logicamente independentes, chamados de parti\u00e7\u00f5es, \u00e9 um conceito muito popular presente na maioria dos mecanismos OLAP. As parti\u00e7\u00f5es podem melhorar significativamente o desempenho das consultas e a manuten\u00e7\u00e3o do banco de dados. Um aprofundamento adicional nas parti\u00e7\u00f5es exigiria um artigo (ou artigos) separado(s), por isso vamos apenas mencionar a import\u00e2ncia de ter um esquema de particionamento e subparticionamento. A capacidade de dividir dados em parti\u00e7\u00f5es e at\u00e9 mesmo em subparti\u00e7\u00f5es \u00e9 fundamental para o desempenho das consultas anal\u00edticas.<\/p>\n<p>O Cloud Spanner n\u00e3o suporta parti\u00e7\u00f5es como tais. Ele divide os dados internamente em chamadas <i>split<\/i>-s com base em intervalos de chave prim\u00e1ria. A divis\u00e3o \u00e9 feita automaticamente para balancear a carga no cluster do Cloud Spanner. Uma fun\u00e7\u00e3o muito conveniente do Cloud Spanner \u00e9 a divis\u00e3o da carga base da tabela pai (a tabela que n\u00e3o \u00e9 alternada por outra). O Spanner identifica automaticamente se <i>split <\/i>os dados s\u00e3o lidos com mais frequ\u00eancia do que os dados em outras <i>split<\/i>-s e pode decidir sobre uma nova divis\u00e3o. Assim, mais n\u00f3s podem ser envolvidos na consulta, aumentando efetivamente a largura de banda.<\/p>\n<h4>Carga de dados?<\/h4>\n<p>\nO m\u00e9todo Cloud Spanner para grandes volumes de dados \u00e9 o mesmo que para um carregamento normal. Para alcan\u00e7ar o m\u00e1ximo desempenho, voc\u00ea deve seguir algumas recomenda\u00e7\u00f5es, incluindo:<\/p>\n<ul>\n<li>Classifique seus dados pela chave prim\u00e1ria.<\/li>\n<li>Divida-os em 10*<i>n\u00f3s distintos.<\/i> se\u00e7\u00f5es separadas.<\/li>\n<li>Crie um conjunto de tarefas de trabalho que carreguem dados em paralelo.<\/li>\n<\/ul>\n<p>\nCom esse tipo de carregamento de dados, todos os n\u00f3s do Cloud Spanner s\u00e3o utilizados.<\/p>\n<p>Utilizamos a carga de trabalho A YCSB para gerar um conjunto de dados de 10M de linhas.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* O teste de carga foi realizado em uma inst\u00e2ncia n1-standard-32 (32 vCPUs, 120 GB de RAM), e a inst\u00e2ncia de teste nunca foi um gargalo nos testes.<br \/>\n** A configura\u00e7\u00e3o de 1 n\u00f3 n\u00e3o \u00e9 recomendada para qualquer carga de produ\u00e7\u00e3o.<\/i><\/p>\n<p>Como mencionado anteriormente, o Cloud Spanner lida automaticamente com divis\u00f5es com base em sua carga, portanto, os resultados melhoram ap\u00f3s v\u00e1rias execu\u00e7\u00f5es consecutivas do teste. Os resultados apresentados aqui s\u00e3o os melhores que obtivemos. Observando os n\u00fameros acima, podemos ver como o Cloud Spanner (bem) escala com o aumento do n\u00famero de n\u00f3s no cluster. Os n\u00fameros que se destacam representam m\u00e9dias de lat\u00eancia extremamente baixas, que contrastam com os resultados de cargas de trabalho mistas (95% leitura e 5% grava\u00e7\u00e3o), conforme descrito na se\u00e7\u00e3o acima.<\/p>\n<h4>Escalonamento?<\/h4>\n<p>\nAumentar e diminuir o n\u00famero de n\u00f3s do Cloud Spanner \u00e9 uma tarefa realizada com um clique. Se voc\u00ea deseja carregar dados rapidamente, pode considerar aumentar a inst\u00e2ncia ao m\u00e1ximo (no nosso caso, foram 25 n\u00f3s na regi\u00e3o US-EAST), e depois reduzir o n\u00famero de n\u00f3s adequado para sua carga normal, ap\u00f3s todos os dados estarem no banco de dados, considerando o limite de 2 TB\/n\u00f3.<\/p>\n<p>Fomos lembrados desse limite mesmo com um banco de dados muito menor. Ap\u00f3s v\u00e1rias execu\u00e7\u00f5es de testes de carga, nosso banco de dados tinha cerca de 155 GB, e ao reduzir para uma inst\u00e2ncia de 1 n\u00f3, recebemos o seguinte erro:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nConseguimos diminuir o scale de 25 para 2 inst\u00e2ncias, mas ficamos presos em dois n\u00f3s.<\/p>\n<p>Aumentar e diminuir o n\u00famero de n\u00f3s no cluster Cloud Spanner pode ser automatizado atrav\u00e9s da REST API. Isso pode ser especialmente \u00fatil para aliviar a carga elevada no sistema durante hor\u00e1rios de pico.<\/p>\n<h4>Desempenho de consultas OLAP?<\/h4>\n<p>\nInicialmente, planejamos dedicar um tempo consider\u00e1vel \u00e0 nossa avalia\u00e7\u00e3o do Spanner nessa parte. Ap\u00f3s algumas consultas SELECT COUNT, percebemos imediatamente que o teste seria breve e que o Spanner N\u00c3O seria adequado como motor OLAP. Independentemente do n\u00famero de n\u00f3s no cluster, a simples consulta da contagem de linhas em uma tabela de 10M de linhas levou de 55 a 60 segundos. Al\u00e9m disso, qualquer consulta que exigisse mais mem\u00f3ria para armazenar resultados intermedi\u00e1rios falhou com erro OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M valores distintos) -&gt; SpoolingHashAggregateIterator ficou sem mem\u00f3ria durante nova linha.<\/code><\/p>\n<p>Alguns n\u00fameros para consultas TPC-H podem ser encontrados no artigo de Todd Lipkon <noindex><a rel=\"nofollow\" href=\"https:\/\/kudu.apache.org\/2017\/10\/23\/nosql-kudu-spanner-slides.html\">Nosql-kudu-spanner-slides.html<\/a><\/noindex>, slides 42 e 43. Esses n\u00fameros est\u00e3o em conformidade com nossos pr\u00f3prios resultados (infelizmente).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bom, ruim, feio\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Nossas conclus\u00f5es<\/h4>\n<p>\nDada a condi\u00e7\u00e3o atual dos recursos do Cloud Spanner, \u00e9 dif\u00edcil imaginar sua simples substitui\u00e7\u00e3o por uma solu\u00e7\u00e3o OLTP existente, especialmente quando suas necessidades superarem as dele. Seria necess\u00e1rio gastar um tempo consider\u00e1vel para construir uma solu\u00e7\u00e3o que levasse em conta as defici\u00eancias do Cloud Spanner.<\/p>\n<p>Quando come\u00e7amos a avaliar o Cloud Spanner, esper\u00e1vamos que suas funcionalidades de gerenciamento estivessem \u00e0 altura ou, pelo menos, n\u00e3o muito distantes de outras solu\u00e7\u00f5es Google SQL. Mas ficamos surpresos com a total falta de backups e controle de acesso muito limitado aos recursos. Sem falar na aus\u00eancia de visualiza\u00e7\u00f5es, falta de ambiente de desenvolvimento local, sequ\u00eancias n\u00e3o suportadas, JDBC sem suporte a DML e DDL e assim por diante.<\/p>\n<p>Ent\u00e3o, para onde ir para quem precisa escalar um banco de dados transacional? Parece que, no mercado, ainda n\u00e3o h\u00e1 uma \u00fanica solu\u00e7\u00e3o que sirva para todos os casos de uso. Existem v\u00e1rias solu\u00e7\u00f5es de c\u00f3digo fechado e aberto (algumas das quais s\u00e3o mencionadas neste artigo), cada uma com seus pontos fortes e fracos, mas nenhuma delas oferece um SaaS com SLA de 99,999% e alta consist\u00eancia. Se um alto n\u00edvel de SLA \u00e9 seu principal objetivo, e voc\u00ea n\u00e3o est\u00e1 inclinado a construir sua pr\u00f3pria solu\u00e7\u00e3o para m\u00faltiplos ambientes de nuvem, o Cloud Spanner pode ser a solu\u00e7\u00e3o que voc\u00ea procura. Mas voc\u00ea deve estar ciente de todas as suas limita\u00e7\u00f5es.<\/p>\n<p>Para ser justo, deve-se notar que o Cloud Spanner foi lan\u00e7ado para acesso p\u00fablico apenas na primavera de 2017, ent\u00e3o \u00e9 razo\u00e1vel esperar que algumas de suas atuais desvantagens possam eventualmente desaparecer (tomara), e quando isso acontecer, isso pode mudar o jogo. Afinal, o Cloud Spanner n\u00e3o \u00e9 apenas um projeto de terceiro para o Google. O Google o utiliza como base para outros produtos do Google. E quando o Google recentemente substituiu o Megastore no Google Cloud Storage pelo Cloud Spanner, isso permitiu que o Google Cloud Storage se tornasse estritamente consistente para listagens de objetos em escala global (o que ainda n\u00e3o se aplica ao <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">Amazon\u2019s<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">S3<\/a><\/noindex>).<\/p>\n<p>Ent\u00e3o, ainda h\u00e1 esperan\u00e7a... n\u00f3s tamb\u00e9m esperamos.<\/p>\n<p>E \u00e9 tudo por agora. Assim como o autor do artigo, n\u00f3s tamb\u00e9m continuamos a ter esperan\u00e7as, e o que voc\u00ea pensa sobre isso? Deixe um coment\u00e1rio<\/p>\n<p><b>Todos est\u00e3o convidados a visitar nosso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">webinar gratuito<\/a><\/noindex> onde detalharemos o curso<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS para desenvolvedores\u00bb<\/a><\/noindex> da OTUS.<\/b><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/489012\/\">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. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u044b \u043f\u0440\u0435\u0432\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043e Google Cloud Spanner, \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0438\u0432 \u0435\u0435 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u0443\u0440\u0441\u0430 \u00abAWS \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\u00bb. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 Lightspeed HQ. \u041a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 POS-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u0446\u0435\u0432, \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, Lightspeed \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69569,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69568","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=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\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\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\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\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | 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. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\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-02-20T12:24:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:50+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\udd47Google Cloud Spanner: bom, mau, feio | ProHoster","description":"Ol\u00e1, comunidade do Habra. Tradicionalmente, continuamos a compartilhar material interessante na v\u00e9spera do in\u00edcio de novos cursos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","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\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","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-02-20T12:24:23+00:00","article:modified_time":"2020-03-03T13:14:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69568","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 19:20:25","updated":"2022-09-30 15:10:07","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\/69568","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=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}