{"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\/ro\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Bun\u0103, comunitate Hub. Continu\u0103m s\u0103 \u00eemp\u0103rt\u0103\u0219im materiale interesante \u00eenainte de lansarea noilor cursuri. Ast\u0103zi, special pentru voi, am tradus un articol despre Google Cloud Spanner, corel\u00e2ndu-l cu lansarea cursului. <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS pentru dezvoltatori\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Publicat ini\u021bial \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">blogul Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>Ca o companie care ofer\u0103 o gam\u0103 variat\u0103 de solu\u021bii POS cloud pentru comercian\u021bi cu am\u0103nuntul, restauratori \u0219i v\u00e2nz\u0103tori online din \u00eentreaga lume, Lightspeed utilizeaz\u0103 mai multe tipuri diferite de platforme de baze de date pentru diverse cazuri de utilizare tranzac\u021bional\u0103, analitic\u0103 \u0219i de c\u0103utare. Fiecare dintre aceste platforme de baze de date are propriile sale puncte forte \u0219i slabe. A\u0219adar, c\u00e2nd Google a introdus pe pia\u021b\u0103 Cloud Spanner - o solu\u021bie promi\u021b\u0103toare cu caracteristici nemai\u00eent\u00e2lnite \u00een lumea bazelor de date rela\u021bionale, cum ar fi scalabilitatea orizontal\u0103 aproape nelimitat\u0103 \u0219i un SLA de 99,999% - nu am putut rata ocazia de a o avea \u00een m\u00e2inile noastre!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPentru a oferi o imagine de ansamblu cuprinz\u0103toare a experien\u021bei noastre cu Cloud Spanner, precum \u0219i a criteriilor de evaluare pe care le-am folosit, vom discuta urm\u0103toarele subiecte:<\/p>\n<ol>\n<li>Criteriile noastre de evaluare<\/li>\n<li>Cloud Spanner \u00een c\u00e2teva cuvinte<\/li>\n<li>Evaluarea noastr\u0103<\/li>\n<li>Concluziile noastre<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. Criteriile noastre de evaluare<\/h2>\n<p>\n\u00cenainte de a ne aprofunda \u00een caracteristicile Cloud Spanner, similarit\u0103\u021bile \u0219i diferen\u021bele sale fa\u021b\u0103 de alte solu\u021bii de pe pia\u021b\u0103, s\u0103 discut\u0103m mai \u00eent\u00e2i despre principalele cazuri de utilizare pe care le-am avut \u00een vedere c\u00e2nd ne-am g\u00e2ndit unde s\u0103 implement\u0103m Cloud Spanner \u00een infrastructura noastr\u0103:<\/p>\n<ul>\n<li>Ca o alternativ\u0103 (dominant\u0103) la solu\u021bia tradi\u021bional\u0103 pentru baze de date SQL<\/li>\n<li>Ca solu\u021bie OLTP cu suport OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Not\u0103:<\/b> Pentru simplificare \u0219i comoditate \u00een compara\u021bie, acest articol compar\u0103 Cloud Spanner cu variantele MySQL ale solu\u021biilor GCP Cloud SQL \u0219i Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Utilizarea Cloud Spanner ca alternativ\u0103 la solu\u021bia tradi\u021bional\u0103 pentru baze de date SQL<\/h4>\n<p>\n\u00centr-un mediu <i>al bazelor de date <\/i>traditionale, atunci c\u00e2nd timpul de r\u0103spuns la o interogare de baz\u0103 de date se apropie sau chiar dep\u0103\u0219e\u0219te valorile prag definite anterior de aplica\u021bie (\u00een principal din cauza cre\u0219terii num\u0103rului de utilizatori \u0219i\/sau interog\u0103rilor), exist\u0103 mai multe modalit\u0103\u021bi de a reduce timpul de r\u0103spuns la niveluri acceptabile. Cu toate acestea, majoritatea acestor solu\u021bii necesit\u0103 interven\u021bie manual\u0103.<\/p>\n<p>De exemplu, primului pas pe care trebuie s\u0103-l facem este s\u0103 ne uit\u0103m la diferitele parametrii ai bazei de date, legate de performan\u021b\u0103, \u0219i s\u0103 le ajust\u0103m astfel \u00eenc\u00e2t s\u0103 corespund\u0103 cel mai bine scenariilor de utilizare a aplica\u021biilor. Dac\u0103 acesta se dovede\u0219te a fi insuficient, se poate opta pentru scalarea vertical\u0103 sau orizontal\u0103 a bazei de date.<\/p>\n<p>Scalarea vertical\u0103 a aplica\u021biei implic\u0103 actualizarea instan\u021bei serverului, de obicei prin ad\u0103ugarea de mai mul\u021bi procesoare\/core, memorie RAM suplimentar\u0103, stocare mai rapid\u0103 etc. Ad\u0103ugarea de resurse hardware suplimentare duce la cre\u0219terea performan\u021bei bazei de date, m\u0103surat\u0103 \u00een principal \u00een tranzac\u021bii pe secund\u0103 \u0219i laten\u021ba tranzac\u021biilor pentru sistemele OLTP. Sistemele de baze de date rela\u021bionale (care utilizeaz\u0103 o abordare multi-threaded), cum ar fi MySQL, se scalaza bine pe vertical\u0103.<\/p>\n<p>Aceast\u0103 abordare are c\u00e2teva dezavantaje, dar cel mai evident este dimensiunea maxim\u0103 a serverului disponibil pe pia\u021b\u0103. Odat\u0103 ce se atinge limita celei mai mari instan\u021be a serverului, nu mai r\u0103m\u00e2ne dec\u00e2t o singur\u0103 cale: scalarea orizontal\u0103.<\/p>\n<p>Scalarea orizontal\u0103 este o abordare prin care se adaug\u0103 mai multe servere \u00een cluster, cu scopul de a cre\u0219te ideal performan\u021ba \u00een mod liniar prin ad\u0103ugarea de servere. Majoritatea <i>al bazelor de date <\/i>sistemelor de baze de date se scalaza prost pe orizontal\u0103 sau deloc. De exemplu, MySQL poate scala orizontal pentru opera\u021biuni de citire, ad\u0103ug\u00e2nd cititori slave, dar nu poate scala orizontal pentru opera\u021biuni de scriere.<\/p>\n<p>Pe de alt\u0103 parte, datorit\u0103 naturii sale, Cloud Spanner se poate scalaza cu u\u0219urin\u021b\u0103 orizontal cu un minim de interven\u021bie.<\/p>\n<p>Sistem de gestionare a bazelor de date complet func\u021bional<i> ca serviciu<\/i> trebuie evaluat din mai multe perspective. Ca baz\u0103, am luat cea mai popular\u0103 baz\u0103 de date din cloud - pentru Google, GCP Cloud SQL \u0219i pentru Amazon, AWS RDS. \u00cen evaluarea noastr\u0103 ne-am concentrat pe urm\u0103toarele categorii:<\/p>\n<ul>\n<li>Compararea func\u021bionalit\u0103\u021bilor: extensia SQL, DDL, DML; biblioteci de conexiune\/conectori, suport pentru tranzac\u021bii etc.<\/li>\n<li>Suport pentru dezvoltare: u\u0219urin\u021ba dezvolt\u0103rii \u0219i test\u0103rii.<\/li>\n<li>Suport de administrare: gestionarea instan\u021belor - de exemplu, scalarea \u00een sus\/\u00een jos \u0219i actualizarea instan\u021belor; SLA, backup \u0219i restaurare; securitate\/controlul accesului.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Utilizarea Cloud Spanner ca solu\u021bie OLTP cu suport OLAP<\/h4>\n<p>\nDe\u0219i Google nu afirm\u0103 \u00een mod explicit c\u0103 Cloud Spanner este destinat prelucr\u0103rii analitice, el \u00eemp\u0103rt\u0103\u0219e\u0219te unele atribute cu alte mecanisme, precum Apache Impala &amp; Kudu \u0219i YugaByte, care sunt dedicate sarcinilor de lucru OLAP.<\/p>\n<p>Chiar dac\u0103 ar exista doar o mic\u0103 probabilitate ca Cloud Spanner s\u0103 includ\u0103 un motor HTAP (prelucrare hibrid\u0103 tranzac\u021bional\u0103\/analitic\u0103) scalabil orizontal, cu un set de func\u021bii OLAP (mai mult sau mai pu\u021bin) utilizabil, credem c\u0103 ar merita aten\u021bia noastr\u0103.<\/p>\n<p>Av\u00e2nd \u00een vedere acest aspect, am examinat urm\u0103toarele categorii:<\/p>\n<ul>\n<li>\u00cenc\u0103rcarea datelor, indici \u0219i suport pentru parti\u021bionare<\/li>\n<li>Performan\u021ba interog\u0103rilor \u0219i DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner \u00een c\u00e2teva cuvinte<\/h2>\n<p>\nGoogle Spanner este un sistem de gestionare a bazelor de date rela\u021bionale (RDBMS) de tip cluster, pe care Google \u00eel folose\u0219te pentru mai multe servicii proprii. Google l-a f\u0103cut disponibil publicului pentru utilizatorii Google Cloud Platform la \u00eenceputul anului 2017.<\/p>\n<p>Iat\u0103 c\u00e2teva dintre atributele Cloud Spanner:<\/p>\n<ul>\n<li>Cluster RDBMS foarte sincronizat \u0219i scalabil: folose\u0219te sincronizarea hardware a timpului pentru a asigura consisten\u021ba datelor.<\/li>\n<li>Suport pentru tranzac\u021bii \u00eencruci\u0219ate \u00eentre tabele: tranzac\u021biile pot cuprinde mai multe tabele - nu trebuie s\u0103 se limiteze la o singur\u0103 tabel\u0103 (spre deosebire de Apache HBase sau Apache Kudu).<\/li>\n<li>Tabele pe baza cheii primare: toate tabelele trebuie s\u0103 aib\u0103 o cheie primar\u0103 (PK) declarat\u0103, care poate consta din mai multe coloane ale tabelei. Datele tabelare sunt stocate \u00een ordinea PK, ceea ce le face foarte eficiente \u0219i rapide pentru c\u0103utarea dup\u0103 PK. Ca \u0219i alte sisteme bazate pe PK, implementarea trebuie s\u0103 fie modelat\u0103 cu privire la cazurile de utilizare preconizate, pentru a ob\u021bine <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">cea mai bun\u0103 performan\u021b\u0103<\/a><\/noindex>.<\/li>\n<li>Tabele intercalate: tabelele pot avea dependen\u021be fizice una fa\u021b\u0103 de cealalt\u0103. R\u00e2ndurile tabelului copil pot fi asociate cu r\u00e2ndurile tabelului p\u0103rinte. Aceast\u0103 abordare accelereaz\u0103 c\u0103utarea rela\u021biilor care pot fi definite \u00een etapa de modelare a datelor, de exemplu, \u00een cazul co-loc\u0103rii clien\u021bilor \u0219i a facturilor acestora.<\/li>\n<li>Indici: Cloud Spanner suport\u0103 indici secundari. Un index consta din coloanele indexate \u0219i toate coloanele cheie primare. La cerere, indexul poate con\u021bine \u0219i alte coloane neindexate. Indexul poate fi intercalat cu tabelul p\u0103rinte pentru a accelera interog\u0103rile. Indicii sunt supu\u0219i mai multor restric\u021bii, cum ar fi num\u0103rul maxim de coloane suplimentare stocate \u00een index. De asemenea, interog\u0103rile prin indici pot fi mai pu\u021bin directe dec\u00e2t \u00een alte SGBD-uri.<\/li>\n<\/ul>\n<p>\n<i>\u201eCloud Spanner alege indexul automat doar \u00een cazuri rare. \u00cen special, Cloud Spanner nu alege automat un index secundar dac\u0103 interogarea solicit\u0103 orice coloane care nu sunt stocate \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">index <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Acord de nivel de servicii (SLA): desf\u0103\u0219urare \u00eentr-o singur\u0103 regiune cu SLA de 99,99%; desf\u0103\u0219ur\u0103ri multiregionale cu SLA de 99,999%. De\u0219i acordul de nivel de servicii este, \u00een esen\u021b\u0103, doar un acord \u0219i nu o garan\u021bie, cred c\u0103 angaja\u021bii Google au date precise pentru a face o astfel de afirma\u021bie serioas\u0103. (Pentru referin\u021b\u0103, 99,999% \u00eenseamn\u0103 26,3 secunde de \u00eentrerupere a serviciului pe lun\u0103.)<\/li>\n<li>Mai mult: <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>Not\u0103:<\/b> Proiectul Apache Tephra adaug\u0103 suport extins pentru tranzac\u021bii \u00een Apache HBase (de asemenea, acum implementat \u00een Apache Phoenix ca versiune beta).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. Evaluarea noastr\u0103<\/h2>\n<p>\nA\u0219adar, am citit toate afirma\u021biile Google despre avantajele Cloud Spanner - scalarea orizontal\u0103 practic nelimitat\u0103, men\u021bin\u00e2nd \u00een acela\u0219i timp o consiten\u021b\u0103 ridicat\u0103 \u0219i un SLA foarte \u00eenalt. De\u0219i aceste cerin\u021be sunt, \u00een orice caz, extrem de greu de atins, scopul nostru nu a fost s\u0103 le contest\u0103m. \u00cen schimb, s\u0103 ne concentr\u0103m asupra altor aspecte care \u00eengrijoreaz\u0103 cei mai mul\u021bi utilizatori de baze de date: integritatea \u0219i u\u0219urin\u021ba de utilizare.<\/p>\n<h4>Am evaluat Cloud Spanner ca o \u00eenlocuire pentru Sharded MySQL<\/h4>\n<p>\nGoogle Cloud SQL \u0219i Amazon AWS RDS, dou\u0103 dintre cele mai populare SGBD-uri OLTP pe pia\u021ba cloud, dispun de un set foarte mare de func\u021bii. Totu\u0219i, pentru a scala aceste baze de date dincolo de dimensiunea unei singure instan\u021be, este necesar s\u0103 implementa\u021bi o fragmentare a aplica\u021biilor. Aceast\u0103 abordare genereaz\u0103 o complexitate suplimentar\u0103 at\u00e2t pentru aplica\u021bii, c\u00e2t \u0219i pentru administrare. Am analizat cum se integreaz\u0103 Spanner \u00een scenariul combin\u0103rii mai multor segmente \u00eentr-o singur\u0103 instan\u021b\u0103 \u0219i ce func\u021bii (dac\u0103 exist\u0103) ar putea fii necesar s\u0103 fie sacrificate.<\/p>\n<h4>Suport pentru SQL, DML \u0219i DDL, precum \u0219i conector \u0219i biblioteci?<\/h4>\n<p>\n\u00cen primul r\u00e2nd, la lansarea cu orice baz\u0103 de date, trebuie s\u0103 crea\u021bi un model de date. Dac\u0103 crede\u021bi c\u0103 pute\u021bi conecta JDBC Spanner la instrumentul dumneavoastr\u0103 SQL preferat, ve\u021bi descoperi c\u0103 pute\u021bi interoga datele cu ajutorul s\u0103u, dar nu pute\u021bi folosi pentru a crea tabele sau pentru modific\u0103ri (DDL) sau orice opera\u021biuni de inserare\/actualizare\/\u0219tergere (DML). JDBC oficial de la Google nu suport\u0103 niciuna dintre acestea.<\/p>\n<blockquote><p><i>\u201e\u00cen prezent, driverele nu suport\u0103 operatorii DML sau DDL.\u201d<\/i><br \/>\nDocumenta\u021bia Spanner<\/p><\/blockquote>\n<p>\nCu consola GCP situa\u021bia nu este mai bun\u0103 \u2014 pute\u021bi trimite doar interog\u0103ri SELECT. Din fericire, exist\u0103 un driver JDBC cu suport pentru DML \u0219i DDL de la comunitate, inclusiv tranzac\u021bii. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. De\u0219i acest driver este extrem de util, lipsa unui driver JDBC oficial din partea Google este surprinz\u0103toare. Din fericire, Google ofer\u0103 un suport destul de larg pentru bibliotecile client (bazate pe gRPC): C#, Go, Java, node.js, PHP, Python \u0219i Ruby.<\/p>\n<p>Utilizarea practic obligatorie a API-urilor personalizate Cloud Spanner (din cauza lipsei DDL \u0219i DML \u00een JDBC) impune anumite limit\u0103ri pentru zonele de cod conexe, cum ar fi pool-urile de conexiuni sau cadrele de leg\u0103tur\u0103 a bazei de date (de exemplu, Spring MVC). Ca regul\u0103 general\u0103, c\u00e2nd folosi\u021bi JDBC pute\u021bi alege liber pool-ul de conexiuni preferat (de exemplu, HikariCP, DBCP, C3PO etc.), care a fost testat \u0219i func\u021bioneaz\u0103 bine. \u00cen cazul API-urilor personalizate Spanner, trebuie s\u0103 ne baz\u0103m pe cadrele\/poolurile de leg\u0103turi\/sesiuni pe care le-am creat noi \u00een\u0219ine.<\/p>\n<p>Construc\u021bia orientat\u0103 pe cheia primar\u0103 (PK) permite Cloud Spanner s\u0103 fie foarte rapid \u00een accesarea datelor prin PK, dar duce \u0219i la unele probleme cu interog\u0103rile.<\/p>\n<ul>\n<li>Nu pute\u021bi actualiza valoarea cheii primare; trebuie mai \u00eent\u00e2i s\u0103 \u0219terge\u021bi \u00eenregistrarea cu PK-ul original \u0219i s\u0103 o insera\u021bi din nou cu o nou\u0103 valoare. (Aceasta este similar\u0103 cu alte baze de date\/mecanisme de stocare orientate pe PK.)<\/li>\n<li>To\u021bi operatorii UPDATE \u0219i DELETE trebuie s\u0103 indice PK \u00een WHERE, prin urmare, nu pot exista operatori DELETE unde s\u0103 se lase gol \u2014 trebuie s\u0103 existe \u00eentotdeauna o subinterogare, de exemplu: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Lipsa op\u021biunii de auto-increment sau orice altceva care stabile\u0219te o secven\u021b\u0103 pentru c\u00e2mpul PK. Pentru ca acest lucru s\u0103 func\u021bioneze, valoarea corespunz\u0103toare trebuie generat\u0103 din aplica\u021bie.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Indici secundari?<\/h4>\n<p>\nGoogle Cloud Spanner are suport \u00eencorporat pentru indicii secundari. Aceasta este o caracteristic\u0103 foarte pl\u0103cut\u0103, care nu este \u00eentotdeauna prezent\u0103 \u00een alte tehnologii. Apache Kudu nu suport\u0103 deloc indicii secundari \u00een prezent, iar Apache HBase nu suport\u0103 indicii \u00een mod direct, dar \u00eei poate ad\u0103uga prin Apache Phoenix.<\/p>\n<p>Indicii \u00een Kudu \u0219i HBase pot fi modela\u021bi ca o tabel\u0103 separat\u0103 cu un set diferit de chei primare, dar atomicitatea opera\u021biunilor efectuate cu tabela p\u0103rinte \u0219i tabelele de index asociate trebuie gestionat\u0103 la nivelul aplica\u021biei \u0219i nu este trivial\u0103 \u00een implementarea corect\u0103.<\/p>\n<p>A\u0219a cum s-a men\u021bionat \u00een recenzia Cloud Spanner, indicii s\u0103i pot diferi de indicii MySQL. Prin urmare, ar trebui s\u0103 fim deosebit de pruden\u021bi atunci c\u00e2nd construim interog\u0103ri \u0219i profil\u0103m, pentru a ne asigura c\u0103 folosim indicele corespunz\u0103tor acolo unde este necesar.<\/p>\n<h4>Vederi?<\/h4>\n<p>\nUn obiect foarte popular \u0219i util \u00een baza de date sunt vederile. Acestea pot fi utile pentru o mul\u021bime de cazuri de utilizare; dou\u0103 dintre preferatele mele sunt nivelul de abstractizare logic\u0103 \u0219i nivelul de securitate. Din p\u0103cate, Cloud Spanner nu suport\u0103 vederi. Cu toate acestea, aceasta ne limiteaz\u0103 doar par\u021bial, deoarece nu exist\u0103 detalii de permisiuni la nivel de coloan\u0103, unde vederile ar putea fi o solu\u021bie acceptabil\u0103.<\/p>\n<p>\u00cen documenta\u021bia Cloud Spanner, \u00een sec\u021biunea care descrie \u00een detaliu cotele \u0219i limitele (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), exist\u0103, \u00een special, una care poate fi problematica pentru unele aplica\u021bii: Cloud Spanner are, din fabric\u0103, o limitare de maximum 100 baze de date pe instan\u021b\u0103. Evident, aceasta poate deveni un obstacol major pentru o baz\u0103 de date care este destinat\u0103 s\u0103 scaleze la mai mult de 100 de baze de date. Din fericire, dup\u0103 ce am discutat cu reprezentantul nostru tehnic de la Google, am aflat c\u0103 aceast\u0103 limit\u0103 poate fi crescut\u0103 practic la orice valoare prin intermediul serviciului de suport Google.<\/p>\n<h4>Suport pentru dezvoltare?<\/h4>\n<p>\nCloud Spanner ofer\u0103 un suport destul de decent pentru limbajele de programare care lucreaz\u0103 cu API-ul s\u0103u. Bibliotecile oficiale suportate sunt \u00een domeniul C#, Go, Java, node.js, PHP, Python \u0219i Ruby. Documenta\u021bia este destul de detaliat\u0103, dar, ca \u00een cazul altor tehnologii avansate, comunitatea este destul de mic\u0103 \u00een compara\u021bie cu cele mai populare tehnologii de baze de date, ceea ce poate duce la o cre\u0219tere a timpului necesar pentru a rezolva cazurile de utilizare sau problemele mai pu\u021bin comune.<\/p>\n<h4>A\u0219adar, ce zici de suportul pentru dezvoltarea local\u0103?<\/h4>\n<p>\nNu am g\u0103sit o modalitate de a crea o instan\u021b\u0103 Cloud Spanner \u00een medii locale. Cel mai apropiat lucru pe care l-am ob\u021binut este o imagine Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, care este, \u00een principiu, similar\u0103, dar \u00een practic\u0103 difer\u0103 considerabil. De exemplu, CockroachDB poate utiliza PostgreSQL JDBC. Deoarece mediu de dezvoltare ar trebui s\u0103 fie c\u00e2t mai aproape de mediul de produc\u021bie, Cloud Spanner nu este ideal, deoarece trebuie s\u0103 te bazezi pe o instan\u021b\u0103 complet\u0103 Spanner. Pentru a economisi costurile, po\u021bi alege o instan\u021b\u0103 \u00eentr-o singur\u0103 regiune.<\/p>\n<h4>Suport pentru administrare?<\/h4>\n<p>\nCrearea unei instan\u021be Cloud Spanner este foarte simpl\u0103. Trebuie doar s\u0103 alegi \u00eentre crearea unei instan\u021be multiregiune sau a uneia pentru o singur\u0103 regiune, s\u0103 indici regiunea(e) \u0219i num\u0103rul de noduri. \u00cen mai pu\u021bin de un minut, instan\u021ba va fi pornit\u0103 \u0219i gata de lucru.<\/p>\n<p>C\u00e2teva metrici de baz\u0103 sunt disponibile direct pe pagina Spanner din consola Google. Vederi mai detaliate sunt disponibile prin Stackdriver, unde po\u021bi, de asemenea, s\u0103 stabile\u0219ti limite pentru metrici \u0219i politici de alert\u0103.<\/p>\n<h4>Acces la resurse?<\/h4>\n<p>\nMySQL ofer\u0103 set\u0103ri extinse \u0219i foarte detaliate pentru permisiunile\/rolurile utilizatorilor. Accesul la o anumit\u0103 tabel\u0103 sau chiar la un subgrup al coloanelor acesteia poate fi configurat cu u\u0219urin\u021b\u0103. Cloud Spanner utilizeaz\u0103 instrumentul Google Identity &amp; Access Management (IAM), care permite stabilirea politicilor \u0219i permisiunilor doar la un nivel foarte \u00eenalt. Cea mai detaliat\u0103 op\u021biune este permisiunea la nivel de baz\u0103 de date, care nu se \u00eencadreaz\u0103 \u00een majoritatea cazurilor de utilizare \u00een produc\u021bie. Aceast\u0103 restric\u021bie te oblig\u0103 s\u0103 adaugi m\u0103suri suplimentare de securitate \u00een codul, infrastructura, sau ambele pentru a preveni utilizarea neautorizat\u0103 a resurselor Spanner.<\/p>\n<h4>Backup-uri?<\/h4>\n<p>\nPe scurt, nu exist\u0103 backup-uri \u00een Cloud Spanner. De\u0219i cerin\u021bele ridicate ale SLA-ului Google pot garanta c\u0103 nu vei pierde date din cauza defect\u0103rii hardware-ului sau a bazei de date, gre\u0219elilor umane, defectelor aplica\u021biilor etc., \u0219tim cu to\u021bii regula: disponibilitatea ridicat\u0103 nu \u00eenlocuie\u0219te o strategie de backup rezonabil\u0103. \u00cen prezent, singura modalitate de a face backup datelor este prin transmiterea lor programatic\u0103 din baza de date \u00eentr-un mediu de stocare separat.<\/p>\n<h4>Performan\u021ba interog\u0103rilor?<\/h4>\n<p>\nPentru \u00eenc\u0103rcarea datelor \u0219i testarea interog\u0103rilor, am folosit Yahoo! Cloud Serving Benchmark. Tabelul de mai jos prezint\u0103 sarcina de lucru B YCSB cu un raport de citire de 95% \u0219i scriere de 5%.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Testul de \u00eenc\u0103rcare a fost efectuat pe engine-ul de calcul (CE) n1-standard-32 (32 vCPU, 120 GB RAM), iar instan\u021ba de testare nu a fost niciodat\u0103 un punct slab \u00een teste.<\/i><br \/>\n<i>** Num\u0103rul maxim de fire \u00eentr-o instan\u021b\u0103 YCSB este de 400. A fost necesar s\u0103 se execute \u0219ase instan\u021be paralele ale testelor YCSB, pentru a ob\u021bine \u00een total 2400 de fire.<\/i><\/p>\n<p>Privind rezultatele testelor, \u00een special combina\u021bia de sarcin\u0103 pe procesor \u0219i TPS, vedem clar c\u0103 Cloud Spanner se scaleaz\u0103 destul de bine. Sarcina mare generat\u0103 de un num\u0103r mare de fire este compensat\u0103 de un num\u0103r considerabil de noduri \u00een clusterul Cloud Spanner. De\u0219i laten\u021ba pare destul de mare, \u00een special atunci c\u00e2nd se lucreaz\u0103 cu 2400 de fire, poate fi necesar s\u0103 se efectueze teste suplimentare cu 6 instan\u021be mai mici ale motorului de calcul pentru a ob\u021bine numere mai precise. Fiecare instan\u021b\u0103 va rula un test YCSB \u00een loc de o singur\u0103 instan\u021b\u0103 mare CE cu 6 teste paralele. Astfel, va fi mai u\u0219or s\u0103 distingi \u00eentre laten\u021bele cererilor Cloud Spanner \u0219i laten\u021bele ad\u0103ugate de conexiunea de re\u021bea \u00eentre Cloud Spanner \u0219i instan\u021ba CE pe care se efectueaz\u0103 testul.<\/p>\n<h3>Cum se descurc\u0103 Cloud Spanner ca OLAP?<\/h3>\n<p><\/p>\n<h4>Partitionarea?<\/h4>\n<p>\n\u00cemp\u0103r\u021birea datelor \u00een segmente fizic \u0219i\/sau logic independente, numite partitii, este un concept foarte popular, specific majorit\u0103\u021bii mecanismelor OLAP. Partitiile pot \u00eembun\u0103t\u0103\u021bi semnificativ performan\u021ba interog\u0103rilor \u0219i mentenan\u021ba bazei de date. O aprofundare a partitiiilor ar necesita un articol (articole) separat, a\u0219adar s\u0103 men\u021bion\u0103m doar importan\u021ba existen\u021bei unei scheme de partitionare \u0219i sub-partitionare. Capacitatea de a \u00eemp\u0103r\u021bi datele \u00een partitii \u0219i chiar mai departe \u00een subparti\u021bii este esen\u021bial\u0103 pentru performan\u021ba interog\u0103rilor analitice.<\/p>\n<p>Cloud Spanner nu suport\u0103 partitii \u00een sine. El \u00eemparte datele \u00een interior \u00een a\u0219a-numitele <i>split<\/i>-uri, pe baza intervalelor de cheie primar\u0103. \u00cemp\u0103r\u021birea se face automat pentru a echilibra sarcina \u00een clusterul Cloud Spanner. O caracteristic\u0103 foarte convenabil\u0103 a Cloud Spanner este c\u0103 se \u00eemparte sarcina de baz\u0103 a tabelului p\u0103rinte (tabel care nu alterneaz\u0103 cu altul). Spanner determin\u0103 automat dac\u0103 <i>split <\/i>datele sunt accesate mai frecvent dec\u00e2t datele din alte <i>split<\/i>-uri \u0219i poate lua decizia de a desparte \u0219i mai mult. Astfel, mai multe noduri pot fi implicate \u00een interogare, ceea ce cre\u0219te eficien\u021ba l\u0103\u021bimii de band\u0103.<\/p>\n<h4>\u00cenc\u0103rcarea datelor?<\/h4>\n<p>\nMetoda Cloud Spanner pentru date voluminoase este similar\u0103 cu \u00eenc\u0103rcarea obi\u0219nuit\u0103. Pentru a atinge performan\u021ba maxim\u0103, trebuie s\u0103 urma\u021bi c\u00e2teva recomand\u0103ri, inclusiv:<\/p>\n<ul>\n<li>Sorteaz\u0103 datele tale dup\u0103 cheia primar\u0103.<\/li>\n<li>\u00cemp\u0103r\u021bi\u021bi-le \u00een 10*<i>num\u0103rul de noduri<\/i> sec\u021biuni separate.<\/li>\n<li>Creeaz\u0103 un set de sarcini de lucru care s\u0103 \u00eencarce datele \u00een paralel.<\/li>\n<\/ul>\n<p>\nPentru aceast\u0103 \u00eenc\u0103rcare de date se folosesc toate nodurile Cloud Spanner.<\/p>\n<p>Am folosit sarcina de lucru A YCSB pentru a genera un set de date din 10M de r\u00e2nduri.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Testul de \u00eenc\u0103rcare a fost efectuat pe un motor de calcul n1-standard-32 (32 vCPU, 120 GB RAM), iar instan\u021ba de testare nu a fost niciodat\u0103 un blocaj \u00een teste.<br \/>\n** Configura\u021bia cu 1 nod nu este recomandat\u0103 pentru nicio sarcin\u0103 de produc\u021bie.<\/i><\/p>\n<p>Dup\u0103 cum s-a men\u021bionat anterior, Cloud Spanner gestioneaz\u0103 automat diviz\u0103rile \u00een func\u021bie de sarcina acestora, astfel \u00eenc\u00e2t rezultatele se \u00eembun\u0103t\u0103\u021besc dup\u0103 c\u00e2teva repeti\u021bii succesive ale testului. Rezultatele prezentate aici sunt cele mai bune rezultate pe care le-am ob\u021binut. Privind numerele de mai sus, putem observa cum Cloud Spanner se scaleaz\u0103 bine cu cre\u0219terea num\u0103rului de noduri din cluster. Numerele care ies \u00een eviden\u021b\u0103 reprezint\u0103 laten\u021be medii extrem de sc\u0103zute, care contrasteaz\u0103 cu rezultatele sarcinilor de lucru mixte (95% pentru citire \u0219i 5% pentru scriere), a\u0219a cum este descris \u00een sec\u021biunea de mai sus.<\/p>\n<h4>Scalare?<\/h4>\n<p>\nCre\u0219terea \u0219i reducerea num\u0103rului de noduri Cloud Spanner este o sarcin\u0103 realizat\u0103 cu un singur clic. Dac\u0103 dori\u021bi s\u0103 \u00eenc\u0103rca\u021bi rapid datele, pute\u021bi lua \u00een considerare maximizarea instan\u021bei (\u00een cazul nostru a fost de 25 de noduri \u00een regiunea US-EAST), apoi s\u0103 reduce\u021bi num\u0103rul de noduri potrivit pentru \u00eenc\u0103rcarea dumneavoastr\u0103 obi\u0219nuit\u0103, dup\u0103 ce toate datele sunt \u00een baza de date, av\u00e2nd \u00een vedere limita de 2 TB\/nod.<\/p>\n<p>Am fost reaminti\u021bi de aceast\u0103 limit\u0103 chiar \u0219i cu o baz\u0103 de date mult mai mic\u0103. Dup\u0103 c\u00e2teva runde de teste de \u00eenc\u0103rcare, baza noastr\u0103 de date avea o dimensiune de aproximativ 155 GB, iar c\u00e2nd am redus la o instan\u021b\u0103 cu 1 nod, am primit urm\u0103toarea eroare:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm reu\u0219it s\u0103 reducem scalarea de la 25 la 2 instan\u021be, dar am r\u0103mas bloca\u021bi cu dou\u0103 noduri.<\/p>\n<p>Cre\u0219terea \u0219i mic\u0219orarea num\u0103rului de noduri din clusterul Cloud Spanner poate fi automatizat\u0103 prin intermediul REST API-ului. Aceasta poate fi deosebit de util\u0103 pentru reducerea \u00eenc\u0103rc\u0103turii mari asupra sistemului \u00een orele de v\u00e2rf.<\/p>\n<h4>Performan\u021ba interog\u0103rilor OLAP?<\/h4>\n<p>\nIni\u021bial, am planificat s\u0103 aloc\u0103m un timp considerabil evalu\u0103rii noastre asupra Spanner pentru aceast\u0103 parte. Dup\u0103 c\u00e2teva SELECT COUNT, ne-am dat seama imediat c\u0103 testarea va fi scurt\u0103 \u0219i c\u0103 Spanner NU va fi un motor potrivit pentru OLAP. Indiferent de num\u0103rul de noduri din cluster, simpla interogare a num\u0103rului de r\u00e2nduri dintr-o tabel\u0103 cu 10M de r\u00e2nduri a durat \u00eentre 55 \u0219i 60 de secunde. \u00cen plus, orice interogare care necesita o cantitate mai mare de memorie pentru stocarea rezultatelor intermediare a e\u0219uat cu eroarea OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M valori distincte)-&gt; SpoolingHashAggregateIterator a r\u0103mas f\u0103r\u0103 memorie \u00een timpul ad\u0103ug\u0103rii unui nou r\u00e2nd.<\/code><\/p>\n<p>Unele cifre pentru interog\u0103rile TPC-H pot fi g\u0103site \u00een articolul lui 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>, diapozitivele 42 \u0219i 43. Aceste cifre sunt \u00een concordan\u021b\u0103 cu propriile noastre rezultate (din p\u0103cate).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: bun, r\u0103u, ur\u00e2t\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Concluziile noastre<\/h4>\n<p>\nAv\u00e2nd \u00een vedere starea actual\u0103 a func\u021biilor Cloud Spanner, este greu de imaginat c\u0103 poate fi o \u00eenlocuire simpl\u0103 pentru solu\u021biile OLTP existente, mai ales c\u00e2nd nevoile dumneavoastr\u0103 vor dep\u0103\u0219i limitele sale. Ar trebui s\u0103 fie cheltuit un timp considerabil pentru a construi o solu\u021bie care s\u0103 \u021bin\u0103 cont de dezavantajele Cloud Spanner.<\/p>\n<p>C\u00e2nd am \u00eenceput evaluarea Cloud Spanner, ne-am a\u0219teptat ca func\u021biile de gestionare s\u0103 fie la nivelul altor solu\u021bii Google SQL, sau cel pu\u021bin nu foarte departe de ele. Dar am fost surprin\u0219i de lipsa total\u0103 a copiilor de siguran\u021b\u0103 \u0219i de controlul extrem de limitat al accesului la resurse. Nefiind men\u021bionat lipsa vederilor, a mediului local de dezvoltare, a secven\u021belor neacceptate, JDBC f\u0103r\u0103 suport DML \u0219i DDL \u0219i a\u0219a mai departe.<\/p>\n<p>A\u0219adar, unde s\u0103 se duc\u0103 cineva care trebuie s\u0103 scaleze o baz\u0103 de date tranzac\u021bional\u0103? Se pare c\u0103 pe pia\u021b\u0103 nu exist\u0103 \u00eenc\u0103 o solu\u021bie unic\u0103 care s\u0103 se potriveasc\u0103 tuturor cazurilor de utilizare. Exist\u0103 multe solu\u021bii cu cod surs\u0103 \u00eenchis \u0219i deschis (unele dintre ele fiind men\u021bionate \u00een acest articol), fiecare av\u00e2nd punctele sale forte \u0219i slabe, dar niciuna dintre ele nu ofer\u0103 un SaaS cu SLA de 99,999% \u0219i un grad \u00eenalt de consisten\u021b\u0103. Dac\u0103 un nivel ridicat de SLA este obiectivul dumneavoastr\u0103 principal \u0219i nu sunte\u021bi dispus s\u0103 crea\u021bi o solu\u021bie proprie pentru medii cloud multiple, Cloud Spanner ar putea fi solu\u021bia pe care o c\u0103uta\u021bi. Dar trebuie s\u0103 fi\u021bi con\u0219tien\u021bi de toate limit\u0103rile sale.<\/p>\n<p>Pentru corectitudine, trebuie men\u021bionat c\u0103 Cloud Spanner a fost lansat pentru accesul public abia \u00een prim\u0103vara anului 2017, a\u0219a c\u0103 este rezonabil s\u0103 ne a\u0219tept\u0103m ca unele dintre deficien\u021bele sale actuale s\u0103 dispar\u0103 \u00een cele din urm\u0103 (sper\u0103m), iar c\u00e2nd se va \u00eent\u00e2mpla acest lucru, ar putea schimba jocul. La urma urmei, Cloud Spanner nu este doar un proiect de ni\u0219\u0103 pentru Google. Google \u00eel folose\u0219te ca baz\u0103 pentru alte produse Google. Iar c\u00e2nd Google a \u00eenlocuit recent Megastore \u00een Google Cloud Storage cu Cloud Spanner, acest lucru a permis Google Cloud Storage s\u0103 devin\u0103 strict consistent pentru listele de obiecte la nivel mondial (ceea ce nu se aplic\u0103 \u00eenc\u0103 pentru <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<\/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>A\u0219adar, speran\u021ba \u00eenc\u0103 exist\u0103\u2026 sper\u0103m.<\/p>\n<p>Aceasta este tot. La fel ca autorul articolului, \u0219i noi continu\u0103m s\u0103 sper\u0103m, dar voi ce p\u0103rere ave\u021bi despre asta? Scrie\u021bi \u00een comentarii.<\/p>\n<p><b>\u00cei invit\u0103m pe to\u021bi s\u0103 viziteze <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">webinarul gratuit<\/a><\/noindex> \u00een cadrul c\u0103ruia vom detalia cursul<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS pentru dezvoltatori\u00bb<\/a><\/noindex> de la OTUS.<\/b><br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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: bun, r\u0103u, r\u0103u | ProHoster","description":"Salut, Habrani. Din nou, continu\u0103m s\u0103 \u00eemp\u0103rt\u0103\u0219im materiale interesante \u00eenainte de \u00eenceperea noilor cursuri.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/69568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}