{"id":37585,"date":"2019-10-31T22:18:27","date_gmt":"2019-10-31T19:18:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\/"},"modified":"2019-10-31T22:18:27","modified_gmt":"2019-10-31T19:18:27","slug":"kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","title":{"rendered":"Jak se pod\u00edvat do o\u010d\u00ed Kassand\u0159e a p\u0159i tom neztratit data, stabilitu a v\u00edru v NoSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jak se pod\u00edvat do o\u010d\u00ed Kassand\u0159e a p\u0159i tom neztratit data, stabilitu a v\u00edru v NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/4845d37a9928f888639c4ebeb7807787.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>\u0158\u00edk\u00e1 se, \u017ee v \u017eivot\u011b stoj\u00ed za to vyzkou\u0161et v\u0161echno alespo\u0148 jednou. A pokud jste zvykl\u00ed pracovat s rela\u010dn\u00edmi datab\u00e1zov\u00fdmi syst\u00e9my, setk\u00e1n\u00ed s NoSQL v praxi byste m\u011bli zv\u00e1\u017eit p\u0159edev\u0161\u00edm pro v\u0161eobecn\u00fd rozvoj. V sou\u010dasn\u00e9 dob\u011b, d\u00edky rychl\u00e9mu rozvoji t\u00e9to technologie, existuje mnoho protich\u016fdn\u00fdch n\u00e1zor\u016f a v\u00e1\u0161niv\u00fdch diskuz\u00ed na toto t\u00e9ma, co\u017e z\u00e1jem je\u0161t\u011b v\u00edce podporuje.<br \/>\nPokud se pono\u0159\u00edte do podstaty v\u0161ech t\u011bchto spor\u016f, m\u016f\u017eete vid\u011bt, \u017ee vznikaj\u00ed z nespr\u00e1vn\u00e9ho p\u0159\u00edstupu. Ti, kte\u0159\u00ed pou\u017e\u00edvaj\u00ed NoSQL datab\u00e1ze na m\u00edstech, kde jsou pot\u0159eba, jsou spokojeni a z\u00edsk\u00e1vaj\u00ed ze sv\u00e9ho \u0159e\u0161en\u00ed v\u0161echny jeho v\u00fdhody. Experiment\u00e1to\u0159i, kte\u0159\u00ed spol\u00e9haj\u00ed na tuto technologii jako na v\u0161el\u00e9k tam, kde nen\u00ed v\u016fbec pou\u017eiteln\u00e1, za\u017e\u00edvaj\u00ed zklam\u00e1n\u00ed, jeliko\u017e ztr\u00e1cej\u00ed siln\u00e9 str\u00e1nky rela\u010dn\u00edch datab\u00e1z\u00ed, ani\u017e by z\u00edskali v\u00fdznamn\u00e9 v\u00fdhody.<\/p>\n<p><\/p>\n<p>Pov\u00edm v\u00e1m o na\u0161\u00ed zku\u0161enosti s implementac\u00ed \u0159e\u0161en\u00ed zalo\u017een\u00e9ho na datab\u00e1zi Cassandra: s \u010d\u00edm jsme se pot\u00fdkali, jak jsme se dost\u00e1vali z obt\u00ed\u017en\u00fdch situac\u00ed, zda se n\u00e1m poda\u0159ilo z\u00edskat v\u00fdhody z pou\u017e\u00edv\u00e1n\u00ed NoSQL a kde jsme museli investovat dal\u0161\u00ed \u00fasil\u00ed\/n\u00e1klady.<br \/>\nZ\u00e1kladn\u00edm \u00fakolem je vytvo\u0159en\u00ed syst\u00e9mu, kter\u00fd zaznamen\u00e1v\u00e1 hovory do ur\u010dit\u00e9ho \u00falo\u017ei\u0161t\u011b.<\/p>\n<p><\/p>\n<p>Princip fungov\u00e1n\u00ed syst\u00e9mu je n\u00e1sleduj\u00edc\u00ed. Na vstupech p\u0159ich\u00e1zej\u00ed soubory s ur\u010ditou strukturou, popisuj\u00edc\u00ed strukturu hovoru. Aplikace pot\u00e9 zaji\u0161\u0165uje ulo\u017een\u00ed t\u00e9to struktury do odpov\u00eddaj\u00edc\u00edch sloupc\u016f. Ulo\u017een\u00e9 hovory se n\u00e1sledn\u011b pou\u017e\u00edvaj\u00ed \u2013 k zobrazen\u00ed informac\u00ed o spot\u0159eb\u011b dat pro \u00fa\u010dastn\u00edky (\u00fa\u010dtov\u00e1n\u00ed, hovory, historie z\u016fstatku).<\/p>\n<p>\n<img decoding=\"async\" alt=\"Jak se pod\u00edvat do o\u010d\u00ed Kassand\u0159e a p\u0159i tom neztratit data, stabilitu a v\u00edru v NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/c7b095dc8879011adb751c96427af512.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pro\u010d jsme zvolili Cassandru je zcela jasn\u00e9 \u2013 p\u00ed\u0161e jako kulomet, je snadno \u0161k\u00e1lovateln\u00e1 a odoln\u00e1 proti chyb\u00e1m.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Tak\u017ee, co n\u00e1m zku\u0161enost p\u0159inesla<\/h2>\n<p><\/p>\n<p>Ano, vyhozen\u00fd uzel \u2013 nen\u00ed trag\u00e9die. O tom je podstata odolnosti Kassandry. Ale <b>uzel m\u016f\u017ee b\u00fdt \u017eiv\u00fd a p\u0159esto za\u010d\u00edt m\u00edt probl\u00e9my s v\u00fdkonem<\/b>. Jak se uk\u00e1zalo, to se okam\u017eit\u011b odr\u00e1\u017e\u00ed na v\u00fdkonu cel\u00e9ho klastru.<\/p>\n<p><\/p>\n<p><b>Kassandra v\u00e1s nepodpo\u0159\u00ed tam, kde Oracle zachra\u0148oval sv\u00fdmi omezen\u00edmi<\/b>. A pokud autor aplikace tento aspekt p\u0159edem nepochopil, pak pro Kassandra nen\u00ed dubl v\u016fbec hor\u0161\u00ed ne\u017e origin\u00e1l. Kdy\u017e p\u0159i\u0161el, d\u00e1me ho.<\/p>\n<p><\/p>\n<p>Bezplatn\u00e1 Kassandra \u201ez krabice\u201c se n\u00e1hle nel\u00edbila IB: <b>\u017d\u00e1dn\u00e9 logov\u00e1n\u00ed akc\u00ed u\u017eivatel\u016f, ani rozd\u011blen\u00ed pr\u00e1v.<\/b>. Informace o vol\u00e1n\u00edch se t\u00fdk\u00e1 osobn\u00edch \u00fadaj\u016f, co\u017e znamen\u00e1, \u017ee v\u0161echny pokusy o jejich dotazov\u00e1n\u00ed \/ zm\u011bnu mus\u00ed b\u00fdt logov\u00e1ny s mo\u017enost\u00ed n\u00e1sledn\u00e9 auditu. Je tak\u00e9 nutn\u00e9 si uv\u011bdomit nezbytnost rozd\u011blen\u00ed pr\u00e1v na r\u016fzn\u00e9 \u00farovn\u011b pro r\u016fzn\u00e9 u\u017eivatele. Obvykl\u00fd in\u017een\u00fdr \u00fadr\u017eby a superadmin, kter\u00fd m\u016f\u017ee voln\u011b odstranit cel\u00fd keyspace \u2013 to jsou r\u016fzn\u00e9 role, jin\u00e1 odpov\u011bdnost a kompetence. Bez takov\u00e9ho rozd\u011blen\u00ed p\u0159\u00edstupu se hodnota a integrita dat velmi rychle dostanou pod ot\u00e1zku, rychleji ne\u017e na \u00farovni konzistence ANY. <\/p>\n<p><\/p>\n<p>Nepo\u010d\u00edtali jsme s t\u00edm, \u017ee k vol\u00e1n\u00edm je zapot\u0159eb\u00ed jak v\u00e1\u017en\u00e1 anal\u00fdza, tak i periodick\u00e9 v\u00fdb\u011bry podle nejr\u016fzn\u011bj\u0161\u00edch podm\u00ednek. Vzhledem k tomu, \u017ee vybran\u00e9 z\u00e1znamy se pak p\u0159edpokl\u00e1daj\u00ed k odstran\u011bn\u00ed a p\u0159eps\u00e1n\u00ed (v r\u00e1mci \u00fakolu mus\u00edme udr\u017eovat proces aktualizace dat, kdy\u017e k n\u00e1m p\u016fvodn\u011b do\u0161lo chybn\u00e9 kontury dat), Cassandra n\u00e1m zde nen\u00ed n\u00e1pomocn\u00e1. <b>Cassandra, jako pokladnice \u2013 je pohodln\u00e9 ji plnit, ale nebude mo\u017en\u00e9 v n\u00ed po\u010d\u00edtat.<\/b><\/p>\n<p><\/p>\n<p><b>Narazili jsme na probl\u00e9m s p\u0159enosem dat do testovac\u00edch z\u00f3n.<\/b> (5 uzl\u016f v testu oproti 20 v produkci). Dump v tomto p\u0159\u00edpad\u011b nebude mo\u017en\u00e9 pou\u017e\u00edt.<\/p>\n<p><\/p>\n<p>Probl\u00e9m s aktualizacemi sch\u00e9matu dat aplikace, kter\u00e1 zapisuje do Cassandry. <b>Rollback vytvo\u0159\u00ed velk\u00e9 mno\u017estv\u00ed tombston\u016f, co\u017e m\u016f\u017ee nep\u0159edv\u00eddateln\u00fdm zp\u016fsobem sn\u00ed\u017eit v\u00fdkon.<\/b>. Cassandra je optimalizov\u00e1na pro z\u00e1pis a p\u0159ed t\u00edm, ne\u017e zap\u00ed\u0161e, se moc neodva\u017euje. Jak\u00e1koli operace s existuj\u00edc\u00edmi daty je tak\u00e9 z\u00e1pis. Tedy odstran\u011bn\u00edm nadbyte\u010dn\u00fdch z\u00e1znam\u016f jednodu\u0161e vytvo\u0159\u00edme je\u0161t\u011b v\u00edce z\u00e1pis\u016f a pouze \u010d\u00e1st z nich bude ozna\u010dena jako tombstone.<\/p>\n<p><\/p>\n<p>\u010casov\u00e9 limity p\u0159i vkl\u00e1d\u00e1n\u00ed. Cassandra je skv\u011bl\u00e1 p\u0159i z\u00e1pisu, ale <b>n\u011bkdy ji p\u0159\u00edchoz\u00ed tok m\u016f\u017ee zna\u010dn\u011b zm\u00e1st.<\/b>. To se st\u00e1v\u00e1, kdy\u017e aplikace za\u010dne neust\u00e1le cyklit p\u0159es n\u011bkolik z\u00e1znam\u016f, kter\u00e9 nelze vlo\u017eit z jak\u00e9hokoli d\u016fvodu. A budeme pot\u0159ebovat skute\u010dn\u00e9ho DBA, kter\u00fd bude sledovat gc.log, syst\u00e9mov\u00e9 a debug logy pro pomal\u00e9 dotazy a metriky na \u010dekaj\u00edc\u00ed kompresi.\n<\/p>\n<p><\/p>\n<p>N\u011bkolik datov\u00fdch center v clusteru. <b>Odkud \u010d\u00edst a kam zapisovat?<\/b> <br \/>\nJe mo\u017en\u00e9 rozd\u011blit na \u010dten\u00ed a z\u00e1pis? A pokud ano, m\u011bl by b\u00fdt d\u00e9le zpracov\u00e1vaj\u00edc\u00ed server pro z\u00e1pis nebo pro \u010dten\u00ed? A nestane se, \u017ee budeme m\u00edt skute\u010dn\u00fd split brain, pokud \u0161patn\u011b zvol\u00edme \u00farove\u0148 konzistence? Je tu spousta ot\u00e1zek, mnoho neprozkouman\u00fdch nastaven\u00ed a mo\u017enost\u00ed, kter\u00e9 bychom cht\u011bli vyzkou\u0161et.\n<\/p>\n<p><\/p>\n<h2>Jak jsme se rozhodli<\/h2>\n<p><\/p>\n<p><b>Aby n\u00f3d nezahlcoval, jsme vypnuli SWAP<\/b>. A te\u010f, kdy\u017e je nedostatek pam\u011bti, by m\u011bl n\u00f3d selhat, a ne vytv\u00e1\u0159et dlouh\u00e9 gc pauzy.<\/p>\n<p><\/p>\n<p>Tak\u017ee na logiku v datab\u00e1zi u\u017e se v\u00edce nespol\u00e9h\u00e1me. <b>V\u00fdvoj\u00e1\u0159i aplikace se p\u0159eu\u010duj\u00ed a za\u010d\u00ednaj\u00ed se aktivn\u011b chr\u00e1nit ve sv\u00e9m vlastn\u00edm k\u00f3du.<\/b> Ide\u00e1ln\u00ed jasn\u00e9 rozd\u011blen\u00ed mezi ukl\u00e1d\u00e1n\u00edm a zpracov\u00e1n\u00edm dat.<\/p>\n<p><\/p>\n<p><b>Zakoupili jsme podporu od DataStax.<\/b> Komer\u010dn\u00ed Cassandra u\u017e se p\u0159estala vyv\u00edjet (posledn\u00ed commit v \u00fanoru 2018). Z\u00e1rove\u0148 ale Datastax nab\u00edz\u00ed vynikaj\u00edc\u00ed slu\u017eby a velk\u00e9 mno\u017estv\u00ed vylep\u0161en\u00fdch a p\u0159izp\u016fsoben\u00fdch \u0159e\u0161en\u00ed pro existuj\u00edc\u00ed informa\u010dn\u00ed syst\u00e9my.<\/p>\n<p><\/p>\n<p>R\u00e1d bych tak\u00e9 poznamenal, \u017ee Cassandra nen\u00ed p\u0159\u00edli\u0161 pohodln\u00e1 pro dotazy na v\u00fdb\u011br. Samoz\u0159ejm\u011b, CQL je velk\u00fd krok vp\u0159ed pro u\u017eivatele (v porovn\u00e1n\u00ed s Thrift). Ale pokud m\u00e1te cel\u00e9 odd\u011blen\u00ed zvykl\u00e9 na tak pohodln\u00e9 spojov\u00e1n\u00ed, volnou filtraci podle jak\u00e9hokoli pole a mo\u017enosti optimalizace dotaz\u016f, a tato odd\u011blen\u00ed pracuj\u00ed na tom, aby \u0159e\u0161ila n\u00e1roky a hav\u00e1rie, pak se jim \u0159e\u0161en\u00ed na Cassand\u0159e zd\u00e1 nep\u0159\u00e1telsk\u00e9 a hloup\u00e9. A za\u010dali jsme \u0159e\u0161it, jak umo\u017enit na\u0161im koleg\u016fm prov\u00e1d\u011bt v\u00fdb\u011bry. <\/p>\n<p><\/p>\n<p>Zva\u017eovali jsme dv\u011b mo\u017enosti. V prvn\u00ed mo\u017enosti zapisujeme v\u00fdvol\u00e1n\u00ed nejen do C*, ale tak\u00e9 do archivn\u00ed datab\u00e1ze Oracle. Jen s t\u00edm rozd\u00edlem, \u017ee v t\u00e9to datab\u00e1zi jsou ulo\u017eeny v\u00fdvol\u00e1n\u00ed pouze za aktu\u00e1ln\u00ed m\u011bs\u00edc (dostate\u010dn\u00e1 hloubka uchov\u00e1v\u00e1n\u00ed v\u00fdvol\u00e1n\u00ed pro p\u0159\u00edpady p \u0440\u0435-tarifikace). Zde se hned vybavovala dal\u0161\u00ed probl\u00e9m: pokud bychom psali synchronn\u011b, ztr\u00e1c\u00edme v\u0161echny v\u00fdhody C*, spojen\u00e9 s rychl\u00fdm vkl\u00e1d\u00e1n\u00edm, pokud asynchronn\u011b \u2013 nen\u00ed zaru\u010deno, \u017ee v\u0161echna pot\u0159ebn\u00e1 v\u00fdvol\u00e1n\u00ed v\u016fbec dostala do Oracle. Plus byl jeden, ale velk\u00fd: pro provozov\u00e1n\u00ed z\u016fst\u00e1v\u00e1 st\u00e1le ten sam\u00fd zn\u00e1m\u00fd PL\/SQL Developer, tj. prakticky realizujeme vzor \u201eFas\u00e1dn\u00ed\u201c. Alternativn\u00ed mo\u017enost. Realizujeme mechanismus, kter\u00fd vyv\u00e1\u017e\u00ed v\u00fdvol\u00e1n\u00ed z C*, vytahuje n\u011bjak\u00e1 data pro obohacen\u00ed z odpov\u00eddaj\u00edc\u00edch tabulek v Oracle, spojuje z\u00edskan\u00e9 v\u00fdb\u011bry a vyd\u00e1v\u00e1 n\u00e1m v\u00fdsledn\u00fd v\u00fdstup, kter\u00fd potom n\u011bjak vyu\u017eijeme (vrac\u00edme, opakujeme, analyzujeme, obdivujeme). Nev\u00fdhody: proces se ukazuje jako pom\u011brn\u011b v\u00edcestup\u0148ov\u00fd a nav\u00edc chyb\u00ed rozhran\u00ed pro zam\u011bstnance provozu.<\/p>\n<p><\/p>\n<p>Nakonec jsme se p\u0159ece jen rozhodli pro druhou variantu. <b>Pro v\u00fdb\u011bry z r\u016fzn\u00fdch zdroj\u016f jsme pou\u017eili Apache Spark.<\/b> Podstata mechanismu spo\u010d\u00edvala v Java k\u00f3du, kter\u00fd podle zadan\u00fdch kl\u00ed\u010d\u016f (p\u0159edplatitel, \u010das proveden\u00ed v\u00fdvol\u00e1n\u00ed \u2013 kl\u00ed\u010de odd\u00edlu) vytahuje data z C*, stejn\u011b jako pot\u0159ebn\u00e1 data pro obohacen\u00ed z jak\u00e9koli jin\u00e9 datab\u00e1ze. Pot\u00e9 je spojuje ve sv\u00e9 pam\u011bti a v\u00fdstup vrac\u00ed do v\u00fdsledkov\u00e9 tabulky. Na Sparku jsme vytvo\u0159ili webov\u00e9 rozhran\u00ed a v\u00fdstup se uk\u00e1zal jako zcela pou\u017eiteln\u00e9 v provozu.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Jak se pod\u00edvat do o\u010d\u00ed Kassand\u0159e a p\u0159i tom neztratit data, stabilitu a v\u00edru v NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/5754363569f159dd7b86972bb0cef732.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>P\u0159i \u0159e\u0161en\u00ed \u00fakolu s aktualizac\u00ed dat jsme znovu zva\u017eovali n\u011bkolik zp\u016fsob\u016f. Jak p\u0159enos p\u0159es Sstloader, tak varianta se rozd\u011blen\u00edm clusteru v testovac\u00ed z\u00f3n\u011b na dv\u011b \u010d\u00e1sti, z nich\u017e ka\u017ed\u00e1 se st\u0159\u00eddav\u011b p\u0159ipojuje k jednomu clusteru s produk\u010dn\u00edmi daty, \u010d\u00edm\u017e se od n\u011bj nap\u00e1j\u00ed. P\u0159i aktualizaci testu se pl\u00e1novalo je vym\u011bnit: ta \u010d\u00e1st, kter\u00e1 pracovala v testu, se vy\u010dist\u00ed a zavede do produkce, zat\u00edmco druh\u00e1 za\u010dne pracovat s daty samostatn\u011b. Po dal\u0161\u00edm uv\u00e1\u017een\u00ed jsme v\u0161ak racion\u00e1ln\u011bji posoudili, kter\u00e1 data stoj\u00ed za p\u0159enos, a pochopili jsme, \u017ee samotn\u00e9 vol\u00e1n\u00ed je nekonzistentn\u00ed entita pro testy, rychle generovan\u00e1 podle pot\u0159eby, a pr\u00e1v\u011b produk\u010dn\u00ed datov\u00e1 sada nem\u00e1 hodnotu pro p\u0159enos do testu. Existuje n\u011bkolik objekt\u016f, kter\u00e9 stoj\u00ed za p\u0159enos, ale jsou to doslova jen p\u00e1r tabulek, kter\u00e9 nejsou p\u0159\u00edli\u0161 t\u011b\u017ek\u00e9. Proto n\u00e1m <b>jako \u0159e\u0161en\u00ed znovu pomohl Spark, d\u00edky n\u011bmu\u017e jsme napsali a za\u010dali aktivn\u011b pou\u017e\u00edvat skript na p\u0159enos dat mezi tabulkami produkce a testu.<\/b><\/p>\n<p><\/p>\n<p><b>Na\u0161e sou\u010dasn\u00e1 politika nasazen\u00ed n\u00e1m umo\u017e\u0148uje pracovat bez n\u00e1vrat\u016f zp\u011bt.<\/b> P\u0159ed produkc\u00ed je povinn\u00fd nasazen\u00ed na test, kde chyba nen\u00ed tak drah\u00e1. V p\u0159\u00edpad\u011b ne\u00fasp\u011bchu je v\u017edy mo\u017en\u00e9 odstranit keyspace a nasadit celou sch\u00e9ma od za\u010d\u00e1tku.<\/p>\n<p><\/p>\n<p>Pro zaji\u0161t\u011bn\u00ed nep\u0159etr\u017eit\u00e9 dostupnosti Cassandry je pot\u0159eba DBA a nejen on. <b>V\u0161ichni, kdo pracuj\u00ed s aplikac\u00ed, by m\u011bli ch\u00e1pat, kde a jak sledovat aktu\u00e1ln\u00ed stav a jak v\u010das diagnostikovat probl\u00e9my.<\/b> K tomu aktivn\u011b pou\u017e\u00edv\u00e1me DataStax OpsCenter (spr\u00e1va a monitorov\u00e1n\u00ed pracovn\u00edch z\u00e1t\u011b\u017e\u00ed), syst\u00e9mov\u00e9 metriky Cassandra Driver (po\u010det timeout\u016f p\u0159i z\u00e1pisu do C*, po\u010det timeout\u016f p\u0159i \u010dten\u00ed z C*, maxim\u00e1ln\u00ed latence atd.), monitorujeme pr\u00e1ci samotn\u00e9 aplikace, kter\u00e1 pracuje s Cassandrou.\n<\/p>\n<p><\/p>\n<p>Kdy\u017e jsme p\u0159em\u00fd\u0161leli o p\u0159edchoz\u00ed ot\u00e1zce, pochopili jsme, kde se m\u016f\u017ee skr\u00fdvat hlavn\u00ed riziko. T\u00edm jsou formy zobrazen\u00ed dat, kter\u00e9 na\u010d\u00edtaj\u00ed informace z n\u011bkolika nez\u00e1visl\u00fdch dotaz\u016f do \u00falo\u017ei\u0161t\u011b. T\u00edmto zp\u016fsobem m\u016f\u017eeme z\u00edskat zna\u010dn\u011b nekonzistentn\u00ed informace. Tento probl\u00e9m by v\u0161ak byl stejn\u011b aktu\u00e1ln\u00ed, i kdybychom pracovali pouze s jedn\u00edm datov\u00fdm centrem. Nejrozumn\u011bj\u0161\u00ed je tedy vytvo\u0159it d\u00e1vkovou funkci pro \u010dten\u00ed dat na extern\u00ed aplikaci, kter\u00e1 zajist\u00ed z\u00edsk\u00e1n\u00ed dat v jednotn\u00e9m \u010dasov\u00e9m obdob\u00ed. Co se t\u00fd\u010de d\u011blen\u00ed na \u010dten\u00ed a z\u00e1pis z hlediska v\u00fdkonu, zde n\u00e1s zastavilo riziko, \u017ee p\u0159i ur\u010dit\u00e9 ztr\u00e1t\u011b konektivity mezi datov\u00fdmi centry m\u016f\u017eeme z\u00edskat dva zcela nesourod\u00e9 clustery.<\/p>\n<p><\/p>\n<p>V d\u016fsledku toho, v sou\u010dasnosti <b>jsme se rozhodli pro \u00farove\u0148 konzistence pro z\u00e1pis EACH_QUORUM, pro \u010dten\u00ed \u2013 LOCAL_QUORUM.<\/b><\/p>\n<p><\/p>\n<h2>Kr\u00e1tk\u00e9 dojmy a z\u00e1v\u011bry<\/h2>\n<p><\/p>\n<p>Abychom ohodnotili vznikl\u00e9 \u0159e\u0161en\u00ed z hlediska provozn\u00ed podpory a vyhl\u00eddek na dal\u0161\u00ed v\u00fdvoj, rozhodli jsme se zamyslet, kde je\u0161t\u011b lze tuto vyvinutou technologii aplikovat.<\/p>\n<p><\/p>\n<p>Pokud hned, pak sk\u00f3ring dat pro programy typu \u201ePla\u0165, kdy\u017e je to pohodln\u00e9\u201c (nahr\u00e1v\u00e1me do C* informace, v\u00fdpo\u010dty na skriptech Spark), sledov\u00e1n\u00ed st\u00ed\u017enost\u00ed s agregac\u00ed podle sm\u011br\u016f, uchov\u00e1v\u00e1n\u00ed rol\u00ed a v\u00fdpo\u010dty podle matice p\u0159\u00edstupov\u00fdch pr\u00e1v u\u017eivatel\u016f. <\/p>\n<p><\/p>\n<p>Jak vid\u00edme, reperto\u00e1r je \u0161irok\u00fd a r\u016fznorod\u00fd. A pokud bychom m\u011bli vybrat stranu zast\u00e1nc\u016f\/odp\u016frc\u016f NoSQL, postavili bychom se na stranu zast\u00e1nc\u016f, proto\u017ee jsme z\u00edskali sv\u00e9 v\u00fdhody, a to pr\u00e1v\u011b tam, kde jsme \u010dekali.<\/p>\n<p><\/p>\n<p>I variant Cassandra z krabice umo\u017e\u0148uje horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed v re\u00e1ln\u00e9m \u010dase, naprosto bezbolestn\u011b \u0159e\u0161\u00edc\u00ed probl\u00e9m zvy\u0161ov\u00e1n\u00ed dat v syst\u00e9mu. Dok\u00e1zali jsme odd\u011blit vysoce zat\u00ed\u017een\u00fd mechanismus pro v\u00fdpo\u010det agreg\u00e1t\u016f podle hovor\u016f a tak\u00e9 odd\u011blit sch\u00e9ma a logiku aplikace, \u010d\u00edm\u017e jsme se zbavili \u0161kodliv\u00e9 praxe psan\u00ed vlastn\u00edch \u00faloh a objekt\u016f p\u0159\u00edmo v datab\u00e1zi. Z\u00edskali jsme mo\u017enost vybrat a p\u0159izp\u016fsobit, pro urychlen\u00ed, na kter\u00fdch datov\u00fdch centrech provedeme v\u00fdpo\u010dty a na kter\u00fdch z\u00e1pis dat, \u010d\u00edm\u017e jsme se zabezpe\u010dili v\u016f\u010di selh\u00e1n\u00ed jak jednotliv\u00fdch uzl\u016f, tak celkov\u011b datov\u00fdch center.<\/p>\n<p><\/p>\n<p>P\u0159i aplikaci na nov\u00e9 projekty na\u0161\u00ed architektury, p\u0159i\u010dem\u017e ji\u017e m\u00e1me n\u011bjak\u00e9 zku\u0161enosti, bychom cht\u011bli ihned vz\u00edt v \u00favahu v\u00fd\u0161e uveden\u00e9 nuance a vyhnout se n\u011bkter\u00fdm chyb\u00e1m, zm\u00edrnit ur\u010dit\u00e9 ostr\u00e9 hrany, kter\u00fdm se ze za\u010d\u00e1tku nedalo vyhnout.<\/p>\n<p><\/p>\n<p>Nap\u0159\u00edklad, <b>v\u010das sledovat aktualizace samotn\u00e9 Cassandry<\/b>, proto\u017ee \u0159ada probl\u00e9m\u016f, kter\u00e9 jsme m\u011bli, ji\u017e byla zn\u00e1m\u00e1 a \u0159e\u0161ila se.<\/p>\n<p><\/p>\n<p><b>Nesazovat jak samotnou datab\u00e1zi, tak Spark na stejn\u00e9 uzly<\/b> ((nebo striktn\u011b rozd\u011blovat podle mno\u017estv\u00ed povolen\u00e9 vyu\u017eit\u00ed zdroj\u016f), proto\u017ee Spark m\u016f\u017ee spot\u0159ebovat v\u00edce RAM, ne\u017e je povoleno, a rychle se dostaneme k probl\u00e9mu \u010d\u00edslo 1 z na\u0161eho seznamu.<\/p>\n<p><\/p>\n<p><b>Zlep\u0161ovat monitoring a dovednosti provozu ji\u017e v testovac\u00ed f\u00e1zi projektu. <\/b><b>Od za\u010d\u00e1tku br\u00e1t v \u00favahu co nejv\u00edce v\u0161ech potenci\u00e1ln\u00edch u\u017eivatel\u016f na\u0161eho \u0159e\u0161en\u00ed<\/b>, nebo\u0165 pr\u00e1v\u011b od toho bude nakonec z\u00e1viset struktura datab\u00e1ze.<\/p>\n<p><\/p>\n<p>N\u011bkolikr\u00e1t proj\u00edt v\u00fdslednou sch\u00e9matu z hlediska mo\u017en\u00e9 optimalizace. Vymezit, kter\u00e9 pole lze serializovat. Pochopit, jak\u00e9 dal\u0161\u00ed tabulky pot\u0159ebujeme vytvo\u0159it, abychom co nejp\u0159esn\u011bji a optim\u00e1ln\u011b brali v \u00favahu a pot\u00e9 vraceli po\u017eadovan\u00e9 informace (nap\u0159\u00edklad s ohledem na to, \u017ee stejn\u00e9 \u00fadaje m\u016f\u017eeme uchov\u00e1vat v r\u016fzn\u00fdch tabulk\u00e1ch, s ohledem na r\u016fzn\u00e9 \u010dlen\u011bn\u00ed podle r\u016fzn\u00fdch krit\u00e9ri\u00ed, m\u016f\u017eeme v\u00fdrazn\u011b \u0161et\u0159it procesorov\u00fd \u010das p\u0159i \u010dten\u00ed dotaz\u016f).<\/p>\n<p><\/p>\n<p>Docela dob\u0159e <b>ihned p\u0159edpokl\u00e1dat p\u0159i\u0159azen\u00ed TTL a \u00fadr\u017ebu zastaral\u00fdch dat.<\/b><\/p>\n<p><\/p>\n<p>P\u0159i exportu dat z Cassandry <b>logika aplikace by m\u011bla fungovat na principu FETCH, aby se ne v\u0161echny \u0159\u00e1dky na\u010d\u00edtaly do pam\u011bti najednou, ale vyb\u00edraly se po d\u00e1vk\u00e1ch.<\/b><\/p>\n<p><\/p>\n<p>Ide\u00e1ln\u011b p\u0159ed p\u0159evodem projektu na popisovan\u00e9 \u0159e\u0161en\u00ed <b>ov\u011b\u0159it odolnost syst\u00e9mu proveden\u00edm s\u00e9rie crash-test\u016f<\/b>, jako je ztr\u00e1ta dat v jednom datov\u00e9m centru, obnova po\u0161kozen\u00fdch dat za ur\u010dit\u00e9 obdob\u00ed, pokles s\u00edt\u011b mezi datov\u00fdmi centry. Takov\u00e9 testy umo\u017en\u00ed nejen posoudit v\u00fdhody a nev\u00fdhody navrhovan\u00e9 architektury, ale tak\u00e9 poskytnou dobrou tr\u00e9ninkovou praxi pro in\u017een\u00fdry, kte\u0159\u00ed je prov\u00e1d\u011bj\u00ed, a z\u00edskan\u00e9 dovednosti nebudou nikdy na \u0161kodu, pokud dojde k selh\u00e1n\u00edm syst\u00e9m\u016f v produk\u010dn\u00edm prost\u0159ed\u00ed.<\/p>\n<p><\/p>\n<p>Pokud pracujeme s kritick\u00fdmi informacemi (jako jsou \u00fadaje pro fakturaci, v\u00fdpo\u010det dluhu z\u00e1kazn\u00edka), je tak\u00e9 d\u016fle\u017eit\u00e9 v\u011bnovat pozornost n\u00e1stroj\u016fm, kter\u00e9 umo\u017e\u0148uj\u00ed sn\u00ed\u017eit rizika vypl\u00fdvaj\u00edc\u00ed z charakteristiky DBMS. Nap\u0159\u00edklad je vhodn\u00e9 pou\u017e\u00edt utilitu nodesync (Datastax) a vypracovat optim\u00e1ln\u00ed strategii jej\u00edho vyu\u017eit\u00ed, aby <b>se pro zachov\u00e1n\u00ed konzistence nevytv\u00e1\u0159elo nadm\u011brn\u00e9 zat\u00ed\u017een\u00ed na Cassandru.<\/b> a pou\u017e\u00edvat ji pouze pro ur\u010dit\u00e9 tabulky v ur\u010dit\u00fdch obdob\u00edch.<\/p>\n<p><\/p>\n<p>Tak co, po p\u016fl roce \u017eivota s Cassandrou? Celkov\u011b nen\u00ed \u017e\u00e1dn\u00fd nevy\u0159e\u0161en\u00fd probl\u00e9m. Z\u00e1va\u017en\u00e9 hav\u00e1rie a ztr\u00e1ty dat jsme tak\u00e9 nezaznamenali. Ano, bylo t\u0159eba zamyslet se nad kompenzac\u00ed n\u011bkter\u00fdch d\u0159\u00edve nevznikl\u00fdch probl\u00e9m\u016f, ale nakonec to z\u00e1sadn\u011b neovlivnilo na\u0161e architektonick\u00e9 rozhodnut\u00ed. Pokud m\u00e1te chu\u0165 a neboj\u00edte se zkou\u0161et n\u011bco nov\u00e9ho, a p\u0159itom nechcete b\u00fdt p\u0159\u00edli\u0161 zklam\u00e1ni, p\u0159ipravte se na to, \u017ee nic nen\u00ed zadarmo. Budete muset v\u00edce studovat, pono\u0159it se do dokumentace a shrom\u00e1\u017edit sv\u00e9 vlastn\u00ed individu\u00e1ln\u00ed probl\u00e9mov\u00e9 situace, ne\u017e u star\u00e9ho legacy \u0159e\u0161en\u00ed, a \u017e\u00e1dn\u00e1 teorie v\u00e1m p\u0159edem ne\u0159ekne, jak\u00e9 konkr\u00e9tn\u00ed p\u0159ek\u00e1\u017eky na v\u00e1s \u010dekaj\u00ed.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465333\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0432 \u0436\u0438\u0437\u043d\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0440\u0430\u0437. \u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414, \u0442\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441 NoSQL \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u0441\u0438\u043b\u0443 \u0431\u0443\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439 \u0438 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u0441\u043f\u043e\u0440\u043e\u0432 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043e\u0433\u0440\u0435\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441. \u0415\u0441\u043b\u0438 \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28210,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37585","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=\".\" \/>\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\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\" \/>\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\udd47\u041a\u0430\u043a \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0433\u043b\u0430\u0437\u0430 \u041a\u0430\u0441\u0441\u0430\u043d\u0434\u0440\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0435\u0440\u0443 \u0432 NoSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\" \/>\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=\"2019-10-31T19:18:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:27+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\udd47Jak nahl\u00e9dnout do o\u010d\u00ed Cassand\u0159e a p\u0159itom neztratit data, stabilitu a v\u00edru v NoSQL | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","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\udd47\u041a\u0430\u043a \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0433\u043b\u0430\u0437\u0430 \u041a\u0430\u0441\u0441\u0430\u043d\u0434\u0440\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0435\u0440\u0443 \u0432 NoSQL | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","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":"2019-10-31T19:18:27+00:00","article:modified_time":"2019-10-31T19:18:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37585","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":"2026-01-23 18:29:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:06:01","updated":"2026-01-23 18:29:19","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\/37585","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=37585"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/37585\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/28210"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=37585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=37585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=37585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}