{"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\/pl\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: dobry, z\u0142y, brzydki","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Cze\u015b\u0107, Hubrowicze. Zgodnie z tradycj\u0105, kontynuujemy dzielenie si\u0119 ciekawymi materia\u0142ami w przeddzie\u0144 rozpocz\u0119cia nowych kurs\u00f3w. Dzisiaj specjalnie dla was przet\u0142umaczyli\u015bmy artyku\u0142 o Google Cloud Spanner, dostosowuj\u0105c go do uruchomienia kursu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u201eAWS dla programist\u00f3w\u201d<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Pierwotnie opublikowano w <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">blogu Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>Jako firma, kt\u00f3ra oferuje wiele chmurowych rozwi\u0105za\u0144 POS dla detalist\u00f3w, restaurator\u00f3w i sprzedawc\u00f3w internetowych na ca\u0142ym \u015bwiecie, Lightspeed korzysta z kilku r\u00f3\u017cnych typ\u00f3w platform baz danych do wielu transakcyjnych, analitycznych i wyszukiwawczych przypadk\u00f3w u\u017cycia. Ka\u017cda z tych platform baz danych ma swoje mocne i s\u0142abe strony. Dlatego, kiedy Google wprowadzi\u0142 na rynek Cloud Spanner \u2014 obiecuj\u0105ce funkcje, niespotykane w \u015bwiecie relacyjnych baz danych, takie jak praktycznie nieograniczona horyzontalna skalowalno\u015b\u0107 i 99,999% umowa o poziomie us\u0142ug (SLA) \u2014 nie mogli\u015bmy przegapi\u0107 okazji, aby zdoby\u0107 j\u0105 w nasze r\u0119ce!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAby da\u0107 wyczerpuj\u0105cy przegl\u0105d naszego do\u015bwiadczenia z Cloud Spanner, a tak\u017ce kryteri\u00f3w oceny, kt\u00f3re wykorzystali\u015bmy, om\u00f3wimy nast\u0119puj\u0105ce tematy:<\/p>\n<ol>\n<li>Nasze kryteria oceny<\/li>\n<li>Cloud Spanner w dw\u00f3ch s\u0142owach<\/li>\n<li>Nasza ocena<\/li>\n<li>Nasze wnioski<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. Nasze kryteria oceny<\/h2>\n<p>\nZanim przejdziemy do szczeg\u00f3\u0142owych funkcji Cloud Spanner, jej podobie\u0144stw i r\u00f3\u017cnic w stosunku do innych rozwi\u0105za\u0144 na rynku, porozmawiajmy najpierw o podstawowych przypadkach u\u017cycia, kt\u00f3re mieli\u015bmy na my\u015bli, rozwa\u017caj\u0105c kwesti\u0119, gdzie wdro\u017cy\u0107 Cloud Spanner w naszej infrastrukturze:<\/p>\n<ul>\n<li>Jako alternatywa (przewaga) tradycyjnego rozwi\u0105zania dla baz danych SQL<\/li>\n<li>Jako rozwi\u0105zanie OLTP z obs\u0142ug\u0105 OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Uwaga:<\/b> Dla uproszczenia i wygody por\u00f3wnania ten artyku\u0142 por\u00f3wnuje Cloud Spanner z opcjami MySQL rodzin rozwi\u0105za\u0144 GCP Cloud SQL i Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Wykorzystanie Cloud Spanner jako alternatywy dla tradycyjnego rozwi\u0105zania dla baz danych SQL<\/h4>\n<p>\nW \u015brodowisku <i>tradycyjnych <\/i>baz danych, kiedy czas reakcji na zapytanie do bazy danych zbli\u017ca si\u0119 lub nawet przekracza wcze\u015bniej okre\u015blone warto\u015bci progowe aplikacji (g\u0142\u00f3wnie z powodu wzrostu liczby u\u017cytkownik\u00f3w i\/lub zapyta\u0144), istnieje kilka sposob\u00f3w na obni\u017cenie czasu reakcji do akceptowalnych poziom\u00f3w. Jednak wi\u0119kszo\u015b\u0107 z tych rozwi\u0105za\u0144 wymaga r\u0119cznej interwencji.<\/p>\n<p>Na przyk\u0142ad, pierwszym krokiem, kt\u00f3ry nale\u017cy podj\u0105\u0107, jest przyjrzenie si\u0119 r\u00f3\u017cnym parametrom bazy danych zwi\u0105zanym z wydajno\u015bci\u0105 i ich dostosowanie, aby najlepiej odpowiada\u0142y wzorcom scenariuszy u\u017cytkowania aplikacji. Je\u015bli to oka\u017ce si\u0119 niewystarczaj\u0105ce, mo\u017cna wybra\u0107 skalowanie bazy danych w pionie lub w poziomie.<\/p>\n<p>Skalowanie pionowe aplikacji polega na aktualizacji instancji serwera, zazwyczaj poprzez dodanie wi\u0119kszej liczby procesor\u00f3w\/rdzeni, wi\u0119kszej ilo\u015bci pami\u0119ci RAM, szybszej pami\u0119ci masowej itp. Dodanie wi\u0119kszej ilo\u015bci zasob\u00f3w sprz\u0119towych prowadzi do zwi\u0119kszenia wydajno\u015bci bazy danych, mierzonej g\u0142\u00f3wnie w transakcjach na sekund\u0119 oraz op\u00f3\u017anieniu transakcji dla system\u00f3w OLTP. Systemy relacyjnych baz danych (kt\u00f3re wykorzystuj\u0105 podej\u015bcie wielow\u0105tkowe), takie jak MySQL, dobrze skaluj\u0105 si\u0119 w pionie.<\/p>\n<p>Podej\u015bcie to ma kilka wad, ale najbardziej oczywist\u0105 jest maksymalny rozmiar serwera dost\u0119pnego na rynku. Gdy osi\u0105gni\u0119ty zostanie limit najwi\u0119kszej instancji serwera, pozostaje tylko jedno rozwi\u0105zanie: skalowanie poziome.<\/p>\n<p>Skalowanie poziome to podej\u015bcie, w kt\u00f3rym do klastra dodawane s\u0105 kolejne serwery, aby idealnie liniowo zwi\u0119ksza\u0107 wydajno\u015b\u0107 wraz z dodawaniem liczby serwer\u00f3w. Wi\u0119kszo\u015b\u0107 <i>tradycyjnych <\/i>system\u00f3w baz danych s\u0142abo skaluj\u0119 si\u0119 w poziomie lub w og\u00f3le nie skaluj\u0105. Na przyk\u0142ad MySQL mo\u017ce by\u0107 skalowany poziomo dla operacji odczytu, dodaj\u0105c niewolnik\u00f3w-odczytywaczy, ale nie mo\u017ce by\u0107 skalowany poziomo dla operacji zapisu.<\/p>\n<p>Z drugiej strony, dzi\u0119ki swojej naturze, Cloud Spanner mo\u017ce \u0142atwo skalowa\u0107 si\u0119 w poziomie przy minimalnej ingerencji.<\/p>\n<p>W pe\u0142ni funkcjonalna<i> Baza danych jako us\u0142uga<\/i> powinna by\u0107 oceniana z r\u00f3\u017cnych perspektyw. Za punkt wyj\u015bcia wzi\u0119li\u015bmy najbardziej popularn\u0105 baz\u0119 danych w chmurze \u2014 dla Google, GCP Cloud SQL i dla Amazona, AWS RDS. W naszej ocenie skupili\u015bmy si\u0119 na nast\u0119puj\u0105cych kategoriach:<\/p>\n<ul>\n<li>Por\u00f3wnanie funkcji: zakres SQL, DDL, DML; biblioteki po\u0142\u0105cze\u0144\/konektory, wsparcie dla transakcji i tak dalej.<\/li>\n<li>Wsparcie dla rozwoju: \u0142atwo\u015b\u0107 w tworzeniu i testowaniu.<\/li>\n<li>Wsparcie administracyjne: zarz\u0105dzanie instancjami \u2014 na przyk\u0142ad, skalowanie w g\u00f3r\u0119\/w d\u00f3\u0142 i aktualizacja instancji; SLA, backup i odzyskiwanie; bezpiecze\u0144stwo\/kontrola dost\u0119pu.<\/li>\n<\/ul>\n<p><\/p>\n<h4>U\u017cycie Cloud Spanner jako rozwi\u0105zania OLTP z wsparciem OLAP<\/h4>\n<p>\nCho\u0107 Google wyra\u017anie nie twierdzi, \u017ce Cloud Spanner jest przeznaczony do przetwarzania analitycznego, dzieli on niekt\u00f3re atrybuty z innymi mechanizmami, takimi jak Apache Impala &amp; Kudu i YugaByte, kt\u00f3re s\u0105 przeznaczone do obci\u0105\u017ce\u0144 OLAP.<\/p>\n<p>Nawet je\u015bli istnia\u0142a tylko niewielka szansa, \u017ce Cloud Spanner zawiera\u0142by zgodny, poziomo skalowalny silnik HTAP (hybrydowego przetwarzania transakcyjnego\/analitycznego) z (bardziej lub mniej) u\u017cytecznym zestawem funkcji OLAP, uwa\u017camy, \u017ce zas\u0142ugiwa\u0142oby to na nasz\u0105 uwag\u0119.<\/p>\n<p>Maj\u0105c to na uwadze, rozwa\u017cylismy nast\u0119puj\u0105ce kategorie:<\/p>\n<ul>\n<li>\u0141adowanie danych, indeksy i wsparcie partycjonowania<\/li>\n<li>Wydajno\u015b\u0107 zapyta\u0144 i DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner w dw\u00f3ch s\u0142owach<\/h2>\n<p>\nGoogle Spanner to klastrowy system zarz\u0105dzania relacyjnymi bazami danych (RDBMS), kt\u00f3ry Google wykorzystuje do kilku swoich us\u0142ug. Google udost\u0119pni\u0142 go publicznie u\u017cytkownikom Google Cloud Platform na pocz\u0105tku 2017 roku.<\/p>\n<p>Oto niekt\u00f3re z atrybut\u00f3w Cloud Spanner:<\/p>\n<ul>\n<li>Silnie zgodny, skalowalny klaster RDBMS: wykorzystuje sprz\u0119tow\u0105 synchronizacj\u0119 czasu w celu zapewnienia sp\u00f3jno\u015bci danych.<\/li>\n<li>Wsparcie transakcji mi\u0119dzy tabelami: transakcje mog\u0105 obejmowa\u0107 wiele tabel \u2014 nie musz\u0105 by\u0107 ograniczone do jednej tabeli (w przeciwie\u0144stwie do Apache HBase czy Apache Kudu).<\/li>\n<li>Tabele oparte na kluczu g\u0142\u00f3wnym: wszystkie tabele musz\u0105 mie\u0107 zadeklarowany klucz g\u0142\u00f3wny (PK), kt\u00f3ry mo\u017ce sk\u0142ada\u0107 si\u0119 z wielu kolumn tabeli. Dane tabelaryczne przechowywane s\u0105 w kolejno\u015bci PK, co czyni je bardzo efektywnymi i szybkim w wyszukiwaniu po PK. Jak w innych systemach opartych na PK, wdro\u017cenie musi by\u0107 modelowane z uwzgl\u0119dnieniem wcze\u015bniej przemy\u015blanych przypadk\u00f3w u\u017cycia dla osi\u0105gni\u0119cia <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">najlepszej wydajno\u015bci<\/a><\/noindex>.<\/li>\n<li>Tabela naprzemienna: tabele mog\u0105 mie\u0107 fizyczne zale\u017cno\u015bci od siebie nawzajem. Wiersze tabeli podrz\u0119dnej mog\u0105 by\u0107 powi\u0105zane z wierszami tabeli nadrz\u0119dnej. Takie podej\u015bcie przyspiesza wyszukiwanie relacji, kt\u00f3re mo\u017cna zdefiniowa\u0107 na etapie modelowania danych, na przyk\u0142ad przy wsp\u00f3lnym rozmieszczeniu klient\u00f3w i ich faktur.<\/li>\n<li>Indeksy: Cloud Spanner obs\u0142uguje indeksy wt\u00f3rne. Indeks sk\u0142ada si\u0119 z indeksowanych kolumn i wszystkich kolumn PK. Na \u017cyczenie indeks mo\u017ce r\u00f3wnie\u017c zawiera\u0107 inne nieindeksowane kolumny. Indeks mo\u017ce by\u0107 naprzemiennie z tabel\u0105 nadrz\u0119dn\u0105 w celu przyspieszenia zapyta\u0144. W przypadku indeks\u00f3w stosuje si\u0119 kilka ogranicze\u0144, na przyk\u0142ad maksymaln\u0105 liczb\u0119 dodatkowych kolumn przechowywanych w indeksie. Zapytania poprzez indeksy mog\u0105 by\u0107 r\u00f3wnie\u017c mniej bezpo\u015brednie ni\u017c w innych RDBMS.<\/li>\n<\/ul>\n<p>\n<i>Cloud Spanner automatycznie wybiera indeks tylko w rzadkich przypadkach. W szczeg\u00f3lno\u015bci Cloud Spanner nie wybiera automatycznie indeksu wt\u00f3rnego, je\u015bli zapytanie \u017c\u0105da jakichkolwiek kolumn, kt\u00f3re nie s\u0105 zapisane w <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">indeksie <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Umowa o poziomie us\u0142ug (SLA): wdro\u017cenie w jednym regionie z SLA wynosz\u0105cym 99,99%; wdro\u017cenia multiregionowe z SLA wynosz\u0105cym 99,999%. Chocia\u017c sama umowa o poziomie us\u0142ug jest tylko umow\u0105, a nie \u017cadn\u0105 gwarancj\u0105, uwa\u017cam, \u017ce pracownicy Google rzeczywi\u015bcie maj\u0105 pewne dok\u0142adne dane, aby z\u0142o\u017cy\u0107 tak powa\u017cne stwierdzenie. (Dla por\u00f3wnania, 99,999% oznacza 26,3 sekundy niedost\u0119pno\u015bci us\u0142ugi w miesi\u0105cu.)<\/li>\n<li>Wi\u0119cej: <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>Uwaga:<\/b> Projekt Apache Tephra dodaje rozszerzone wsparcie dla transakcji w Apache HBase (teraz r\u00f3wnie\u017c wdro\u017cony w Apache Phoenix jako wersja beta).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>Nasza ocena<\/h2>\n<p>\nWszyscy czytali\u015bmy stwierdzenia Google na temat zalet Cloud Spanner \u2013 praktycznie nieograniczone poziome skalowanie przy utrzymaniu wysokiej sp\u00f3jno\u015bci i bardzo wysokiego SLA. Chocia\u017c te wymagania s\u0105 w ka\u017cdym razie niezwykle trudne do osi\u0105gni\u0119cia, naszym celem nie by\u0142o ich obalenie. Zamiast tego skupmy si\u0119 na innych rzeczach, kt\u00f3re martwi\u0105 wi\u0119kszo\u015b\u0107 u\u017cytkownik\u00f3w baz danych: prostota i u\u017cyteczno\u015b\u0107.<\/p>\n<h4>Ocenili\u015bmy Cloud Spanner jako alternatyw\u0119 dla Sharded MySQL<\/h4>\n<p>\nGoogle Cloud SQL i Amazon AWS RDS, dwie najbardziej popularne OLTP bazy danych na rynku chmurowym, oferuj\u0105 bardzo szeroki zestaw funkcji. Niemniej jednak, aby skalowa\u0107 te bazy danych poza rozmiar jednego w\u0119z\u0142a, konieczne jest dzielenie aplikacji. Takie podej\u015bcie tworzy dodatkow\u0105 z\u0142o\u017cono\u015b\u0107 zar\u00f3wno dla aplikacji, jak i dla administracji. Sprawdzili\u015bmy, jak Spanner wpisuje si\u0119 w scenariusz \u0142\u0105czenia kilku segment\u00f3w w jeden instans oraz z jakimi funkcjami (o ile takie istniej\u0105) mo\u017cna si\u0119 zmierzy\u0107.<\/p>\n<h4>Wsparcie dla SQL, DML i DDL, a tak\u017ce konektor i biblioteki?<\/h4>\n<p>\nPo pierwsze, uruchamiaj\u0105c jak\u0105kolwiek baz\u0119 danych, nale\u017cy stworzy\u0107 model danych. Je\u015bli my\u015blisz, \u017ce mo\u017cesz pod\u0142\u0105czy\u0107 JDBC Spanner do swojego ulubionego narz\u0119dzia SQL, przekonasz si\u0119, \u017ce mo\u017cesz za jego pomoc\u0105 zapytywa\u0107 swoje dane, ale nie mo\u017cesz go u\u017cywa\u0107 do tworzenia tabel ani do modyfikacji (DDL) lub wszelkich operacji wstawiania\/aktualizacji\/usuwania (DML). Oficjalny JDBC od Google nie wspiera ani jednego, ani drugiego.<\/p>\n<blockquote><p><i>\u201eObecnie sterowniki nie wspieraj\u0105 operator\u00f3w DML ani DDL.\u201d<\/i><br \/>\nDokumentacja Spanner<\/p><\/blockquote>\n<p>\nSytuacja z konsol\u0105 GCP nie jest lepsza \u2014 mo\u017cesz wysy\u0142a\u0107 tylko zapytania SELECT. Na szcz\u0119\u015bcie istnieje sterownik JDBC z wsparciem dla DML i DDL od spo\u0142eczno\u015bci, \u0142\u0105cznie z transakcjami. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. Chocia\u017c ten sterownik jest niezwykle u\u017cyteczny, brak w\u0142asnego sterownika JDBC od Google budzi zdziwienie. Na szcz\u0119\u015bcie Google oferuje do\u015b\u0107 szerokie wsparcie dla bibliotek klienckich (opartych na gRPC): C#, Go, Java, node.js, PHP, Python i Ruby.<\/p>\n<p>Praktycznie obowi\u0105zkowe korzystanie z interfejs\u00f3w API Cloud Spanner (z powodu braku DDL i DML w JDBC) prowadzi do pewnych ogranicze\u0144 dla powi\u0105zanych obszar\u00f3w kodu, takich jak pule po\u0142\u0105cze\u0144 czy ramy powi\u0105za\u0144 z baz\u0105 danych (np. Spring MVC). Z regu\u0142y przy u\u017cyciu JDBC mo\u017cna swobodnie wybiera\u0107 ulubion\u0105 pul\u0119 po\u0142\u0105cze\u0144 (np. HikariCP, DBCP, C3PO itp.), kt\u00f3ra zosta\u0142a przetestowana i dzia\u0142a dobrze. W przypadku interfejs\u00f3w API Spanner musimy polega\u0107 na ramach\/pulach powi\u0105za\u0144\/sesjach, kt\u00f3re stworzyli\u015bmy sami.<\/p>\n<p>Struktura zorientowana na klucz g\u0142\u00f3wny (PK) pozwala Cloud Spanner na bardzo szybki dost\u0119p do danych poprzez PK, ale tak\u017ce prowadzi do pewnych problem\u00f3w z zapytaniami.<\/p>\n<ul>\n<li>Nie mo\u017cesz zaktualizowa\u0107 warto\u015bci klucza g\u0142\u00f3wnego; najpierw musisz usun\u0105\u0107 rekord z oryginalnym PK i ponownie go wstawi\u0107 z now\u0105 warto\u015bci\u0105. (To przypomina inne bazy danych\/sk\u0142adowania zorientowane na PK.)<\/li>\n<li>Wszystkie operatory UPDATE i DELETE musz\u0105 wskazywa\u0107 PK w WHERE, w zwi\u0105zku z tym nie mog\u0105 istnie\u0107 puste operatory DELETE all \u2013 zawsze musi by\u0107 podzapytanie, na przyk\u0142ad: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Brak opcji autoinkrementacji lub czego\u015b podobnego, co okre\u015bla\u0142oby sekwencj\u0119 dla pola PK. Aby to dzia\u0142a\u0142o, odpowiednia warto\u015b\u0107 musi by\u0107 tworzona po stronie aplikacji.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Indeksy wt\u00f3rne?<\/h4>\n<p>\nGoogle Cloud Spanner ma wbudowan\u0105 obs\u0142ug\u0119 indeks\u00f3w wt\u00f3rnych. To bardzo przyjemna cecha, kt\u00f3ra nie zawsze wyst\u0119puje w innych technologiach. Apache Kudu obecnie w og\u00f3le nie obs\u0142uguje indeks\u00f3w wt\u00f3rnych, a Apache HBase nie obs\u0142uguje indeks\u00f3w bezpo\u015brednio, ale mo\u017ce je dodawa\u0107 przez Apache Phoenix.<\/p>\n<p>Indeksy w Kudu i HBase mo\u017cna modelowa\u0107 jako osobn\u0105 tabel\u0119 z innymi kombinacjami kluczy g\u0142\u00f3wnych, ale atomowo\u015b\u0107 operacji wykonanych na tabeli g\u0142\u00f3wnej i powi\u0105zanych tabelach indeks\u00f3w musi by\u0107 realizowana na poziomie aplikacji i nie jest trywialna w prawid\u0142owej implementacji.<\/p>\n<p>Jak wspomniano w przegl\u0105dzie Cloud Spanner, jego indeksy mog\u0105 r\u00f3\u017cni\u0107 si\u0119 od indeks\u00f3w MySQL. Nale\u017cy zatem zachowa\u0107 szczeg\u00f3ln\u0105 ostro\u017cno\u015b\u0107 przy budowaniu zapyta\u0144 i profilowaniu, aby zapewni\u0107 u\u017cycie w\u0142a\u015bciwego indeksu tam, gdzie jest on potrzebny.<\/p>\n<h4>Widoki?<\/h4>\n<p>\nBardzo popularnym i u\u017cytecznym obiektem w bazie danych s\u0105 widoki. Mog\u0105 by\u0107 przydatne w wielu przypadkach u\u017cycia; dwa moje ulubione to poziom logicznej abstrakcji i poziom bezpiecze\u0144stwa. Niestety, Cloud Spanner NIE obs\u0142uguje widok\u00f3w. Jednak to ogranicza nas tylko cz\u0119\u015bciowo, poniewa\u017c dla uprawnie\u0144 dost\u0119pu nie ma szczeg\u00f3\u0142owej kontroli na poziomie kolumn, gdzie widoki mog\u0105 by\u0107 akceptowalnym rozwi\u0105zaniem.<\/p>\n<p>W dokumentacji Cloud Spanner w sekcji szczeg\u00f3\u0142owo opisuj\u0105cej kwoty i ograniczenia (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), jest, w szczeg\u00f3lno\u015bci, jeden, kt\u00f3ry mo\u017ce by\u0107 problematyczny dla niekt\u00f3rych aplikacji: Cloud Spanner ma domy\u015blnie ograniczenie do maksymalnie 100 baz danych na instancj\u0119. Oczywiste jest, \u017ce mo\u017ce to stanowi\u0107 powa\u017cn\u0105 przeszkod\u0119 dla bazy danych, kt\u00f3ra ma by\u0107 skalowalna na wi\u0119cej ni\u017c 100 baz danych. Na szcz\u0119\u015bcie, po rozmowie z naszym przedstawicielem technicznym z Google, dowiedzieli\u015bmy si\u0119, \u017ce ten limit mo\u017ce by\u0107 zwi\u0119kszony niemal do dowolnej warto\u015bci przez wsparcie Google.<\/p>\n<h4>Wsparcie dla rozwoju?<\/h4>\n<p>\nCloud Spanner oferuje ca\u0142kiem dobr\u0105 obs\u0142ug\u0119 j\u0119zyk\u00f3w programowania do pracy z jego API. Oficjalnie wspierane biblioteki obejmuj\u0105 C#, Go, Java, node.js, PHP, Python i Ruby. Dokumentacja jest do\u015b\u0107 szczeg\u00f3\u0142owa, ale, jak w przypadku innych zaawansowanych technologii, spo\u0142eczno\u015b\u0107 jest stosunkowo ma\u0142a w por\u00f3wnaniu z najbardziej popularnymi technologiami baz danych, co mo\u017ce prowadzi\u0107 do wyd\u0142u\u017cenia czasu potrzebnego na rozwi\u0105zywanie mniej powszechnych przypadk\u00f3w u\u017cycia lub problem\u00f3w.<\/p>\n<h4>A co z wsparciem lokalnego rozwoju?<\/h4>\n<p>\nNie znale\u017ali\u015bmy sposobu na utworzenie instancji Cloud Spanner w lokalnym \u015brodowisku. Najbli\u017cej, co uda\u0142o nam si\u0119 osi\u0105gn\u0105\u0107, to obraz Dockera. <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, kt\u00f3ry w zasadzie jest podobny, ale w praktyce znacznie si\u0119 r\u00f3\u017cni. Na przyk\u0142ad, CockroachDB mo\u017ce u\u017cywa\u0107 PostgreSQL JDBC. Poniewa\u017c \u015brodowisko deweloperskie powinno by\u0107 jak najbli\u017csze \u015brodowisku produkcyjnemu, Cloud Spanner nie jest idealne, poniewa\u017c trzeba polega\u0107 na pe\u0142nej instancji Spanner. Aby zredukowa\u0107 koszty, mo\u017cna wybra\u0107 instancj\u0119 w jednym regionie.<\/p>\n<h4>Wsparcie dla administracji?<\/h4>\n<p>\nUtworzenie instancji Cloud Spanner jest bardzo proste. Wystarczy wybra\u0107 mi\u0119dzy utworzeniem instancji multi-regionowej lub dla jednego regionu, wskaza\u0107 region(y) oraz liczb\u0119 w\u0119z\u0142\u00f3w. W mniej ni\u017c minut\u0119 instancja zostanie uruchomiona i gotowa do pracy.<\/p>\n<p>Kilka podstawowych metryk jest bezpo\u015brednio dost\u0119pnych na stronie Spanner w konsoli Google. Bardziej szczeg\u00f3\u0142owe widoki s\u0105 dost\u0119pne przez Stackdriver, gdzie mo\u017cna r\u00f3wnie\u017c ustawi\u0107 progi metryk i zasady powiadomie\u0144.<\/p>\n<h4>Dost\u0119p do zasob\u00f3w?<\/h4>\n<p>\nMySQL oferuje rozbudowane i bardzo szczeg\u00f3\u0142owe ustawienia uprawnie\u0144\/rol u\u017cytkownik\u00f3w. \u0141atwo mo\u017cna dostosowa\u0107 dost\u0119p do okre\u015blonej tabeli lub nawet tylko do podzbioru jej kolumn. Cloud Spanner korzysta z narz\u0119dzia Google Identity &amp; Access Management (IAM), kt\u00f3re pozwala na ustalanie polityk i uprawnie\u0144 tylko na bardzo wysokim poziomie. Najbardziej szczeg\u00f3\u0142ow\u0105 opcj\u0105 jest uprawnienie na poziomie bazy danych, kt\u00f3re nie znajduje zastosowania w wi\u0119kszo\u015bci sytuacji produkcyjnych. To ograniczenie zmusza ci\u0119 do dodawania dodatkowych \u015brodk\u00f3w bezpiecze\u0144stwa w swoim kodzie, infrastrukturze lub w obu tych elementach, aby zapobiec nieautoryzowanemu wykorzystaniu zasob\u00f3w Spanner.<\/p>\n<h4>Kopie zapasowe?<\/h4>\n<p>\nM\u00f3wi\u0105c prosto, nie ma kopii zapasowych w Cloud Spanner. Cho\u0107 wysokie wymagania Google SLA mog\u0105 zapewni\u0107, \u017ce nie stracisz \u017cadnych danych z powodu awarii sprz\u0119tu lub bazy danych, od b\u0142\u0119d\u00f3w ludzkich, defekt\u00f3w aplikacji itd. Wszyscy znamy zasady: wysoka dost\u0119pno\u015b\u0107 nie zast\u0119puje rozs\u0105dnej strategii tworzenia kopii zapasowych. Obecnie jedynym sposobem na tworzenie kopii zapasowych danych jest strumieniowe przesy\u0142anie ich z bazy danych do oddzielnego \u015brodowiska przechowywania.<\/p>\n<h4>Wydajno\u015b\u0107 zapyta\u0144?<\/h4>\n<p>\nDo \u0142adowania danych i testowania zapyta\u0144 u\u017cyli\u015bmy Yahoo! Cloud Serving Benchmark. W poni\u017cszej tabeli przedstawiono obci\u0105\u017cenie B YCSB z stosunkiem odczyt\u00f3w 95% do zapis\u00f3w 5%.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Test obci\u0105\u017ceniowy zosta\u0142 przeprowadzony na silniku obliczeniowym (CE) n1-standard-32 (32 vCPU, 120 GB pami\u0119ci), a instancja testowa nigdy nie by\u0142a w\u0105skim gard\u0142em podczas test\u00f3w.<\/i><br \/>\n<i>** Maksymalna liczba w\u0105tk\u00f3w w jednej instancji YCSB wynosi 400. \u0141\u0105cznie trzeba by\u0142o uruchomi\u0107 sze\u015b\u0107 r\u00f3wnoleg\u0142ych instancji test\u00f3w YCSB, aby uzyska\u0107 \u0142\u0105cznie 2400 w\u0105tk\u00f3w.<\/i><\/p>\n<p>Patrz\u0105c na wyniki test\u00f3w, szczeg\u00f3lnie na po\u0142\u0105czenie obci\u0105\u017cenia procesora i TPS, wyra\u017anie widzimy, \u017ce Cloud Spanner dobrze si\u0119 skaluje. Du\u017ce obci\u0105\u017cenie generowane przez du\u017c\u0105 liczb\u0119 w\u0105tk\u00f3w jest kompensowane przez du\u017c\u0105 liczb\u0119 w\u0119z\u0142\u00f3w w klastrze Cloud Spanner. Chocia\u017c op\u00f3\u017anienie wydaje si\u0119 do\u015b\u0107 wysokie, szczeg\u00f3lnie przy pracy z 2400 w\u0105tkami, aby uzyska\u0107 dok\u0142adniejsze liczby, mo\u017ce by\u0107 konieczne ponowne testowanie z 6 mniejszymi instancjami silnika obliczeniowego. Ka\u017cda instancja uruchomi jeden test YCSB zamiast jednej du\u017cej instancji CE z 6 r\u00f3wnoleg\u0142ymi testami. W ten spos\u00f3b \u0142atwiej b\u0119dzie odr\u00f3\u017cni\u0107 op\u00f3\u017anienia zapyta\u0144 Cloud Spanner i op\u00f3\u017anienia, kt\u00f3re dodaje po\u0142\u0105czenie sieciowe mi\u0119dzy Cloud Spanner a instancj\u0105 CE, na kt\u00f3rej wykonywany jest test.<\/p>\n<h3>Jak Cloud Spanner radzi sobie jako OLAP?<\/h3>\n<p><\/p>\n<h4>Partycjonowanie?<\/h4>\n<p>\nPodzia\u0142 danych na fizycznie i\/lub logicznie niezale\u017cne segmenty, zwane partycjami, jest bardzo popularn\u0105 koncepcj\u0105 w\u0142a\u015bciw\u0105 dla wi\u0119kszo\u015bci mechanizm\u00f3w OLAP. Partycje mog\u0105 znacznie poprawi\u0107 wydajno\u015b\u0107 zapyta\u0144 i konserwowalno\u015b\u0107 bazy danych. Dalsze zg\u0142\u0119bianie partycji mog\u0142oby zaj\u0105\u0107 osobny artyku\u0142(-y), wi\u0119c po prostu wspomnijmy o znaczeniu posiadania schematu partycjonowania i sub-partycjonowania. Mo\u017cliwo\u015b\u0107 dzielenia danych na partycje, a nawet dalej na sub-partycje, jest kluczowa dla wydajno\u015bci zapyta\u0144 analitycznych.<\/p>\n<p>Cloud Spanner nie obs\u0142uguje partycji jako takich. Dzieli dane wewn\u0119trzne na tzw. <i>split<\/i>-y na podstawie zakres\u00f3w klucza g\u0142\u00f3wnego. Podzia\u0142 jest wykonywany automatycznie w celu r\u00f3wnowa\u017cenia obci\u0105\u017cenia w klastrze Cloud Spanner. Bardzo przydatn\u0105 funkcj\u0105 Cloud Spanner jest rozbicie podstawowego obci\u0105\u017cenia tabeli macierzystej (tabeli, kt\u00f3ra nie jest naprzemienna z inn\u0105). Spanner automatycznie okre\u015bla, czy <i>split <\/i>dane s\u0105 odczytywane cz\u0119\u015bciej ni\u017c dane w innych <i>split<\/i>-ach, i mo\u017ce podj\u0105\u0107 decyzj\u0119 o dalszym podziale. W ten spos\u00f3b w zapytaniu mo\u017ce by\u0107 zaanga\u017cowanych wi\u0119cej w\u0119z\u0142\u00f3w, co skutecznie zwi\u0119ksza r\u00f3wnie\u017c przepustowo\u015b\u0107.<\/p>\n<h4>\u0141adowanie danych?<\/h4>\n<p>\nMetoda Cloud Spanner dla du\u017cych danych jest taka sama jak przy zwyk\u0142ym \u0142adowaniu. Aby osi\u0105gn\u0105\u0107 maksymaln\u0105 wydajno\u015b\u0107, nale\u017cy przestrzega\u0107 kilku zalece\u0144, w tym:<\/p>\n<ul>\n<li>Sortuj swoje dane wed\u0142ug klucza g\u0142\u00f3wnego.<\/li>\n<li>Podziel je na 10*<i>liczba w\u0119z\u0142\u00f3w<\/i> oddzielnych sekcji.<\/li>\n<li>Utw\u00f3rz zestaw zada\u0144 roboczych, kt\u00f3re \u0142adowa\u0107 b\u0119d\u0105 dane r\u00f3wnolegle.<\/li>\n<\/ul>\n<p>\nPodczas takiego \u0142adowania danych wykorzystywane s\u0105 wszystkie w\u0119z\u0142y Cloud Spanner.<\/p>\n<p>U\u017cyli\u015bmy obci\u0105\u017cenia A YCSB do wygenerowania zestawu danych z 10M wierszami.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Test obci\u0105\u017cenia by\u0142 przeprowadzany na silniku obliczeniowym n1-standard-32 (32 vCPU, 120 GB pami\u0119ci), a instancja testowa nigdy nie by\u0142a w\u0105skim gard\u0142em w testach.<br \/>\n** Konfiguracja z 1 w\u0119z\u0142em nie jest zalecana dla jakichkolwiek obci\u0105\u017ce\u0144 produkcyjnych.<\/i><\/p>\n<p>Jak wspomniano wcze\u015bniej, Cloud Spanner automatycznie obs\u0142uguje podzia\u0142y w zale\u017cno\u015bci od ich obci\u0105\u017cenia, dlatego wyniki poprawiaj\u0105 si\u0119 po kilku kolejnych powt\u00f3rzeniach testu. Wyniki przedstawione tutaj to najlepsze wyniki, jakie uzyskali\u015bmy. Patrz\u0105c na powy\u017csze liczby, mo\u017cemy zobaczy\u0107, jak Cloud Spanner (dobrze) skaluj\u0105 si\u0119 ze wzrostem liczby w\u0119z\u0142\u00f3w w klastrze. Liczby, kt\u00f3re si\u0119 wyr\u00f3\u017cniaj\u0105, to niezwykle niski czas op\u00f3\u017anienia, kt\u00f3ry kontrastuje z wynikami mieszanych obci\u0105\u017ce\u0144 (95% na odczyt i 5% na zapis), jak opisano w powy\u017cszej sekcji.<\/p>\n<h4>Skalowanie?<\/h4>\n<p>\nZwi\u0119kszanie i zmniejszanie liczby w\u0119z\u0142\u00f3w Cloud Spanner to zadanie wykonywane za pomoc\u0105 jednego klikni\u0119cia. Je\u015bli chcesz szybko za\u0142adowa\u0107 dane, mo\u017cesz rozwa\u017cy\u0107 zwi\u0119kszenie instancji do maksimum (w naszym przypadku by\u0142o to 25 w\u0119z\u0142\u00f3w w regionie US-EAST), a nast\u0119pnie zmniejszy\u0107 liczb\u0119 w\u0119z\u0142\u00f3w, kt\u00f3ra pasuje do twojego normalnego obci\u0105\u017cenia, po za\u0142adowaniu wszystkich danych do bazy danych, maj\u0105c na uwadze ograniczenie 2 TB\/w\u0119ze\u0142.<\/p>\n<p>Przypomniano nam o tym limicie nawet przy znacznie mniejszej bazie danych. Po kilku przebiegach test\u00f3w obci\u0105\u017ceniowych nasza baza danych mia\u0142a rozmiar oko\u0142o 155 GB, a przy zmniejszeniu do instancji z 1 w\u0119z\u0142em otrzymali\u015bmy nast\u0119puj\u0105cy b\u0142\u0105d:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUda\u0142o nam si\u0119 zmniejszy\u0107 skal\u0119 z 25 do 2 instancji, ale utkn\u0119li\u015bmy na dw\u00f3ch w\u0119z\u0142ach.<\/p>\n<p>Zmiany w liczbie w\u0119z\u0142\u00f3w w klastrze Cloud Spanner mo\u017cna zautomatyzowa\u0107 za pomoc\u0105 REST API. Mo\u017ce to by\u0107 szczeg\u00f3lnie przydatne w celu zmniejszenia zwi\u0119kszonego obci\u0105\u017cenia systemu w godzinach szczytu.<\/p>\n<h4>Wydajno\u015b\u0107 zapyta\u0144 OLAP?<\/h4>\n<p>\nPocz\u0105tkowo planowali\u015bmy przeznaczy\u0107 znaczn\u0105 ilo\u015b\u0107 czasu na nasz\u0105 ocen\u0119 Spanner w tej cz\u0119\u015bci. Po kilku SELECT COUNT od razu zdali\u015bmy sobie spraw\u0119, \u017ce testowanie b\u0119dzie kr\u00f3tkie i \u017ce Spanner NIE b\u0119dzie odpowiednim silnikiem OLAP. Bez wzgl\u0119du na liczb\u0119 w\u0119z\u0142\u00f3w w klastrze, proste zapytanie o liczb\u0119 wierszy w tabeli zawieraj\u0105cej 10M wierszy zajmowa\u0142o od 55 do 60 sekund. Ponadto ka\u017cde zapytanie, kt\u00f3re wymaga\u0142o wi\u0119kszej ilo\u015bci pami\u0119ci do przechowywania wynik\u00f3w po\u015brednich, ko\u0144czy\u0142o si\u0119 b\u0142\u0119dem OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M unikalnych warto\u015bci) -&gt; SpoolingHashAggregateIterator wyczerpa\u0142 pami\u0119\u0107 podczas dodawania nowego wiersza.<\/code><\/p>\n<p>Niekt\u00f3re dane dla zapyta\u0144 TPC-H mo\u017cna znale\u017a\u0107 w artykule Todda Lipkona <noindex><a rel=\"nofollow\" href=\"https:\/\/kudu.apache.org\/2017\/10\/23\/nosql-kudu-spanner-slides.html\">Nosql-kudu-spanner-slides.html<\/a><\/noindex>, slajdy 42 i 43. Te liczby s\u0105 zgodne z naszymi w\u0142asnymi wynikami (niestety).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobry, z\u0142y, brzydki\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Nasze wnioski<\/h4>\n<p>\nBior\u0105c pod uwag\u0119 obecny stan funkcji Cloud Spanner, trudno wyobrazi\u0107 sobie jego prost\u0105 zast\u0105pienie istniej\u0105cym rozwi\u0105zaniem OLTP, szczeg\u00f3lnie gdy twoje potrzeby przekrocz\u0105 jego mo\u017cliwo\u015bci. Wymaga\u0142oby to znacznej ilo\u015bci czasu na zbudowanie rozwi\u0105zania z uwzgl\u0119dnieniem niedoci\u0105gni\u0119\u0107 Cloud Spanner.<\/p>\n<p>Kiedy rozpocz\u0119li\u015bmy ocen\u0119 Cloud Spanner, oczekiwali\u015bmy, \u017ce jego funkcje zarz\u0105dzania b\u0119d\u0105 na poziomie lub przynajmniej niezbyt odbiegaj\u0105 od innych rozwi\u0105za\u0144 Google SQL. Jednak byli\u015bmy zaskoczeni ca\u0142kowitym brakiem kopii zapasowych oraz bardzo ograniczon\u0105 kontrol\u0105 dost\u0119pu do zasob\u00f3w. Nie wspominaj\u0105c ju\u017c o braku widok\u00f3w, braku lokalnego \u015brodowiska deweloperskiego, nieobs\u0142ugiwanych sekwencjach, JDBC bez wsparcia dla DML i DDL itd.<\/p>\n<p>Jak wi\u0119c ma post\u0105pi\u0107 ten, kto musi skalowa\u0107 baz\u0119 danych transakcyjnych? Wygl\u0105da na to, \u017ce na rynku nie ma jeszcze jednego rozwi\u0105zania, kt\u00f3re odpowiada\u0142oby wszystkim przypadkom u\u017cycia. Istnieje wiele rozwi\u0105za\u0144 z zamkni\u0119tym i otwartym kodem \u017ar\u00f3d\u0142owym (niekt\u00f3re z nich zosta\u0142y wspomniane w tym artykule), z kt\u00f3rych ka\u017cde ma swoje mocne i s\u0142abe strony, ale \u017cadne z nich nie oferuje SaaS z SLA na poziomie 99,999% i wysokim poziomie sp\u00f3jno\u015bci. Je\u015bli wysoki poziom SLA jest Twoim g\u0142\u00f3wnym celem i nie planujesz tworzy\u0107 w\u0142asnego rozwi\u0105zania dla kilku \u015brodowisk chmurowych, Cloud Spanner mo\u017ce okaza\u0107 si\u0119 rozwi\u0105zaniem, kt\u00f3rego szukasz. Musisz jednak by\u0107 \u015bwiadomy wszystkich jego ogranicze\u0144.<\/p>\n<p>Sprawiedliwo\u015bci nale\u017cy jednak zado\u015b\u0107uczyni\u0107, \u017ce Cloud Spanner zosta\u0142a udost\u0119pniona publicznie dopiero wiosn\u0105 2017 roku, wi\u0119c rozs\u0105dnie jest oczekiwa\u0107, \u017ce niekt\u00f3re z jego obecnych wad mog\u0105 ostatecznie znikn\u0105\u0107 (miejmy nadziej\u0119), a kiedy to si\u0119 stanie, mo\u017ce to zmieni\u0107 zasady gry. W ko\u0144cu Cloud Spanner to nie tylko projekt zewn\u0119trzny dla Google. Google wykorzystuje go jako podstaw\u0119 dla innych produkt\u00f3w Google. A kiedy Google niedawno zast\u0105pi\u0142 Megastore w Google Cloud Storage Cloud Spanner, to umo\u017cliwi\u0142o Google Cloud Storage sta\u0107 si\u0119 \u015bci\u015ble sp\u00f3jnym dla list obiekt\u00f3w na ca\u0142ym \u015bwiecie (co nadal nie dotyczy <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>Tak wi\u0119c, nadzieja jeszcze jest\u2026 mamy nadziej\u0119.<\/p>\n<p>Na tym ko\u0144czymy. Tak jak i autor artyku\u0142u, my r\u00f3wnie\u017c nadal mamy nadziej\u0119, co o tym s\u0105dzicie? Podzielcie si\u0119 w komentarzach<\/p>\n<p><b>Zach\u0119camy wszystkich do wzi\u0119cia udzia\u0142u w naszym <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">bezp\u0142atnym webinarze<\/a><\/noindex> w ramach kt\u00f3rego szczeg\u00f3\u0142owo om\u00f3wimy kurs<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u201eAWS dla programist\u00f3w\u201d<\/a><\/noindex> od OTUS.<\/b><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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: dobry, z\u0142y, brzydki | ProHoster","description":"Cze\u015b\u0107, Habr. Tradycyjnie dzielimy si\u0119 interesuj\u0105cymi materia\u0142ami przed rozpocz\u0119ciem nowych kurs\u00f3w.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/69568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}