{"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\/cs\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Ahoj, Habr\u010dan\u00e9. Tradi\u010dn\u011b pokra\u010dujeme ve sd\u00edlen\u00ed zaj\u00edmav\u00e9ho materi\u00e1lu p\u0159ed zah\u00e1jen\u00edm nov\u00fdch kurz\u016f. Dnes jsme pro v\u00e1s p\u0159ipravili \u010dl\u00e1nek o Google Cloud Spanner, kter\u00fd jsme spojili se spu\u0161t\u011bn\u00edm kurzu. <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS pro v\u00fdvoj\u00e1\u0159e\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>P\u016fvodn\u011b publikov\u00e1no v <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">blogu Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>Jako spole\u010dnost nab\u00edzej\u00edc\u00ed \u0159adu cloudov\u00fdch POS \u0159e\u0161en\u00ed pro maloobchodn\u00edky, restaurace a online prodejce po cel\u00e9m sv\u011bt\u011b, Lightspeed vyu\u017e\u00edv\u00e1 n\u011bkolik r\u016fzn\u00fdch typ\u016f datab\u00e1zov\u00fdch platforem pro r\u016fzn\u00e9 transak\u010dn\u00ed, analytick\u00e9 a vyhled\u00e1vac\u00ed p\u0159\u00edpady. Ka\u017ed\u00e1 z t\u011bchto datab\u00e1zov\u00fdch platforem m\u00e1 sv\u00e9 siln\u00e9 a slab\u00e9 str\u00e1nky. Kdy\u017e Google uvedl na trh Cloud Spanner \u2014 slibn\u00e9 funkce, kter\u00e9 nemaj\u00ed prekro\u010dit v oblasti rela\u010dn\u00edch datab\u00e1z\u00ed, jako je prakticky neomezen\u00e1 horizont\u00e1ln\u00ed \u0161k\u00e1lovatelnost a SLA 99,999 % \u2014 nemohli jsme si nechat uj\u00edt p\u0159\u00edle\u017eitost ji vyzkou\u0161et!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAbychom poskytli komplexn\u00ed p\u0159ehled na\u0161ich zku\u0161enost\u00ed s Cloud Spanner a hodnot\u00edc\u00edch krit\u00e9ri\u00ed, kter\u00e9 jsme pou\u017eili, zam\u011b\u0159\u00edme se na n\u00e1sleduj\u00edc\u00ed t\u00e9mata:<\/p>\n<ol>\n<li>Na\u0161e hodnot\u00edc\u00ed krit\u00e9ria<\/li>\n<li>Cloud Spanner v kostce<\/li>\n<li>Na\u0161e hodnocen\u00ed<\/li>\n<li>Na\u0161e z\u00e1v\u011bry<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. Na\u0161e hodnot\u00edc\u00ed krit\u00e9ria<\/h2>\n<p>\nP\u0159edt\u00edm, ne\u017e se pono\u0159\u00edme do funkc\u00ed Cloud Spanner, jej\u00edch podobnost\u00ed a rozd\u00edl\u016f s jin\u00fdmi \u0159e\u0161en\u00edmi na trhu, nejd\u0159\u00edve si promluvme o hlavn\u00edch p\u0159\u00edpadech pou\u017eit\u00ed, kter\u00e9 jsme m\u011bli na mysli, kdy\u017e jsme zva\u017eovali, kde nasadit Cloud Spanner v na\u0161\u00ed infrastruktu\u0159e:<\/p>\n<ul>\n<li>Jako n\u00e1hrada (prevl\u00e1daj\u00edc\u00ed) tradi\u010dn\u00edho SQL datab\u00e1zov\u00e9ho \u0159e\u0161en\u00ed<\/li>\n<li>Jako OLTP \u0159e\u0161en\u00ed s podporou OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Pozn\u00e1mka:<\/b> Pro jednoduchost a p\u0159ehlednost srovn\u00e1v\u00e1 tento \u010dl\u00e1nek Cloud Spanner s variantami MySQL rodiny GCP Cloud SQL a Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Pou\u017eit\u00ed Cloud Spanner jako n\u00e1hrady za tradi\u010dn\u00ed SQL datab\u00e1zov\u00e9 \u0159e\u0161en\u00ed<\/h4>\n<p>\nV prost\u0159ed\u00ed <i>tradi\u010dn\u00edch <\/i>datab\u00e1z\u00ed, kdy doba odezvy na dotaz do datab\u00e1ze se bl\u00ed\u017e\u00ed nebo dokonce p\u0159ekra\u010duje p\u0159edem stanoven\u00e9 prahov\u00e9 hodnoty aplikace (v\u011bt\u0161inou kv\u016fli n\u00e1r\u016fstu po\u010dtu u\u017eivatel\u016f a\/nebo po\u017eadavk\u016f), existuje n\u011bkolik zp\u016fsob\u016f, jak sn\u00ed\u017eit dobu odezvy na p\u0159ijatelnou \u00farove\u0148. V\u011bt\u0161ina z t\u011bchto \u0159e\u0161en\u00ed v\u0161ak vy\u017eaduje ru\u010dn\u00ed z\u00e1sah.<\/p>\n<p>Nap\u0159\u00edklad prvn\u00edm krokem, kter\u00fd je t\u0159eba u\u010dinit, je pod\u00edvat se na r\u016fzn\u00e9 parametry datab\u00e1ze souvisej\u00edc\u00ed s v\u00fdkonem a nastavit je tak, aby nejl\u00e9pe odpov\u00eddaly vzor\u016fm sc\u00e9n\u00e1\u0159\u016f pou\u017eit\u00ed aplikac\u00ed. Pokud to nebude sta\u010dit, m\u016f\u017eete vybrat vertik\u00e1ln\u00ed nebo horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed datab\u00e1ze.<\/p>\n<p>Vertik\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed aplikace zahrnuje aktualizaci instance serveru, obvykle p\u0159id\u00e1n\u00edm v\u011bt\u0161\u00edho po\u010dtu procesor\u016f\/jader, v\u011bt\u0161\u00edho objemu opera\u010dn\u00ed pam\u011bti, rychlej\u0161\u00edho \u00falo\u017ei\u0161t\u011b atd. P\u0159id\u00e1n\u00ed v\u011bt\u0161\u00edho po\u010dtu hardwarov\u00fdch prost\u0159edk\u016f vede ke zv\u00fd\u0161en\u00ed v\u00fdkonu datab\u00e1ze, m\u011b\u0159en\u00e9ho p\u0159edev\u0161\u00edm v transakc\u00edch za sekundu, a latenc\u00edch transakc\u00ed pro OLTP syst\u00e9my. Syst\u00e9my rela\u010dn\u00edch datab\u00e1z\u00ed (kter\u00e9 pou\u017e\u00edvaj\u00ed v\u00edcevl\u00e1knov\u00fd p\u0159\u00edstup), jako je MySQL, se dob\u0159e \u0161k\u00e1luj\u00ed vertik\u00e1ln\u011b.<\/p>\n<p>Tento p\u0159\u00edstup m\u00e1 n\u011bkolik nev\u00fdhod, ale nejz\u0159ejm\u011bj\u0161\u00ed je maxim\u00e1ln\u00ed velikost serveru na trhu. Jakmile dos\u00e1hnete limitu nejv\u011bt\u0161\u00ed instance serveru, zb\u00fdv\u00e1 jen jedna cesta: horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed.<\/p>\n<p>Horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed je p\u0159\u00edstup, p\u0159i kter\u00e9m se do clusteru p\u0159id\u00e1v\u00e1 v\u00edce server\u016f, aby se ide\u00e1ln\u011b line\u00e1rn\u011b zvy\u0161oval v\u00fdkon s p\u0159id\u00e1n\u00edm po\u010dtu server\u016f. V\u011bt\u0161ina <i>tradi\u010dn\u00edch <\/i>datab\u00e1zov\u00fdch syst\u00e9m\u016f se \u0161patn\u011b \u0161k\u00e1luje horizont\u00e1ln\u011b nebo se v\u016fbec nena\u010d\u00edt\u00e1. Nap\u0159\u00edklad MySQL m\u016f\u017ee horizont\u00e1ln\u011b \u0161k\u00e1lovat pro operace \u010dten\u00ed p\u0159id\u00e1n\u00edm slave-\u010dte\u010dek, ale nem\u016f\u017ee horizont\u00e1ln\u011b \u0161k\u00e1lovat pro operace z\u00e1pisu.<\/p>\n<p>Na druh\u00e9 stran\u011b, d\u00edky sv\u00e9 povaze Cloud Spanner m\u016f\u017ee snadno horizont\u00e1ln\u011b \u0161k\u00e1lovat s minim\u00e1ln\u00edm zasahov\u00e1n\u00edm.<\/p>\n<p>Plnohodnotn\u00e1<i> DB jako slu\u017eba<\/i> by m\u011bla b\u00fdt hodnocena z r\u016fzn\u00fdch \u00fahl\u016f pohledu. Jako z\u00e1klad jsme vzali nejpopul\u00e1rn\u011bj\u0161\u00ed cloudovou DB \u2014 pro Google, GCP Cloud SQL a pro Amazon, AWS RDS. V na\u0161em hodnocen\u00ed jsme se soust\u0159edili na n\u00e1sleduj\u00edc\u00ed kategorie:<\/p>\n<ul>\n<li>Porovn\u00e1n\u00ed funkc\u00ed: roz\u0161\u00ed\u0159en\u00ed SQL, DDL, DML; knihovny p\u0159ipojen\u00ed\/konnektory, podpora transakc\u00ed atd.<\/li>\n<li>Podpora v\u00fdvoje: jednoduchost v\u00fdvoje a testov\u00e1n\u00ed.<\/li>\n<li>Podpora spr\u00e1vy: spr\u00e1va instanc\u00ed \u2013 nap\u0159\u00edklad \u0161k\u00e1lov\u00e1n\u00ed nahoru\/dol\u016f a upgrade instanc\u00ed; SLA, z\u00e1lohov\u00e1n\u00ed a obnoven\u00ed; bezpe\u010dnost\/kontrola p\u0159\u00edstupu.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Pou\u017eit\u00ed Cloud Spanner jako OLTP \u0159e\u0161en\u00ed s podporou OLAP.<\/h4>\n<p>\nI kdy\u017e Google v\u00fdslovn\u011b netvrd\u00ed, \u017ee Cloud Spanner je ur\u010den pro analytick\u00e9 zpracov\u00e1n\u00ed, sd\u00edl\u00ed n\u011bkter\u00e9 atributy s jin\u00fdmi mechanismy, jako jsou Apache Impala &amp; Kudu a YugaByte, kter\u00e9 jsou ur\u010deny pro OLAP pracovn\u00ed z\u00e1t\u011b\u017ee.<\/p>\n<p>I kdyby existovala jen mal\u00e1 pravd\u011bpodobnost, \u017ee Cloud Spanner zahrnuje konzistentn\u00ed horizont\u00e1ln\u011b \u0161k\u00e1lovateln\u00fd HTAP (hybridn\u00ed transak\u010dn\u011b\/analytick\u00e9 zpracov\u00e1n\u00ed) motor s (v\u00edce \u010di m\u00e9n\u011b) pou\u017eitelnou sadou funkc\u00ed OLAP, mysl\u00edme, \u017ee by to st\u00e1lo za na\u0161i pozornost.<\/p>\n<p>S t\u00edmto na pam\u011bti jsme prozkoumali n\u00e1sleduj\u00edc\u00ed kategorie:<\/p>\n<ul>\n<li>Na\u010d\u00edt\u00e1n\u00ed dat, indexy a podpora partitioning.<\/li>\n<li>V\u00fdkon dotaz\u016f a DML.<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner v n\u011bkolika slovech.<\/h2>\n<p>\nGoogle Spanner je clusterov\u00fd syst\u00e9m \u0159\u00edzen\u00ed rela\u010dn\u00edch datab\u00e1z\u00ed (RDBMS), kter\u00fd Google pou\u017e\u00edv\u00e1 pro n\u011bkolik sv\u00fdch vlastn\u00edch slu\u017eeb. Google jej zp\u0159\u00edstupnil pro u\u017eivatele Google Cloud Platform na za\u010d\u00e1tku roku 2017.<\/p>\n<p>Zde jsou n\u011bkter\u00e9 atributy Cloud Spanner:<\/p>\n<ul>\n<li>Siln\u011b konzistentn\u00ed \u0161k\u00e1lovateln\u00fd cluster RDBMS: pou\u017e\u00edv\u00e1 hardwarovou synchronizaci \u010dasu k zaji\u0161t\u011bn\u00ed konzistence dat.<\/li>\n<li>Podpora transakc\u00ed nap\u0159\u00ed\u010d tabulkami: transakce mohou zahrnovat v\u00edce tabulek \u2013 nemus\u00ed b\u00fdt omezeny na jednu tabulku (na rozd\u00edl od Apache HBase nebo Apache Kudu).<\/li>\n<li>Tabulky na z\u00e1klad\u011b prim\u00e1rn\u00edho kl\u00ed\u010de: v\u0161echny tabulky mus\u00ed m\u00edt deklarovan\u00fd prim\u00e1rn\u00ed kl\u00ed\u010d (PK), kter\u00fd m\u016f\u017ee b\u00fdt slo\u017een z n\u011bkolika sloupc\u016f tabulky. Tabulkov\u00e1 data jsou ukl\u00e1d\u00e1na podle PK, co\u017e je \u010din\u00ed velmi efektivn\u00edmi a rychl\u00fdmi pro vyhled\u00e1v\u00e1n\u00ed podle PK. Stejn\u011b jako v jin\u00fdch syst\u00e9mech na b\u00e1zi PK, implementace mus\u00ed b\u00fdt modelov\u00e1na s ohledem na p\u0159edem promy\u0161len\u00e9 u\u017eivatelsk\u00e9 p\u0159\u00edpady pro dosa\u017een\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">nejlep\u0161\u00edho v\u00fdkonu.<\/a><\/noindex>.<\/li>\n<li>St\u0159\u00eddaj\u00edc\u00ed se tabulky: tabulky mohou m\u00edt fyzick\u00e9 z\u00e1vislosti mezi sebou. \u0158\u00e1dky pod\u0159\u00edzen\u00e9 tabulky mohou b\u00fdt p\u0159i\u0159azeny k \u0159\u00e1dk\u016fm nad\u0159\u00edzen\u00e9 tabulky. Tento p\u0159\u00edstup zrychluje hled\u00e1n\u00ed vztah\u016f, kter\u00e9 mohou b\u00fdt definov\u00e1ny ve f\u00e1zi modelov\u00e1n\u00ed dat, nap\u0159\u00edklad p\u0159i spole\u010dn\u00e9m um\u00edst\u011bn\u00ed klient\u016f a jejich faktur.<\/li>\n<li>Indexy: Cloud Spanner podporuje sekund\u00e1rn\u00ed indexy. Index se skl\u00e1d\u00e1 z indexovan\u00fdch sloupc\u016f a v\u0161ech sloupc\u016f prim\u00e1rn\u00edho kl\u00ed\u010de. Pokud je to \u017e\u00e1douc\u00ed, m\u016f\u017ee index tak\u00e9 obsahovat dal\u0161\u00ed neindexovan\u00e9 sloupce. Index m\u016f\u017ee b\u00fdt propojen s nad\u0159\u00edzenou tabulkou pro zrychlen\u00ed dotaz\u016f. Na indexy se vztahuje n\u011bkolik omezen\u00ed, nap\u0159\u00edklad maxim\u00e1ln\u00ed po\u010det dodate\u010dn\u00fdch sloupc\u016f ulo\u017een\u00fdch v indexu. Tak\u00e9 dotazy p\u0159es indexy mohou b\u00fdt m\u00e9n\u011b p\u0159\u00edmo\u010dar\u00e9 ne\u017e v jin\u00fdch RDBMS.<\/li>\n<\/ul>\n<p>\n<i>\u201eCloud Spanner automaticky vyb\u00edr\u00e1 index pouze ve vz\u00e1cn\u00fdch p\u0159\u00edpadech. Zejm\u00e9na Cloud Spanner nevyb\u00edr\u00e1 sekund\u00e1rn\u00ed index automaticky, pokud dotaz po\u017eaduje jak\u00e9koli sloupce, kter\u00e9 nejsou ulo\u017eeny v <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">indexu <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Dohoda o \u00farovni slu\u017eeb (SLA): nasazen\u00ed v jednom regionu se SLA 99,99%; v\u00edceregion\u00e1ln\u00ed nasazen\u00ed se SLA 99,999%. P\u0159esto\u017ee samotn\u00e1 dohoda o \u00farovni slu\u017eeb je pouze dohodou, nikoli n\u011bjakou z\u00e1rukou, mysl\u00edm, \u017ee zam\u011bstnanci spole\u010dnosti Google maj\u00ed skute\u010dn\u011b n\u011bjak\u00e1 p\u0159esn\u00e1 data, aby mohli u\u010dinit tak v\u00e1\u017en\u00e9 tvrzen\u00ed. (Pro srovn\u00e1n\u00ed, 99,999% znamen\u00e1 26,3 sekundy nedostupnosti slu\u017eby za m\u011bs\u00edc.)<\/li>\n<li>V\u00edce: <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>Pozn\u00e1mka:<\/b> Projekt Apache Tephra p\u0159id\u00e1v\u00e1 roz\u0161\u00ed\u0159enou podporu transakc\u00ed do Apache HBase (nyn\u00ed je tak\u00e9 implementov\u00e1n v Apache Phoenix jako beta verze).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. N\u00e1\u0161 odhad<\/h2>\n<p>\nTak\u017ee jsme v\u0161ichni \u010detli prohl\u00e1\u0161en\u00ed Google o v\u00fdhod\u00e1ch Cloud Spanner \u2013 prakticky neomezen\u00e9 horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed p\u0159i zachov\u00e1n\u00ed vysok\u00e9 konzistence a velmi vysok\u00e9ho SLA. I kdy\u017e je t\u011bchto po\u017eadavk\u016f v ka\u017ed\u00e9m p\u0159\u00edpad\u011b extr\u00e9mn\u011b obt\u00ed\u017en\u00e9 dos\u00e1hnout, na\u0161\u00edm c\u00edlem nebylo je vyvracet. M\u00edsto toho se zam\u011b\u0159me na jin\u00e9 aspekty, kter\u00e9 v\u011bt\u0161inu u\u017eivatel\u016f datab\u00e1z\u00ed zaj\u00edmaj\u00ed: spolehlivost a u\u017eivatelsk\u00e1 p\u0159\u00edv\u011btivost.<\/p>\n<h4>Ohodnotili jsme Cloud Spanner jako n\u00e1hradu za Sharded MySQL.<\/h4>\n<p>\nGoogle Cloud SQL a Amazon AWS RDS, dv\u011b nejpopul\u00e1rn\u011bj\u0161\u00ed OLTP DB na cloudov\u00e9m trhu, nab\u00edzej\u00ed velmi \u0161irokou \u0161k\u00e1lu funkc\u00ed. Nicm\u00e9n\u011b, abyste tyto datab\u00e1ze mohli \u0161k\u00e1lovat za hranice velikosti jednoho uzlu, mus\u00edte prov\u00e1d\u011bt sharding aplikac\u00ed. Tento p\u0159\u00edstup p\u0159in\u00e1\u0161\u00ed dodate\u010dnou slo\u017eitost jak pro aplikace, tak pro spr\u00e1vu. Prozkoumali jsme, jak Spanner zapad\u00e1 do sc\u00e9n\u00e1\u0159e slu\u010dov\u00e1n\u00ed n\u011bkolika segment\u016f do jednoho instance a jak\u00e9 funkce (pokud v\u016fbec n\u011bjak\u00e9) m\u016f\u017ee b\u00fdt nutn\u00e9 ob\u011btovat.<\/p>\n<h4>Podpora SQL, DML a DDL, stejn\u011b jako konektor a knihovny?<\/h4>\n<p>\nZa prv\u00e9, p\u0159i spu\u0161t\u011bn\u00ed s jakoukoli datab\u00e1z\u00ed je nutn\u00e9 vytvo\u0159it datov\u00fd model. Pokud si mysl\u00edte, \u017ee m\u016f\u017eete p\u0159ipojit JDBC Spanner k va\u0161emu obl\u00edben\u00e9mu n\u00e1stroji SQL, zjist\u00edte, \u017ee m\u016f\u017eete pomoc\u00ed n\u011bj dotazovat sv\u00e1 data, ale nem\u016f\u017eete ho pou\u017e\u00edt k vytv\u00e1\u0159en\u00ed tabulek nebo k prov\u00e1d\u011bn\u00ed zm\u011bn (DDL) \u010di jak\u00fdchkoli operac\u00ed vkl\u00e1d\u00e1n\u00ed\/aktualizace\/maz\u00e1n\u00ed (DML). Ofici\u00e1ln\u00ed JDBC od Google nepodporuje ani jedno.<\/p>\n<blockquote><p><i>\u201eV sou\u010dasn\u00e9 dob\u011b ovlada\u010de nepodporuj\u00ed p\u0159\u00edkazy DML nebo DDL.\u201c<\/i><br \/>\nDokumentace Spanner<\/p><\/blockquote>\n<p>\nSeznam GCP nen\u00ed o nic lep\u0161\u00ed \u2013 m\u016f\u017eete odes\u00edlat pouze SELECT dotazy. Na\u0161t\u011bst\u00ed existuje JDBC ovlada\u010d s podporou DML a DDL od komunity, v\u010detn\u011b transakc\u00ed. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. I kdy\u017e je tento ovlada\u010d velmi u\u017eite\u010dn\u00fd, absence vlastn\u00edho JDBC ovlada\u010de od Google vzbuzuje p\u0159ekvapen\u00ed. Na\u0161t\u011bst\u00ed Google nab\u00edz\u00ed relativn\u011b \u0161irokou podporu klientsk\u00fdch knihoven (na b\u00e1zi gRPC): C#, Go, Java, node.js, PHP, Python a Ruby.<\/p>\n<p>T\u00e9m\u011b\u0159 povinn\u00e9 pou\u017e\u00edv\u00e1n\u00ed vlastn\u00edch API Cloud Spanner (kv\u016fli absenci DDL a DML v JDBC) p\u0159in\u00e1\u0161\u00ed ur\u010dit\u00e1 omezen\u00ed pro souvisej\u00edc\u00ed oblasti k\u00f3du, jako jsou pooly p\u0159ipojen\u00ed nebo frameworky pro vazbu datab\u00e1ze (nap\u0159. Spring MVC). Obecn\u011b plat\u00ed, \u017ee p\u0159i pou\u017eit\u00ed JDBC si m\u016f\u017eete svobodn\u011b zvolit obl\u00edben\u00fd pool p\u0159ipojen\u00ed (nap\u0159. HikariCP, DBCP, C3PO atd.), kter\u00fd byl testov\u00e1n a dob\u0159e funguje. V p\u0159\u00edpad\u011b vlastn\u00edch API Spanner se mus\u00edme spol\u00e9hat na frameworky\/pooly vazby\/sezen\u00ed, kter\u00e9 jsme si vytvo\u0159ili sami.<\/p>\n<p>Struktura zam\u011b\u0159en\u00e1 na prim\u00e1rn\u00ed kl\u00ed\u010d (PK) umo\u017e\u0148uje Cloud Spanneru b\u00fdt velmi rychl\u00fd p\u0159i p\u0159\u00edstupu k dat\u016fm p\u0159es PK, ale tak\u00e9 p\u0159in\u00e1\u0161\u00ed n\u011bkter\u00e9 probl\u00e9my s dotazy.<\/p>\n<ul>\n<li>Nem\u016f\u017eete aktualizovat hodnotu prim\u00e1rn\u00edho kl\u00ed\u010de; nejprve mus\u00edte odstranit z\u00e1znam s p\u016fvodn\u00edm PK a znovu jej vlo\u017eit s novou hodnotou. (To je podobn\u00e9 jako u jin\u00fdch datab\u00e1z\u00ed zam\u011b\u0159en\u00fdch na PK \/ \u00falo\u017ei\u0161\u0165.)<\/li>\n<li>Jak\u00e9koli oper\u00e1tory UPDATE a DELETE mus\u00ed specifikovat PK v WHERE, proto nemohou b\u00fdt pr\u00e1zdn\u00e9 oper\u00e1tory DELETE all \u2014 v\u017edy mus\u00ed b\u00fdt poddotaz, nap\u0159\u00edklad: UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Nen\u00ed zde \u017e\u00e1dn\u00e1 mo\u017enost autoinkrementace nebo n\u011b\u010deho podobn\u00e9ho, co ur\u010duje sekvenci pro pole PK. Aby to fungovalo, mus\u00ed b\u00fdt odpov\u00eddaj\u00edc\u00ed hodnota vytvo\u0159ena na stran\u011b aplikace.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Sekund\u00e1rn\u00ed indexy?<\/h4>\n<p>\nGoogle Cloud Spanner m\u00e1 vestav\u011bnou podporu sekund\u00e1rn\u00edch index\u016f. Je to velmi p\u0159\u00edjemn\u00e1 funkce, kter\u00e1 nen\u00ed v\u017edy p\u0159\u00edtomna v jin\u00fdch technologi\u00edch. Apache Kudu v sou\u010dasnosti v\u016fbec nepodporuje sekund\u00e1rn\u00ed indexy, zat\u00edmco Apache HBase nepodporuje indexy p\u0159\u00edmo, ale m\u016f\u017ee je p\u0159id\u00e1vat prost\u0159ednictv\u00edm Apache Phoenix.<\/p>\n<p>Indexy v Kudu a HBase lze modelovat jako samostatn\u00e9 tabulky s odli\u0161n\u00fdmi slo\u017een\u00edmi prim\u00e1rn\u00edch kl\u00ed\u010d\u016f, ale atomickost operac\u00ed prov\u00e1d\u011bn\u00fdch s nad\u0159azenou tabulkou a souvisej\u00edc\u00edmi indexov\u00fdmi tabulkami mus\u00ed b\u00fdt zaji\u0161t\u011bna na \u00farovni aplikace a nen\u00ed trivi\u00e1ln\u00ed p\u0159i spr\u00e1vn\u00e9 implementaci.<\/p>\n<p>Jak bylo zm\u00edn\u011bno v p\u0159ehledu Cloud Spanner, jeho indexy se mohou li\u0161it od index\u016f MySQL. Proto je nutn\u00e9 b\u00fdt obzvl\u00e1\u0161\u0165 opatrn\u00fd p\u0159i vytv\u00e1\u0159en\u00ed dotaz\u016f a profilov\u00e1n\u00ed, aby bylo zaji\u0161t\u011bno, \u017ee se pou\u017e\u00edv\u00e1 spr\u00e1vn\u00fd index tam, kde je pot\u0159eba.<\/p>\n<h4>Zobrazen\u00ed?<\/h4>\n<p>\nVelmi popul\u00e1rn\u00ed a u\u017eite\u010dn\u00fd objekt v datab\u00e1zi \u2014 zobrazen\u00ed. Mohou b\u00fdt u\u017eite\u010dn\u00e1 pro mnoho u\u017eivatelsk\u00fdch p\u0159\u00edpad\u016f; dva m\u00e9 obl\u00edben\u00e9 jsou \u00farove\u0148 logick\u00e9 abstrakce a \u00farove\u0148 bezpe\u010dnosti. Bohu\u017eel Cloud Spanner NEpodporuje zobrazen\u00ed. To v\u0161ak pouze \u010d\u00e1ste\u010dn\u011b omezuj\u00ed, proto\u017ee pro opr\u00e1vn\u011bn\u00ed p\u0159\u00edstupu nen\u00ed detailnost na \u00farovni sloupc\u016f, kde zobrazen\u00ed mohou b\u00fdt p\u0159ijateln\u00fdm \u0159e\u0161en\u00edm.<\/p>\n<p>V dokumentaci Cloud Spanner v \u010d\u00e1sti, kde jsou podrobn\u011b pops\u00e1ny kv\u00f3ty a omezen\u00ed (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), existuje jedna, kter\u00e1 m\u016f\u017ee b\u00fdt problematick\u00e1 pro n\u011bkter\u00e9 aplikace: Cloud Spanner m\u00e1 standardn\u011b omezen\u00ed na maxim\u00e1ln\u011b 100 datab\u00e1z\u00ed na instanci. To se m\u016f\u017ee st\u00e1t v\u00e1\u017enou p\u0159ek\u00e1\u017ekou pro datab\u00e1zi, kter\u00e1 je ur\u010dena k roz\u0161\u00ed\u0159en\u00ed na v\u00edce ne\u017e 100 datab\u00e1z\u00ed. Na\u0161t\u011bst\u00ed, po rozhovoru s na\u0161\u00edm technick\u00fdm z\u00e1stupcem Google jsme zjistili, \u017ee tento limit m\u016f\u017ee b\u00fdt prakticky zv\u00fd\u0161en na libovolnou hodnotu prost\u0159ednictv\u00edm Google podpory.<\/p>\n<h4>Podpora v\u00fdvoje?<\/h4>\n<p>\nCloud Spanner nab\u00edz\u00ed pom\u011brn\u011b dobrou podporu programovac\u00edch jazyk\u016f pro pr\u00e1ci s jeho API. Ofici\u00e1ln\u011b podporovan\u00e9 knihovny jsou v oblastech C#, Go, Java, node.js, PHP, Python a Ruby. Dokumentace je dostate\u010dn\u011b podrobn\u00e1, ale stejn\u011b jako u jin\u00fdch pokro\u010dil\u00fdch technologi\u00ed je komunita pom\u011brn\u011b mal\u00e1 ve srovn\u00e1n\u00ed s nejpopul\u00e1rn\u011bj\u0161\u00edmi technologiemi datab\u00e1z\u00ed, co\u017e m\u016f\u017ee v\u00e9st k del\u0161\u00ed dob\u011b pot\u0159ebn\u00e9 k \u0159e\u0161en\u00ed m\u00e9n\u011b b\u011b\u017en\u00fdch p\u0159\u00edpad\u016f pou\u017eit\u00ed nebo probl\u00e9m\u016f.<\/p>\n<h4>Jak je to tedy s podporou m\u00edstn\u00edho v\u00fdvoje?<\/h4>\n<p>\nNena\u0161li jsme zp\u016fsob, jak vytvo\u0159it instanci Cloud Spanner v m\u00edstn\u00edm prost\u0159ed\u00ed. Nejbl\u00ed\u017ee, co m\u00e1me, je Docker obraz <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, co\u017e v principu vypad\u00e1 podobn\u011b, ale v praxi se zna\u010dn\u011b li\u0161\u00ed. Nap\u0159\u00edklad CockroachDB m\u016f\u017ee pou\u017e\u00edvat PostgreSQL JDBC. Proto\u017ee v\u00fdvojov\u00e9 prost\u0159ed\u00ed by m\u011blo b\u00fdt co nejbl\u00ed\u017ee produk\u010dn\u00edmu prost\u0159ed\u00ed, Cloud Spanner nen\u00ed ide\u00e1ln\u00ed, jeliko\u017e se mus\u00edme spol\u00e9hat na plnou instanci Spanner. Pro \u00fasporu n\u00e1klad\u016f m\u016f\u017eete zvolit instanci pro jedno region.<\/p>\n<h4>Podpora administrace?<\/h4>\n<p>\nVytvo\u0159en\u00ed instance Cloud Spanner je velmi jednoduch\u00e9. Sta\u010d\u00ed si vybrat mezi vytvo\u0159en\u00edm multiregion\u00e1ln\u00ed nebo instanc\u00ed pro jedno region, ur\u010dit region(y) a po\u010det uzl\u016f. Za m\u00e9n\u011b ne\u017e minutu bude instance spu\u0161t\u011bna a p\u0159ipravena k pou\u017eit\u00ed.<\/p>\n<p>N\u011bkolik z\u00e1kladn\u00edch metrik je p\u0159\u00edmo dostupn\u00fdch na str\u00e1nce Spanner v konzoli Google. Podrobn\u011bj\u0161\u00ed pohledy jsou k dispozici prost\u0159ednictv\u00edm Stackdriveru, kde m\u016f\u017eete tak\u00e9 nastavit prahov\u00e9 hodnoty metrik a politiky upozorn\u011bn\u00ed.<\/p>\n<h4>P\u0159\u00edstup k prost\u0159edk\u016fm?<\/h4>\n<p>\nMySQL nab\u00edz\u00ed rozs\u00e1hl\u00e1 a velmi podrobn\u00e1 nastaven\u00ed opr\u00e1vn\u011bn\u00ed\/rol\u00ed u\u017eivatel\u016f. Lze snadno nastavit p\u0159\u00edstup k ur\u010dit\u00e9 tabulce nebo dokonce pouze k podmno\u017ein\u011b jej\u00edch sloupc\u016f. Cloud Spanner pou\u017e\u00edv\u00e1 n\u00e1stroj Google Identity &amp; Access Management (IAM), kter\u00fd umo\u017e\u0148uje nastavovat politiky a opr\u00e1vn\u011bn\u00ed pouze na velmi vysok\u00e9 \u00farovni. Nejpodrobn\u011bj\u0161\u00ed mo\u017enost\u00ed je opr\u00e1vn\u011bn\u00ed na \u00farovni datab\u00e1ze, kter\u00e9 se v\u011bt\u0161in\u011b v\u00fdrobn\u00edch p\u0159\u00edpad\u016f nehod\u00ed. Toto omezen\u00ed v\u00e1s nut\u00ed p\u0159id\u00e1vat dal\u0161\u00ed bezpe\u010dnostn\u00ed opat\u0159en\u00ed do va\u0161eho k\u00f3du, infrastruktury nebo oboj\u00edho, abyste p\u0159ede\u0161li neopr\u00e1vn\u011bn\u00e9mu pou\u017eit\u00ed prost\u0159edk\u016f Spanner.<\/p>\n<h4>Z\u00e1lohy?<\/h4>\n<p>\nJednodu\u0161e \u0159e\u010deno, z\u00e1lohy v Cloud Spanner neexistuj\u00ed. A\u010dkoli vysok\u00e9 po\u017eadavky Google SLA mohou zaru\u010dit, \u017ee neztrat\u00edte \u017e\u00e1dn\u00e1 data kv\u016fli poruch\u00e1m hardwaru nebo datab\u00e1ze, lidem zp\u016fsoben\u00fdm chyb\u00e1m, nedostatk\u016fm aplikac\u00ed atd. V\u0161ichni v\u00edme pravidlo: vysok\u00e1 dostupnost nenahrazuje rozumnou strategii z\u00e1lohov\u00e1n\u00ed. Moment\u00e1ln\u011b je jedin\u00fdm zp\u016fsobem z\u00e1lohov\u00e1n\u00ed dat programov\u00fd stream, kter\u00fd je p\u0159en\u00e1\u0161\u00ed z datab\u00e1ze do samostatn\u00e9ho \u00falo\u017ei\u0161t\u011b.<\/p>\n<h4>V\u00fdkon dotaz\u016f?<\/h4>\n<p>\nPro na\u010d\u00edt\u00e1n\u00ed dat a testov\u00e1n\u00ed dotaz\u016f jsme pou\u017eili Yahoo! Cloud Serving Benchmark. V tabulce n\u00ed\u017ee je pracovn\u00ed z\u00e1t\u011b\u017e B YCSB s pom\u011brem \u010dten\u00ed 95 % a z\u00e1pisu 5 %.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Z\u00e1t\u011b\u017eov\u00fd test byl proveden na v\u00fdpo\u010detn\u00edm enginu (CE) n1-standard-32 (32 vCPU, 120 GB pam\u011bti), a testovac\u00ed instance nikdy nebyla \u00fazk\u00fdm m\u00edstem v testech.<\/i><br \/>\n<i>** Maxim\u00e1ln\u00ed po\u010det vl\u00e1ken v jednom instance YCSB je 400. Celkem bylo pot\u0159eba spustit \u0161est paraleln\u00edch instanc\u00ed YCSB test\u016f, aby se dos\u00e1hlo celkov\u00e9ho po\u010dtu 2400 vl\u00e1ken.<\/i><\/p>\n<p>P\u0159i pohledu na v\u00fdsledky test\u016f, konkr\u00e9tn\u011b kombinaci zat\u00ed\u017een\u00ed procesoru a TPS, jasn\u011b vid\u00edme, \u017ee Cloud Spanner se dob\u0159e \u0161k\u00e1luje. Vysok\u00e9 zat\u00ed\u017een\u00ed zp\u016fsoben\u00e9 velk\u00fdm po\u010dtem vl\u00e1ken je vyv\u00e1\u017eeno v\u011bt\u0161\u00edm po\u010dtem uzl\u016f v cloudu Spanner. A\u010dkoli zpo\u017ed\u011bn\u00ed vypad\u00e1 docela vysok\u00e9, zejm\u00e9na p\u0159i pr\u00e1ci s 2400 vl\u00e1kny, pro p\u0159esn\u011bj\u0161\u00ed \u010d\u00edsla by mohlo b\u00fdt nutn\u00e9 zopakovat testy s 6 men\u0161\u00edmi instancemi v\u00fdpo\u010detn\u00edho enginu. Ka\u017ed\u00e1 instance bude spou\u0161t\u011bt jeden test YCSB m\u00edsto jedn\u00e9 velk\u00e9 instance CE se 6 paraleln\u00edmi testy. Takto bude snaz\u0161\u00ed rozli\u0161it zpo\u017ed\u011bn\u00ed po\u017eadavk\u016f Cloud Spanner a zpo\u017ed\u011bn\u00ed, kter\u00e1 p\u0159id\u00e1v\u00e1 s\u00ed\u0165ov\u00e9 p\u0159ipojen\u00ed mezi Cloud Spanner a instanc\u00ed CE, na kter\u00e9 se test prov\u00e1d\u00ed.<\/p>\n<h3>Jak si Cloud Spanner vede jako OLAP?<\/h3>\n<p><\/p>\n<h4>Particionace?<\/h4>\n<p>\nRozd\u011blen\u00ed dat na fyzicky a\/nebo logicky nez\u00e1visl\u00e9 segmenty, naz\u00fdvan\u00e9 partitiony, je velmi popul\u00e1rn\u00ed koncept, kter\u00fd se vyskytuje ve v\u011bt\u0161in\u011b OLAP mechanism\u016f. Partitiony mohou v\u00fdznamn\u011b zlep\u0161it v\u00fdkon dotaz\u016f a \u00fadr\u017ebu datab\u00e1ze. Podrobn\u011bj\u0161\u00ed prozkoum\u00e1n\u00ed partition m\u016f\u017ee odhalit dal\u0161\u00ed \u010dl\u00e1nky, tak\u017ee si pouze zm\u00edn\u00edme d\u016fle\u017eitost existence sch\u00e9matu partitionace a sub-partitionace. Mo\u017enost d\u011blit data na partitiony a dokonce d\u00e1le na sub-partitiony je kl\u00ed\u010dem k v\u00fdkonnosti analytick\u00fdch dotaz\u016f.<\/p>\n<p>Cloud Spanner nepodporuje partitiony jako takov\u00e9. Rozd\u011bluje data uvnit\u0159 na tzv. <i>split<\/i>-y na z\u00e1klad\u011b rozsah\u016f prim\u00e1rn\u00edho kl\u00ed\u010de. Rozd\u011blen\u00ed se prov\u00e1d\u00ed automaticky pro vyv\u00e1\u017een\u00ed zat\u00ed\u017een\u00ed v clusteru Cloud Spanner. Velmi u\u017eite\u010dn\u00e1 funkce Cloud Spanner je rozd\u011blen\u00ed z\u00e1kladn\u00edho zat\u00ed\u017een\u00ed rodi\u010dovsk\u00e9 tabulky (tabulky, kter\u00e1 se ne\u010dlen\u00ed s jinou). Spanner automaticky ur\u010duje, zda <i>split <\/i>data, kter\u00e1 se \u010dtou \u010dast\u011bji, ne\u017e data v jin\u00fdch <i>split<\/i>-\u00e1ch, a m\u016f\u017ee se rozhodnout o dal\u0161\u00edm rozd\u011blen\u00ed. Takto m\u016f\u017ee b\u00fdt zapojeno v\u00edce uzl\u016f do dotazu, co\u017e tak\u00e9 efektivn\u011b zvy\u0161uje propustnost.<\/p>\n<h4>Nahr\u00e1v\u00e1n\u00ed dat?<\/h4>\n<p>\nZp\u016fsob Cloud Spanner pro velk\u00e1 data je stejn\u00fd jako p\u0159i b\u011b\u017en\u00e9m na\u010d\u00edt\u00e1n\u00ed. Pro maxim\u00e1ln\u00ed v\u00fdkon je t\u0159eba dodr\u017eovat n\u011bkter\u00e9 doporu\u010den\u00ed, v\u010detn\u011b:<\/p>\n<ul>\n<li>T\u0159\u00edd\u011bte sv\u00e1 data podle prim\u00e1rn\u00edho kl\u00ed\u010de.<\/li>\n<li>Rozd\u011blte je na 10*<i>po\u010det uzl\u016f<\/i> samostatn\u00fdch sekc\u00ed.<\/li>\n<li>Vytvo\u0159te sadu pracovn\u00edch \u00faloh, kter\u00e9 na\u010d\u00edtaj\u00ed data paraleln\u011b.<\/li>\n<\/ul>\n<p>\nP\u0159i takov\u00e9m na\u010d\u00edt\u00e1n\u00ed dat se vyu\u017e\u00edvaj\u00ed v\u0161echny uzly Cloud Spanner.<\/p>\n<p>Pou\u017eili jsme pracovn\u00ed z\u00e1t\u011b\u017e A YCSB k vygenerov\u00e1n\u00ed sady dat o 10M \u0159\u00e1dc\u00edch.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Z\u00e1t\u011b\u017eov\u00fd test byl proveden na v\u00fdpo\u010detn\u00edm stroji n1-standard-32 (32 vCPU, 120 GB pam\u011bti) a testovan\u00fd instance nikdy nebyla \u00fazk\u00fdm m\u00edstem v testech.<br \/>\n** Nastaven\u00ed s 1 uzlem se nedoporu\u010duje pro jakoukoli produk\u010dn\u00ed z\u00e1t\u011b\u017e.<\/i><\/p>\n<p>Jak bylo zm\u00edn\u011bno v\u00fd\u0161e, Cloud Spanner automaticky zpracov\u00e1v\u00e1 split-y podle jejich z\u00e1t\u011b\u017ee, tak\u017ee v\u00fdsledky se zlep\u0161uj\u00ed po n\u011bkolika po sob\u011b jdouc\u00edch opakov\u00e1n\u00edch testu. V\u00fdsledky, kter\u00e9 jsou zde uvedeny, jsou nejlep\u0161\u00ed v\u00fdsledky, kter\u00e9 jsme z\u00edskali. P\u0159i pohledu na \u010d\u00edsla v\u00fd\u0161e vid\u00edme, jak Cloud Spanner (dob\u0159e) \u0161k\u00e1luje s rostouc\u00edm po\u010dtem uzl\u016f v clusteru. \u010c\u00edsla, kter\u00e1 vynikaj\u00ed, p\u0159edstavuj\u00ed extr\u00e9mn\u011b n\u00edzk\u00e9 pr\u016fm\u011brn\u00e9 latence, kter\u00e9 kontrastuj\u00ed s v\u00fdsledky sm\u00ed\u0161en\u00fdch pracovn\u00edch z\u00e1t\u011b\u017e\u00ed (95 % pro \u010dten\u00ed a 5 % pro z\u00e1pis), jak je pops\u00e1no v \u010d\u00e1sti v\u00fd\u0161e.<\/p>\n<h4>\u0160k\u00e1lov\u00e1n\u00ed?<\/h4>\n<p>\nZv\u011bt\u0161en\u00ed a zmen\u0161en\u00ed po\u010dtu uzl\u016f Cloud Spanner se prov\u00e1d\u00ed jedn\u00edm kliknut\u00edm. Pokud chcete rychle na\u010d\u00edst data, m\u016f\u017eete zv\u00e1\u017eit zv\u00fd\u0161en\u00ed instance na maximum (v na\u0161em p\u0159\u00edpad\u011b to bylo 25 uzl\u016f v regionu US-EAST), a pot\u00e9 sn\u00ed\u017eit po\u010det uzl\u016f, kter\u00e9 odpov\u00eddaj\u00ed va\u0161\u00ed b\u011b\u017en\u00e9 z\u00e1t\u011b\u017ei, pot\u00e9, co se v\u0161echna data dostanou do datab\u00e1ze, s ohledem na limit 2 TB\/uzel.<\/p>\n<p>Bylo n\u00e1m p\u0159ipomenuto tento limit i s mnohem men\u0161\u00ed datab\u00e1z\u00ed. Po n\u011bkolika pr\u016fchodech z\u00e1t\u011b\u017eov\u00fdmi testy m\u011bla na\u0161e datab\u00e1ze velikost p\u0159ibli\u017en\u011b 155 GB, a p\u0159i zmen\u0161ov\u00e1n\u00ed na instanci s 1 uzlem jsme obdr\u017eeli n\u00e1sleduj\u00edc\u00ed chybu:<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoda\u0159ilo se n\u00e1m zmen\u0161it z 25 na 2 instance, ale zasekli jsme se na dvou uzlech.<\/p>\n<p>Zv\u00fd\u0161en\u00ed a sn\u00ed\u017een\u00ed po\u010dtu uzl\u016f v clusterech Cloud Spanner lze automatizovat pomoc\u00ed REST API. To m\u016f\u017ee b\u00fdt obzvl\u00e1\u0161\u0165 u\u017eite\u010dn\u00e9 pro sn\u00ed\u017een\u00ed zv\u00fd\u0161en\u00e9ho zat\u00ed\u017een\u00ed syst\u00e9mu b\u011bhem \u0161pi\u010dky.<\/p>\n<h4>V\u00fdkon OLAP dotaz\u016f?<\/h4>\n<p>\nP\u016fvodn\u011b jsme pl\u00e1novali v\u011bnovat zna\u010dn\u00fd \u010das na\u0161emu hodnocen\u00ed Spanneru t\u00e9to \u010d\u00e1sti. Po n\u011bkolika SELECT COUNT jsme si hned uv\u011bdomili, \u017ee testov\u00e1n\u00ed bude kr\u00e1tk\u00e9 a \u017ee Spanner NEN\u00cd vhodn\u00fd jako OLAP motor. Bez ohledu na po\u010det uzl\u016f v clusterech trval jednoduch\u00fd v\u00fdb\u011br po\u010dtu \u0159\u00e1dk\u016f v tabulce o 10M \u0159\u00e1dc\u00edch od 55 do 60 sekund. Nav\u00edc jak\u00fdkoli dotaz, kter\u00fd vy\u017eadoval v\u011bt\u0161\u00ed objem pam\u011bti pro uchov\u00e1n\u00ed meziv\u00fdsledk\u016f, skon\u010dil chybou OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M distinct values)-&gt; SpoolingHashAggregateIterator do\u0161el pam\u011bti b\u011bhem nov\u00e9 \u0159ady.<\/code><\/p>\n<p>N\u011bkter\u00e1 \u010d\u00edsla pro TPC-H dotazy lze nal\u00e9zt v \u010dl\u00e1nku 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>, slidy 42 a 43. Tato \u010d\u00edsla souhlas\u00ed s na\u0161imi vlastn\u00edm v\u00fdsledky (bohu\u017eel).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner: dobr\u00fd, \u0161patn\u00fd, zl\u00fd\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Na\u0161e z\u00e1v\u011bry<\/h4>\n<p>\nVzhledem k sou\u010dasn\u00e9mu stavu funkc\u00ed Cloud Spanner je obt\u00ed\u017en\u00e9 si p\u0159edstavit jeho jednoduchou n\u00e1hradu za st\u00e1vaj\u00edc\u00ed OLTP \u0159e\u0161en\u00ed, zejm\u00e9na kdy\u017e va\u0161e pot\u0159eby p\u0159ekro\u010d\u00ed jeho mo\u017enosti. Bylo by t\u0159eba str\u00e1vit zna\u010dn\u00e9 mno\u017estv\u00ed \u010dasu v\u00fdvojem \u0159e\u0161en\u00ed, kter\u00e9 by zohlednilo nedostatky Cloud Spanneru.<\/p>\n<p>Kdy\u017e jsme za\u010dali hodnotit Cloud Spanner, o\u010dek\u00e1vali jsme, \u017ee jeho spr\u00e1vcovsk\u00e9 funkce budou na \u00farovni nebo alespo\u0148 ne tak daleko od jin\u00fdch \u0159e\u0161en\u00ed Google SQL. Ale byli jsme p\u0159ekvapeni naprost\u00fdm nedostatkem z\u00e1loh a velmi omezenou kontrolou p\u0159\u00edstupu k prost\u0159edk\u016fm. Nemluv\u011b o absenci pohled\u016f, absenci lok\u00e1ln\u00edho v\u00fdvojov\u00e9ho prost\u0159ed\u00ed, nepodporovan\u00fdch sekvenc\u00edch, JDBC bez podpory DML a DDL a tak d\u00e1le.<\/p>\n<p>Kam se tedy obr\u00e1tit, pokud pot\u0159ebujete \u0161k\u00e1lovat transak\u010dn\u00ed datab\u00e1zi? Vypad\u00e1 to, \u017ee na trhu zat\u00edm neexistuje jedin\u00e9 \u0159e\u0161en\u00ed, kter\u00e9 by vyhovovalo v\u0161em p\u0159\u00edpad\u016fm pou\u017eit\u00ed. Existuje cel\u00e1 \u0159ada \u0159e\u0161en\u00ed s otev\u0159en\u00fdm a uzav\u0159en\u00fdm zdrojov\u00fdm k\u00f3dem (n\u011bkter\u00e9 z nich jsou zm\u00edn\u011bny v tomto \u010dl\u00e1nku), ka\u017ed\u00e9 z nich m\u00e1 sv\u00e9 siln\u00e9 a slab\u00e9 str\u00e1nky, ale \u017e\u00e1dn\u00e9 z nich nenab\u00edz\u00ed SaaS s SLA 99,999 % a vysokou m\u00edrou konzistence. Pokud je vysok\u00e1 \u00farove\u0148 SLA va\u0161\u00ed hlavn\u00ed prioritou a nechcete vytv\u00e1\u0159et vlastn\u00ed \u0159e\u0161en\u00ed pro v\u00edce cloudov\u00fdch prost\u0159ed\u00ed, Cloud Spanner by mohl b\u00fdt t\u00edm \u0159e\u0161en\u00edm, kter\u00e9 hled\u00e1te. M\u011bli byste si v\u0161ak b\u00fdt v\u011bdomi v\u0161ech jeho omezen\u00ed.<\/p>\n<p>Spravedlnosti je t\u0159eba \u0159\u00edci, \u017ee Cloud Spanner byl uveden do ve\u0159ejn\u00e9ho pou\u017eit\u00ed teprve na ja\u0159e 2017, tak\u017ee m\u00e1 smysl o\u010dek\u00e1vat, \u017ee n\u011bkter\u00e9 jeho sou\u010dasn\u00e9 nedostatky by mohly nakonec zmizet (doufejme), a kdy\u017e se tak stane, m\u016f\u017ee to v\u0161e zm\u011bnit. Nakonec, Cloud Spanner nen\u00ed jen vedlej\u0161\u00edm projektem pro Google. Google ho pou\u017e\u00edv\u00e1 jako z\u00e1klad pro dal\u0161\u00ed produkty Google. A kdy\u017e Google ned\u00e1vno nahradil Megastore v Google Cloud Storage Cloud Spanner, umo\u017enilo to Google Cloud Storage st\u00e1t se striktn\u011b konzistentn\u00edm pro seznamy objekt\u016f na celosv\u011btov\u00e9 \u00farovni (co\u017e se st\u00e1le net\u00fdk\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">Amazonu<\/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\u017ee nad\u011bje st\u00e1le existuje\u2026 douf\u00e1me.<\/p>\n<p>A to je v\u0161e. Stejn\u011b jako autor \u010dl\u00e1nku, i my st\u00e1le douf\u00e1me, co si o tom mysl\u00edte? Napi\u0161te n\u00e1m do koment\u00e1\u0159\u016f<\/p>\n<p><b>V\u0161echny z\u00e1jemce zveme k n\u00e1v\u0161t\u011bv\u011b na\u0161eho <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">bezplatn\u00fd webin\u00e1\u0159<\/a><\/noindex> v r\u00e1mci kter\u00e9ho podrobn\u011b p\u0159edvedeme kurz<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS pro v\u00fdvoj\u00e1\u0159e\u00bb<\/a><\/noindex> od OTUS.<\/b><br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/489012\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u044b \u043f\u0440\u0435\u0432\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043e Google Cloud Spanner, \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0438\u0432 \u0435\u0435 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u0443\u0440\u0441\u0430 \u00abAWS \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\u00bb. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 Lightspeed HQ. \u041a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 POS-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u0446\u0435\u0432, \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, Lightspeed \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69569,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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: dobr\u00e9, \u0161patn\u00e9, o\u0161kliv\u00e9 | ProHoster","description":"Ahoj, Habr\u00e1ci. Tradi\u010dn\u011b pokra\u010dujeme ve sd\u00edlen\u00ed zaj\u00edmav\u00e9ho materi\u00e1lu p\u0159ed za\u010d\u00e1tkem nov\u00fdch kurz\u016f.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/69568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}