{"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\/sv\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: bra, d\u00e5lig, ful","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Hej, Habr-anv\u00e4ndare. Traditionellt forts\u00e4tter vi att dela intressant material inf\u00f6r starten av nya kurser. Idag har vi s\u00e4rskilt \u00f6versatt en artikel om Google Cloud Spanner, i samband med lanseringen av kursen. <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS f\u00f6r utvecklare\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ursprungligen publicerad i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">Lightspeed HQ-bloggen<\/a><\/noindex>.<\/i><\/p>\n<p>Som ett f\u00f6retag som erbjuder m\u00e5nga molnbaserade POS-l\u00f6sningar f\u00f6r detaljhandlare, restauranger och onlinehandlare \u00f6ver hela v\u00e4rlden, anv\u00e4nder Lightspeed flera olika typer av databaser f\u00f6r olika transaktions-, analytiska och s\u00f6kfall. Varje databasplattform har sina egna styrkor och svagheter. N\u00e4r Google d\u00e4rf\u00f6r introducerade Cloud Spanner p\u00e5 marknaden \u2014 med lovande funktioner som aldrig tidigare sk\u00e5dade inom relationsdatabaser, s\u00e5som praktiskt taget obegr\u00e4nsad horisontell skalbarhet och 99,999% serviceniv\u00e5avtal (SLA) \u2014 kunde vi inte missa chansen att f\u00e5 den i v\u00e5ra h\u00e4nder!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nF\u00f6r att ge en utt\u00f6mmande \u00f6versikt \u00f6ver v\u00e5ra erfarenheter med Cloud Spanner samt de bed\u00f6mningskriterier vi anv\u00e4nde, kommer vi att behandla f\u00f6ljande \u00e4mnen:<\/p>\n<ol>\n<li>V\u00e5ra bed\u00f6mningskriterier<\/li>\n<li>Cloud Spanner i korthet<\/li>\n<li>V\u00e5r bed\u00f6mning<\/li>\n<li>V\u00e5ra slutsatser<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. V\u00e5ra bed\u00f6mningskriterier<\/h2>\n<p>\nInnan vi g\u00e5r in p\u00e5 egenskaperna hos Cloud Spanner, dess likheter och skillnader med andra l\u00f6sningar p\u00e5 marknaden, l\u00e5t oss f\u00f6rst diskutera de huvudsakliga anv\u00e4ndningsfallen som vi beaktade n\u00e4r vi \u00f6verv\u00e4gde var Cloud Spanner skulle implementeras i v\u00e5r infrastruktur:<\/p>\n<ul>\n<li>Som en ers\u00e4ttning f\u00f6r det dominerande traditionella SQL-databassystemet<\/li>\n<li>Som en OLTP-l\u00f6sning med st\u00f6d f\u00f6r OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Anm\u00e4rkning:<\/b> F\u00f6r att f\u00f6renkla och j\u00e4mf\u00f6ra, j\u00e4mf\u00f6r denna artikel Cloud Spanner med MySQL-alternativen i GCP Cloud SQL och Amazon AWS RDS-familjerna.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Anv\u00e4ndning av Cloud Spanner som ers\u00e4ttning f\u00f6r traditionella SQL-databassystem<\/h4>\n<p>\nI en milj\u00f6 <i>av traditionella <\/i>databaser, n\u00e4r svarstiden f\u00f6r databasfr\u00e5gor n\u00e4rmar sig eller till och med \u00f6verstiger f\u00f6rdefinierade tr\u00f6skelv\u00e4rden f\u00f6r applikationen (oftast p\u00e5 grund av \u00f6kat antal anv\u00e4ndare och\/eller fr\u00e5gor), finns det flera s\u00e4tt att s\u00e4nka svarstiden till acceptabla niv\u00e5er. Men de flesta av dessa l\u00f6sningar involverar manuell inblandning.<\/p>\n<p>Till exempel, det f\u00f6rsta steget att ta \u00e4r att titta p\u00e5 de olika databasparametrarna relaterade till prestanda och justera dem f\u00f6r att b\u00e4st matcha anv\u00e4ndningsm\u00f6nstren f\u00f6r applikationerna. Om detta visar sig vara otillr\u00e4ckligt kan man v\u00e4lja att skala databasen vertikalt eller horisontellt.<\/p>\n<p>Vertikal skalning av applikationen inneb\u00e4r att man uppgraderar serverinstansen, vanligtvis genom att l\u00e4gga till fler processorer\/k\u00e4rnor, mer RAM, snabbare lagring osv. Att l\u00e4gga till fler h\u00e5rdvaruresurser ledar till \u00f6kad databaspresentation, m\u00e4tt i stort sett i transaktioner per sekund och transaktionsf\u00f6rdr\u00f6jning f\u00f6r OLTP-system. Relationsdatabassystem (som anv\u00e4nder en flertr\u00e5dad metod) som MySQL kan skalas bra vertikalt.<\/p>\n<p>Denna metod har flera nackdelar, men den mest uppenbara \u00e4r den maximala serverstorleken p\u00e5 marknaden. N\u00e4r gr\u00e4nsen f\u00f6r den st\u00f6rsta serverinstansen har uppn\u00e5tts finns det bara en v\u00e4g kvar: horisontell skalning.<\/p>\n<p>Horisontell skalning \u00e4r en metod d\u00e4r fler servrar l\u00e4ggs till klustret f\u00f6r att i idealfallet linj\u00e4rt \u00f6ka prestanda med en \u00f6kning av antalet servrar. De flesta <i>av traditionella <\/i>databassystem \u00e4r f\u00f6rst\u00f6rd f\u00f6r horisontell skalning eller kan \u00f6verhuvudtaget inte skalas. Till exempel kan MySQL horisontellt skalas f\u00f6r l\u00e4soperationer genom att l\u00e4gga till slave-l\u00e4sare, men kan inte horisontellt skalas f\u00f6r skrivoperationer.<\/p>\n<p>\u00c5 andra sidan kan Cloud Spanner tack vare sin natur enkelt skalas horisontellt med minimal inblandning.<\/p>\n<p>Fullfj\u00e4drad<i> DBMS som en tj\u00e4nst<\/i> b\u00f6r utv\u00e4rderas fr\u00e5n olika perspektiv. Som grund har vi tagit den mest popul\u00e4ra databasen i molnet \u2013 f\u00f6r Google, GCP Cloud SQL och f\u00f6r Amazon, AWS RDS. I v\u00e5r utv\u00e4rdering har vi fokuserat p\u00e5 f\u00f6ljande kategorier:<\/p>\n<ul>\n<li>Funktionalitet: SQL-utvidgningar, DDL, DML; anslutningsbibliotek\/anslutare, transaktionsst\u00f6d osv.<\/li>\n<li>St\u00f6d f\u00f6r utveckling: enkelhet i utveckling och testning.<\/li>\n<li>Administration support: instance management \u2014 for example, scaling up\/down and upgrading instances; SLA, backup and recovery; security\/access control.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Using Cloud Spanner as an OLTP solution with OLAP support<\/h4>\n<p>\nAlthough Google does not explicitly claim that Cloud Spanner is intended for analytics processing, it shares some attributes with other mechanisms, such as Apache Impala &amp; Kudu and YugaByte, that are designed for OLAP workloads.<\/p>\n<p>Even if there was only a small chance that Cloud Spanner included a horizontally scalable HTAP (hybrid transactional\/analytical processing) engine with a (more or less) usable set of OLAP features, we believe it would deserve our attention.<\/p>\n<p>With this in mind, we considered the following categories:<\/p>\n<ul>\n<li>Data loading, indexing, and partitioning support<\/li>\n<li>Query performance and DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner in brief<\/h2>\n<p>\nGoogle Spanner is a clustered relational database management system (RDBMS) used by Google for several of its own services. Google made it publicly available to Google Cloud Platform users in early 2017.<\/p>\n<p>Here are some of the attributes of Cloud Spanner:<\/p>\n<ul>\n<li>Strongly consistent scalable cluster RDBMS: uses hardware time synchronization to ensure data consistency.<\/li>\n<li>Support for cross-table transactions: transactions can span multiple tables \u2014 not necessarily limited to a single table (unlike Apache HBase or Apache Kudu).<\/li>\n<li>Primary key-based tables: all tables must have a declared primary key (PK), which can consist of multiple columns of the table. Tabular data is stored in PK order, making it very efficient and fast for lookups by PK. Like other PK-based systems, the implementation must be modeled with an eye toward well-thought-out use cases for achieving <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">the best performance<\/a><\/noindex>.<\/li>\n<li>Alternativa tabeller: tabeller kan ha fysiska beroenden av varandra. Rader i en underordnad tabell kan kopplas samman med rader i en \u00f6verordnad tabell. Denna metod snabbar upp s\u00f6kningen efter f\u00f6rh\u00e5llanden som kan best\u00e4mmas under datamodelleringssteget, till exempel vid gemensam placering av kunder och deras fakturor.<\/li>\n<li>Index: Cloud Spanner st\u00f6der sekund\u00e4ra index. Ett index best\u00e5r av indexerade kolumner och alla kolumner i prim\u00e4rnyckeln. Om s\u00e5 \u00f6nskas kan indexet ocks\u00e5 inneh\u00e5lla andra icke-indexerade kolumner. Indexet kan samverka med den \u00f6verordnade tabellen f\u00f6r att p\u00e5skynda f\u00f6rfr\u00e5gningar. Det finns flera begr\u00e4nsningar f\u00f6r index, till exempel det maximala antalet extra kolumner som lagras i indexet. F\u00f6rfr\u00e5gningar via index kan \u00e4ven vara mer komplicerade \u00e4n i andra relationsdatabaser.<\/li>\n<\/ul>\n<p>\n<i>\u201eCloud Spanner v\u00e4ljer automatiskt index endast i s\u00e4llsynta fall. I synnerhet v\u00e4ljer Cloud Spanner inte automatiskt ett sekund\u00e4rt index om f\u00f6rfr\u00e5gan beg\u00e4r n\u00e5gra kolumner som inte \u00e4r lagrade i <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">indexet <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Service Level Agreement (SLA): distribution i en region med SLA p\u00e5 99,99%; flerdelade distributioner med 99,999% SLA. \u00c4ven om sj\u00e4lva avtalet om serviceniv\u00e5 bara \u00e4r ett avtal och ingen garanti, tror jag att Googles anst\u00e4llda har n\u00e5got exakt data som g\u00f6r det m\u00f6jligt att g\u00f6ra ett s\u00e5 allvarligt p\u00e5st\u00e5ende. (F\u00f6r referens betyder 99,999% 26,3 sekunder av tj\u00e4nstens otillg\u00e4nglighet per m\u00e5nad.)<\/li>\n<li>Mer: <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>Anm\u00e4rkning:<\/b> Apache Tephra-projektet l\u00e4gger till ut\u00f6kat st\u00f6d f\u00f6r transaktioner i Apache HBase (som nu ocks\u00e5 implementeras i Apache Phoenix i beta-version).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. V\u00e5r bed\u00f6mning<\/h2>\n<p>\nS\u00e5, vi har alla l\u00e4st Googles p\u00e5st\u00e5enden om f\u00f6rdelarna med Cloud Spanner \u2013 praktiskt taget o\u00e4ndlig horisontell skalning med bibeh\u00e5llen h\u00f6g konsistens och mycket h\u00f6g SLA. \u00c4ven om dessa krav \u00e4r extremt sv\u00e5ra att uppn\u00e5, var v\u00e5rt m\u00e5l inte att mots\u00e4ga dem. L\u00e5t oss ist\u00e4llet fokusera p\u00e5 andra saker som bekymrar de flesta databas-anv\u00e4ndare: anv\u00e4ndbarhet och l\u00e4tthet.<\/p>\n<h4>Vi bed\u00f6mde Cloud Spanner som en ers\u00e4ttning f\u00f6r Sharded MySQL<\/h4>\n<p>\nGoogle Cloud SQL och Amazon AWS RDS, tv\u00e5 av de mest popul\u00e4ra OLTP-databaserna p\u00e5 marknaden f\u00f6r molntj\u00e4nster, har en mycket omfattande upps\u00e4ttning funktioner. F\u00f6r att dock skala dessa databaser bortom storleken p\u00e5 en enda nod, m\u00e5ste du implementera applikationspartitionering. Denna strategi skapar ytterligare komplexitet b\u00e5de f\u00f6r applikationerna och f\u00f6r administrationen. Vi har unders\u00f6kt hur Spanner passar in i scenariot d\u00e4r flera segment samlas i en instans och vilka funktioner (om n\u00e5gra) som kanske m\u00e5ste offras.<\/p>\n<h4>St\u00f6d f\u00f6r SQL, DML och DDL, samt anslutare och bibliotek?<\/h4>\n<p>\nF\u00f6rst och fr\u00e4mst, n\u00e4r du arbetar med vilken databas som helst m\u00e5ste du skapa en datamodell. Om du tror att du kan koppla JDBC Spanner till ditt favorit SQL-verktyg, kommer du att m\u00e4rka att du kan fr\u00e5ga dina data med det, men du kan inte anv\u00e4nda det f\u00f6r att skapa tabeller eller g\u00f6ra \u00e4ndringar (DDL) eller n\u00e5gra ins\u00e4ttnings-\/uppdaterings-\/raderingsoperationer (DML). Googles officiella JDBC st\u00f6der varken det ena eller det andra.<\/p>\n<blockquote><p><i>\"F\u00f6r n\u00e4rvarande st\u00f6der drivrutinerna inte DML- eller DDL-satser.\"<\/i><br \/>\nSpanner-dokumentation<\/p><\/blockquote>\n<p>\nMed GCP-konsolen \u00e4r situationen inte heller b\u00e4ttre \u2014 du kan endast skicka SELECT-fr\u00e5gor. Lyckligtvis finns det en JDBC-drivrutin med st\u00f6d f\u00f6r DML och DDL fr\u00e5n gemenskapen, inklusive transaktioner. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. \u00c4ven om denna drivrutin \u00e4r oerh\u00f6rt anv\u00e4ndbar, v\u00e4cker avsaknaden av en egen JDBC-drivrutin fr\u00e5n Google f\u00f6rv\u00e5ning. Lyckligtvis erbjuder Google ganska bra st\u00f6d f\u00f6r klientbibliotek (baserat p\u00e5 gRPC): C#, Go, Java, node.js, PHP, Python och Ruby.<\/p>\n<p>De n\u00e4stan obligatoriska anv\u00e4ndningarna av anpassade API:er f\u00f6r Cloud Spanner (p\u00e5 grund av bristen p\u00e5 DDL och DML i JDBC) leder till vissa begr\u00e4nsningar f\u00f6r relaterade kodomr\u00e5den, s\u00e5som anslutningspooler eller databindningsramverk (till exempel Spring MVC). I allm\u00e4nhet kan man vid anv\u00e4ndning av JDBC fritt v\u00e4lja sin favoritanslutningspool (till exempel HikariCP, DBCP, C3PO osv.) som har testats och fungerar bra. F\u00f6r anpassade API:er i Spanner m\u00e5ste vi f\u00f6rlita oss p\u00e5 de ramverk\/pooler f\u00f6r bindning\/Sessioner som vi har skapat sj\u00e4lva.<\/p>\n<p>Prim\u00e4rnyckelsinriktad konstruktion g\u00f6r att Cloud Spanner \u00e4r mycket snabb vid databas\u00e5tkomst via prim\u00e4rnyckeln, men leder ocks\u00e5 till vissa problem med fr\u00e5gor.<\/p>\n<ul>\n<li>Du kan inte uppdatera v\u00e4rdet av prim\u00e4rnyckeln; du m\u00e5ste f\u00f6rst ta bort posten med den ursprungliga PK och infoga den igen med det nya v\u00e4rdet. (Detta liknar andra PK-orienterade databaser\/lagringsmekanismer.)<\/li>\n<li>Alla UPDATE- och DELETE-operatorer m\u00e5ste ange PK i WHERE, d\u00e4rf\u00f6r kan det inte finnas tomma DELETE all-operatorer \u2014 det m\u00e5ste alltid finnas en underfr\u00e5ga, till exempel: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Avsaknad av autoinkrement eller n\u00e5got liknande som anger sekvensen f\u00f6r PK-f\u00e4ltet. F\u00f6r att detta ska fungera m\u00e5ste det motsvarande v\u00e4rdet skapas p\u00e5 applikationens sida.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Sekund\u00e4ra index?<\/h4>\n<p>\nGoogle Cloud Spanner har inbyggt st\u00f6d f\u00f6r sekund\u00e4ra index. Detta \u00e4r en mycket trevlig funktion som inte alltid finns i andra teknologier. Apache Kudu st\u00f6der f\u00f6r n\u00e4rvarande \u00f6verhuvudtaget inte sekund\u00e4ra index, och Apache HBase st\u00f6der inte index direkt men kan l\u00e4gga till dem via Apache Phoenix.<\/p>\n<p>Index i Kudu och HBase kan modelleras som en separat tabell med olika sammans\u00e4ttningar av prim\u00e4rnycklar, men atom\u00e4riteten f\u00f6r operationer som utf\u00f6rs med den prim\u00e4ra tabellen och de relaterade index-tabellerna m\u00e5ste genomf\u00f6ras p\u00e5 applikationsniv\u00e5 och \u00e4r inte trivial i en korrekt implementering.<\/p>\n<p>Som n\u00e4mnts i \u00f6versikten av Cloud Spanner kan dess index skilja sig fr\u00e5n MySQL-index. D\u00e4rf\u00f6r b\u00f6r man vara s\u00e4rskilt f\u00f6rsiktig vid byggandet av fr\u00e5gor och profilering f\u00f6r att s\u00e4kerst\u00e4lla anv\u00e4ndningen av r\u00e4tt index d\u00e4r det \u00e4r n\u00f6dv\u00e4ndigt.<\/p>\n<h4>Vyern?<\/h4>\n<p>\nEn mycket popul\u00e4r och anv\u00e4ndbar objekt i databasen \u00e4r vyer. De kan vara anv\u00e4ndbara f\u00f6r en m\u00e4ngd olika anv\u00e4ndningsfall; tv\u00e5 av mina favoriter \u00e4r logisk abstraheringsniv\u00e5 och s\u00e4kerhetsniv\u00e5. Tyv\u00e4rr st\u00f6djer Cloud Spanner INTE vyer. Men detta begr\u00e4nsar oss endast delvis, eftersom det inte finns n\u00e5gon detaljering p\u00e5 kolumniv\u00e5 f\u00f6r \u00e5tkomstr\u00e4ttigheter d\u00e4r vyer kan vara en acceptabel l\u00f6sning.<\/p>\n<p>I Cloud Spanners dokumentation finns det en sektion d\u00e4r kvoter och begr\u00e4nsningar beskrivs i detalj (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), det finns, s\u00e4rskilt, en som kan vara problematisk f\u00f6r vissa applikationer: Cloud Spanner har som standard en gr\u00e4ns p\u00e5 h\u00f6gst 100 databaser per instans. Det \u00e4r uppenbart att detta kan bli ett allvarligt hinder f\u00f6r en databas som \u00e4r avsedd att skalas \u00f6ver mer \u00e4n 100 databaser. Som tur \u00e4r, efter att ha pratat med v\u00e5r tekniska representant p\u00e5 Google, fick vi veta att denna gr\u00e4ns kan \u00f6kas till praktiskt taget vilket v\u00e4rde som helst via Googles support.<\/p>\n<h4>St\u00f6d f\u00f6r utveckling?<\/h4>\n<p>\nCloud Spanner erbjuder ganska bra st\u00f6d f\u00f6r programmeringsspr\u00e5k f\u00f6r att arbeta med sitt API. Officiellt st\u00f6dda bibliotek finns inom C#, Go, Java, node.js, PHP, Python och Ruby. Dokumentationen \u00e4r ganska detaljerad, men som med andra avancerade teknologier \u00e4r gemenskapen relativt liten j\u00e4mf\u00f6rt med de mest popul\u00e4ra databasteknologierna, vilket kan leda till \u00f6kad tid som spenderas p\u00e5 att l\u00f6sa mindre vanliga anv\u00e4ndningsfall eller problem.<\/p>\n<h4>S\u00e5, hur \u00e4r det med st\u00f6det f\u00f6r lokal utveckling?<\/h4>\n<p>\nVi hittade inget s\u00e4tt att skapa en Cloud Spanner-instans i en lokal milj\u00f6. Det n\u00e4rmaste vi fick var en Docker-avbildning <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, vilket i princip liknar, men i praktiken skiljer sig mycket. Till exempel kan CockroachDB anv\u00e4nda PostgreSQL JDBC. Eftersom utvecklingsmilj\u00f6n m\u00e5ste vara s\u00e5 n\u00e4ra produktionsmilj\u00f6n som m\u00f6jligt, \u00e4r Cloud Spanner inte idealisk, eftersom man m\u00e5ste f\u00f6rlita sig p\u00e5 en fullst\u00e4ndig Spanner-instans. F\u00f6r att spara kostnader kan du v\u00e4lja en instans f\u00f6r en region.<\/p>\n<h4>St\u00f6d f\u00f6r administration?<\/h4>\n<p>\nAtt skapa en Cloud Spanner-instans \u00e4r mycket enkelt. Du beh\u00f6ver bara v\u00e4lja mellan att skapa en multiregional instans eller en instans f\u00f6r en region, ange region(er) och antal noder. P\u00e5 mindre \u00e4n en minut kommer instansen att starta och vara redo att anv\u00e4ndas.<\/p>\n<p>N\u00e5gra grundl\u00e4ggande m\u00e4tv\u00e4rden \u00e4r direkt tillg\u00e4ngliga p\u00e5 Spanner-sidan i Google Console. Mer detaljerade vyer \u00e4r tillg\u00e4ngliga via Stackdriver, d\u00e4r du ocks\u00e5 kan st\u00e4lla in tr\u00f6skelv\u00e4rden f\u00f6r m\u00e4tv\u00e4rden och aviseringar.<\/p>\n<h4>Tillg\u00e5ng till resurser?<\/h4>\n<p>\nMySQL erbjuder omfattande och mycket detaljerade inst\u00e4llningar f\u00f6r anv\u00e4ndarr\u00e4ttigheter\/roller. Det \u00e4r enkelt att konfigurera \u00e5tkomst till en specifik tabell eller till och med bara ett delm\u00e4ngd av dess kolumner. Cloud Spanner anv\u00e4nder Google Identity &amp; Access Management (IAM), vilket g\u00f6r att du kan st\u00e4lla in policyer och \u00e5tkomstr\u00e4ttigheter p\u00e5 en mycket h\u00f6g niv\u00e5. Den mest detaljerade versionen \u00e4r databasniv\u00e5tillst\u00e5nd, vilket inte passar in i de flesta produktionsfall. Denna begr\u00e4nsning tvingar dig att l\u00e4gga till ytterligare s\u00e4kerhets\u00e5tg\u00e4rder i din kod, infrastruktur eller b\u00e5da f\u00f6r att f\u00f6rhindra obeh\u00f6rig anv\u00e4ndning av Spanner-resurser.<\/p>\n<h4>S\u00e4kerhetskopior?<\/h4>\n<p>\nF\u00f6r att s\u00e4ga det enkelt, det finns inga s\u00e4kerhetskopior i Cloud Spanner. \u00c4ven om Googles h\u00f6ga SLA-krav kan garantera att du inte f\u00f6rlorar n\u00e5gra data p\u00e5 grund av h\u00e5rdvarufel eller databasproblem, skyddar det inte mot m\u00e4nskliga misstag, applikationsfel osv. Vi vet alla regeln: h\u00f6g tillg\u00e4nglighet ers\u00e4tter inte en rimlig s\u00e4kerhetskopieringsstrategi. F\u00f6r n\u00e4rvarande \u00e4r det enda s\u00e4ttet att s\u00e4kerhetskopiera data att programvaru-streama dem fr\u00e5n databasen till en separat lagringsmilj\u00f6.<\/p>\n<h4>Fr\u00e5geprestanda?<\/h4>\n<p>\nF\u00f6r datainl\u00e4sning och testning av fr\u00e5gor anv\u00e4nde vi Yahoo! Cloud Serving Benchmark. Tabellen nedan visar arbetsbelastningen B YCSB med l\u00e4sningskvot 95 % och skrivkvot 5 %.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Belastningstestet utf\u00f6rdes p\u00e5 ber\u00e4kningsmotorn (CE) n1-standard-32 (32 vCPU, 120 GB RAM), och testinstansen var aldrig en flaskhals i testerna.<\/i><br \/>\n<i>** Det maximala antalet tr\u00e5dar i en YCSB-instans \u00e4r 400. Totalt beh\u00f6vde sex parallella YCSB-testinstanser k\u00f6ras f\u00f6r att f\u00e5 totalt 2400 tr\u00e5dar.<\/i><\/p>\n<p>Tittande p\u00e5 testresultaten, s\u00e4rskilt n\u00e4r det g\u00e4ller kombinationen av processorbelastning och TPS, ser vi tydligt att Cloud Spanner skalar ganska bra. Den stora belastningen som skapas av m\u00e5nga tr\u00e5dar kompenseras av antalet noder i Cloud Spanner-klustret. \u00c4ven om f\u00f6rdr\u00f6jningen verkar ganska h\u00f6g, s\u00e4rskilt vid arbete med 2400 tr\u00e5dar, kan det kr\u00e4vas omtestning med 6 mindre instanser av ber\u00e4kningsmotorn f\u00f6r att f\u00e5 mer exakta siffror. Varje instans kommer att k\u00f6ra ett YCSB-test ist\u00e4llet f\u00f6r en stor CE-instans med 6 parallella tester. P\u00e5 s\u00e5 s\u00e4tt blir det l\u00e4ttare att s\u00e4rskilja f\u00f6rdr\u00f6jningarna i Cloud Spanner och de f\u00f6rdr\u00f6jningar som l\u00e4ggs till genom n\u00e4tverksanslutningen mellan Cloud Spanner och CE-instansen d\u00e4r testet utf\u00f6rs.<\/p>\n<h3>Hur fungerar Cloud Spanner som OLAP?<\/h3>\n<p><\/p>\n<h4>Partionering?<\/h4>\n<p>\nAtt dela upp data i fysiskt och\/eller logiskt oberoende segment, kallade partitioner, \u00e4r en mycket popul\u00e4r id\u00e9 som \u00e4r typisk f\u00f6r de flesta OLAP-mekanismer. Partitioner kan avsev\u00e4rt f\u00f6rb\u00e4ttra fr\u00e5geprestanda och databasunderh\u00e5ll. Att g\u00e5 djupare in p\u00e5 partitioner skulle vara en egen artikel, s\u00e5 l\u00e5t oss bara n\u00e4mna vikten av att ha en partitioneringsschema och sub-partionering. M\u00f6jligheten att dela upp data i partitioner och till och med vidare i underpartitioner \u00e4r nyckeln till prestanda i analytiska fr\u00e5gor.<\/p>\n<p>Cloud Spanner st\u00f6djer inte partitioner i egentlig mening. Den delar upp data in\u00e5t i s\u00e5 kallade <i>split<\/i>-er baserat p\u00e5 intervall av prim\u00e4ra nycklar. Dela upp sker automatiskt f\u00f6r att balansera lasten i Cloud Spanner-klustret. En mycket anv\u00e4ndbar funktion hos Cloud Spanner \u00e4r uppdelningen av den grundl\u00e4ggande belastningen av moderntabellen (tabellen som inte alterneras med en annan). Spanner identifierar automatiskt om <i>split <\/i>data l\u00e4ses oftare \u00e4n data i andra <i>split<\/i>-er och kan besluta att ytterligare dela upp. P\u00e5 s\u00e5 s\u00e4tt kan fler noder involveras i fr\u00e5gan, vilket effektivt \u00f6kar genomstr\u00f6mningen.<\/p>\n<h4>Datainl\u00e4sning?<\/h4>\n<p>\nCloud Spanner-metoden f\u00f6r stora datam\u00e4ngder \u00e4r densamma som vid vanlig inladdning. F\u00f6r att uppn\u00e5 maximal prestanda m\u00e5ste du f\u00f6lja vissa rekommendationer, inklusive:<\/p>\n<ul>\n<li>Sortera dina data efter prim\u00e4rnyckeln.<\/li>\n<li>Dela upp dem i 10*<i>antal noder<\/i> separata sektioner.<\/li>\n<li>Skapa en upps\u00e4ttning arbetsuppgifter som laddar data parallellt.<\/li>\n<\/ul>\n<p>\nVid denna datainladdning anv\u00e4nds alla noder i Cloud Spanner.<\/p>\n<p>Vi anv\u00e4nde arbetsbelastning A YCSB f\u00f6r att generera en datam\u00e4ngd av 10M rader.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Belastningstestet genomf\u00f6rdes p\u00e5 ber\u00e4kningsmotorn n1-standard-32 (32 vCPU, 120 GB minne), och testinstansen var aldrig den begr\u00e4nsande faktorn i testerna.<br \/>\n** Konfiguration med 1 nod rekommenderas inte f\u00f6r n\u00e5got produktionsbelastning.<\/i><\/p>\n<p>Som n\u00e4mnts ovan hanterar Cloud Spanner automatiskt splittringar beroende p\u00e5 deras belastning, s\u00e5 resultaten f\u00f6rb\u00e4ttras efter flera p\u00e5 varandra f\u00f6ljande testk\u00f6rningar. Resultaten h\u00e4r \u00e4r de b\u00e4sta vi fick. Genom att titta p\u00e5 siffrorna ovan kan vi se hur Cloud Spanner (bra) skalas med \u00f6kande antal noder i klustret. Siffrorna som sticker ut representerar extremt l\u00e5ga genomsnittliga latenser som kontrasterar med resultaten fr\u00e5n blandade arbetsbelastningar (95% f\u00f6r l\u00e4sning och 5% f\u00f6r skrivning), som beskrivs ovan.<\/p>\n<h4>Skalning?<\/h4>\n<p>\nAtt \u00f6ka och minska antalet noder i Cloud Spanner \u00e4r en uppgift som utf\u00f6rs med ett klick. Om du snabbt vill ladda data kan du \u00f6verv\u00e4ga att \u00f6ka instansen till max (i v\u00e5rt fall var det 25 noder i regionen US-EAST), och sedan minska antalet noder till det som passar din normala belastning efter att alla data \u00e4r i databasen, med tanke p\u00e5 begr\u00e4nsningen p\u00e5 2 TB\/nod.<\/p>\n<p>Vi blev p\u00e5minda om denna gr\u00e4ns \u00e4ven med en mycket mindre databas. Efter flera k\u00f6rningar av belastningstester hade v\u00e5r databas en storlek av cirka 155 GB, och vid minskning till en instans med 1 nod fick vi f\u00f6ljande felmeddelande:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi lyckades minska skalan fr\u00e5n 25 till 2 instanser, men vi fastnade vid tv\u00e5 noder.<\/p>\n<p>\u00d6kningen och minskningen av antalet noder i Cloud Spanner-klustret kan automatiseras med hj\u00e4lp av REST API. Detta kan vara s\u00e4rskilt anv\u00e4ndbart f\u00f6r att minska den \u00f6kade belastningen p\u00e5 systemet under h\u00f6gtrafikperioder.<\/p>\n<h4>Prestanda f\u00f6r OLAP-fr\u00e5gor?<\/h4>\n<p>\nVi planerade ursprungligen att \u00e4gna betydande tid \u00e5t v\u00e5r bed\u00f6mning av Spanner p\u00e5 denna del. Efter flera SELECT COUNT ins\u00e5g vi genast att testningen skulle bli kort och att Spanner INTE skulle passa som OLAP-motor. Oavsett antalet noder i klustret tog en enkel fr\u00e5ga f\u00f6r att r\u00e4kna antalet rader i en tabell med 10 miljoner rader mellan 55 och 60 sekunder. Dessutom ledde varje fr\u00e5ga som kr\u00e4vde mer minne f\u00f6r att lagra mellanresultat till ett OOM-fel.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M distinkta v\u00e4rden) -&gt; SpoolingHashAggregateIterator fick slut p\u00e5 minne under den nya raden.<\/code><\/p>\n<p>Vissa siffror f\u00f6r TPC-H-fr\u00e5gor finns i artikeln av 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>, bilder 42 och 43. Dessa siffror \u00f6verensst\u00e4mmer med v\u00e5ra egna resultat (tyv\u00e4rr).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bra, d\u00e5lig, ful\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. V\u00e5ra slutsatser<\/h4>\n<p>\nMed tanke p\u00e5 det nuvarande tillst\u00e5ndet av Cloud Spanner-funktioner \u00e4r det sv\u00e5rt att f\u00f6rest\u00e4lla sig en enkel ers\u00e4ttning f\u00f6r ett befintligt OLTP-l\u00f6sning, s\u00e4rskilt n\u00e4r dina behov \u00f6verstiger dess kapacitet. Det skulle ta betydande tid att bygga en l\u00f6sning med tanke p\u00e5 bristerna hos Cloud Spanner.<\/p>\n<p>N\u00e4r vi b\u00f6rjade utv\u00e4rdera Cloud Spanner f\u00f6rv\u00e4ntade vi oss att dess hanteringsfunktioner skulle vara p\u00e5 niv\u00e5 eller \u00e5tminstone inte s\u00e5 l\u00e5ngt ifr\u00e5n andra l\u00f6sningar fr\u00e5n Google SQL. Men vi blev \u00f6verraskade \u00f6ver den totala avsaknaden av s\u00e4kerhetskopior och mycket begr\u00e4nsad \u00e5tkomstkontroll till resurser. F\u00f6r att inte tala om avsaknaden av vyer, bristen p\u00e5 lokala utvecklingsmilj\u00f6er, icke-underst\u00f6dda sekvenser, JDBC utan st\u00f6d f\u00f6r DML och DDL och s\u00e5 vidare.<\/p>\n<p>S\u00e5, vart ska man g\u00e5 f\u00f6r att skala en transaktionsdatabas? Det verkar finnas m\u00e5nga l\u00f6sningar med b\u00e5de st\u00e4ngd och \u00f6ppen k\u00e4llkod p\u00e5 marknaden (n\u00e5gra av dem n\u00e4mns i denna artikel), varje med sina styrkor och svagheter, men ingen av dem erbjuder en SaaS-l\u00f6sning med SLA p\u00e5 99,999 % och h\u00f6g grad av \u00f6verensst\u00e4mmelse. Om en h\u00f6g SLA-niv\u00e5 \u00e4r ditt fr\u00e4msta m\u00e5l och du inte \u00e4r ben\u00e4gen att skapa en egen l\u00f6sning f\u00f6r flera molnmilj\u00f6er, kan Cloud Spanner vara den l\u00f6sning du s\u00f6ker. Men du b\u00f6r k\u00e4nna till dess begr\u00e4nsningar.<\/p>\n<p>F\u00f6r r\u00e4ttvisans skull b\u00f6r det n\u00e4mnas att Cloud Spanner endast sl\u00e4pptes f\u00f6r allm\u00e4nheten v\u00e5ren 2017, s\u00e5 det \u00e4r rimligt att f\u00f6rv\u00e4nta sig att vissa av dess nuvarande brister s\u00e5 sm\u00e5ningom f\u00f6rsvinner (f\u00f6rhoppningsvis), och n\u00e4r det h\u00e4nder kan det f\u00f6r\u00e4ndra spelet. Trots allt, Cloud Spanner \u00e4r inte bara ett sidoprojekt f\u00f6r Google. Google anv\u00e4nder det som grund f\u00f6r andra produkter. Och n\u00e4r Google nyligen ersatte Megastore i Google Cloud Storage med Cloud Spanner, gjorde det att Google Cloud Storage blev strikt \u00f6verenskommet f\u00f6r objektlistor p\u00e5 v\u00e4rldsstandard (vilket fortfarande inte g\u00e4ller f\u00f6r) <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>S\u00e5 hoppet lever fortfarande... vi hoppas.<\/p>\n<p>Detta \u00e4r allt. Precis som f\u00f6rfattaren av artikeln forts\u00e4tter vi att hoppas, vad tycker du om detta? Skriv i kommentarerna.<\/p>\n<p><b>Vi inbjuder alla intresserade att bes\u00f6ka v\u00e5r <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">gratis webbinarie<\/a><\/noindex> d\u00e4r vi kommer att ber\u00e4tta mer om kursen<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS f\u00f6r utvecklare\u00bb<\/a><\/noindex> fr\u00e5n OTUS.<\/b><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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: bra, d\u00e5lig, ful | ProHoster","description":"Hej, Habr-l\u00e4sare. Traditionellt forts\u00e4tter vi att dela intressant material inf\u00f6r starten av nya kurser.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/69568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}