{"id":81936,"date":"2020-05-18T01:42:37","date_gmt":"2020-05-17T23:42:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera"},"modified":"2020-05-18T01:42:37","modified_gmt":"2020-05-17T23:42:37","slug":"szhatie-dannyh-v-apache-ignite-opyt-sbera","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","title":{"rendered":"Kompresn\u00ed data v Apache Ignite. Zku\u0161enosti Sberbanky","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kompresn\u00ed data v Apache Ignite. Zku\u0161enosti Sberbanky\" src=\"\/wp-content\/uploads\/2020\/05\/0e26c686b1f29e88e6be4b8df81ab668.jpg\" style=\"display:block;margin: 0 auto;\" \/>P\u0159i pr\u00e1ci s velk\u00fdm objemem dat se n\u011bkdy m\u016f\u017ee akutn\u011b vyno\u0159it probl\u00e9m nedostatku m\u00edsta na disc\u00edch. Jedn\u00edm z \u0159e\u0161en\u00ed tohoto probl\u00e9mu je komprese, d\u00edky kter\u00e9 si na stejn\u00e9m za\u0159\u00edzen\u00ed m\u016f\u017eete dovolit zv\u00fd\u0161it objemy \u00falo\u017ei\u0161t\u011b. V tomto \u010dl\u00e1nku se pod\u00edv\u00e1me, jak funguje komprese dat v Apache Ignite. \u010cl\u00e1nek se bude zab\u00fdvat pouze metodami komprese implementovan\u00fdmi uvnit\u0159 produktu na disku. Ostatn\u00ed metody komprese dat (p\u0159es s\u00ed\u0165, v pam\u011bti), a\u0165 u\u017e realizovan\u00e9, nebo ne, z\u016fstanou mimo rozsah \u010dl\u00e1nku.<\/p>\n<p>Tak\u017ee p\u0159i zapnut\u00e9m re\u017eimu persistence, v d\u016fsledku zm\u011bny dat v cache, Ignite za\u010dne zapisovat na disk:<\/p>\n<ol>\n<li>Obsah cache<\/li>\n<li>\u017durn\u00e1l pro zapisov\u00e1n\u00ed p\u0159edem (Write Ahead Log, d\u00e1le jen WAL)<\/li>\n<\/ol>\n<p>\nPro kompresi WAL ji\u017e existuje mechanismus, kter\u00fd se naz\u00fdv\u00e1 WAL compaction. V ned\u00e1vno vydan\u00e9m Apache Ignite 2.8 se objevily dal\u0161\u00ed dva mechanizmy, kter\u00e9 umo\u017e\u0148uj\u00ed komprimovat data na disku: disk page compression pro kompresi obsahu cache a WAL page snapshot compression pro kompresi n\u011bkter\u00fdch z\u00e1znam\u016f WAL. V\u00edce o v\u0161ech t\u011bchto t\u0159ech mechanizmech n\u00ed\u017ee.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Disk page compression<\/h3>\n<p><\/p>\n<h4>Jak to funguje<\/h4>\n<p>\nNejprve se velmi stru\u010dn\u011b zamysl\u00edme nad t\u00edm, jak Ignite ukl\u00e1d\u00e1 data. Pro ukl\u00e1d\u00e1n\u00ed se pou\u017e\u00edv\u00e1 str\u00e1nkov\u00e1 pam\u011b\u0165. Velikost str\u00e1nky je stanovena p\u0159i spu\u0161t\u011bn\u00ed uzlu a nem\u016f\u017ee b\u00fdt zm\u011bn\u011bna v pozd\u011bj\u0161\u00edch f\u00e1z\u00edch, nav\u00edc mus\u00ed b\u00fdt velikost str\u00e1nky mocninou dvou a d\u011bliteln\u00e1 velikost\u00ed bloku souborov\u00e9ho syst\u00e9mu. Str\u00e1nky jsou na\u010d\u00edt\u00e1ny do RAM z disku podle pot\u0159eby, velikost dat na disku m\u016f\u017ee p\u0159ekro\u010dit objem p\u0159id\u011blen\u00e9 RAM. V p\u0159\u00edpad\u011b nedostatku m\u00edsta v RAM pro na\u010dten\u00ed str\u00e1nky z disku budou star\u00e9, ji\u017e nepou\u017e\u00edvan\u00e9 str\u00e1nky vytla\u010deny z RAM.<\/p>\n<p>Na disku jsou data uchov\u00e1v\u00e1na n\u00e1sleduj\u00edc\u00edm zp\u016fsobem: pro ka\u017edou partici ka\u017ed\u00e9 cache skupiny se vytv\u00e1\u0159\u00ed samostatn\u00fd soubor, v tomto souboru jdou str\u00e1nky za sebou vzestupn\u011b dle indexu. Kompletn\u00ed identifik\u00e1tor str\u00e1nky obsahuje identifik\u00e1tor cache skupiny, \u010d\u00edslo partition a index str\u00e1nky v souboru. T\u00edm p\u00e1dem podle kompletn\u00edho identifik\u00e1toru str\u00e1nky m\u016f\u017eeme jednozna\u010dn\u011b ur\u010dit soubor a offset v souboru pro ka\u017edou str\u00e1nku. Podrobn\u011bji o uspo\u0159\u00e1d\u00e1n\u00ed str\u00e1nkov\u00e9 pam\u011bti se m\u016f\u017eete do\u010d\u00edst v \u010dl\u00e1nku na Apache Ignite Wiki: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 pod kapotou<\/a><\/noindex>.<\/p>\n<p>Mechanismus komprese diskov\u00fdch str\u00e1nek, jak lze odvodit z n\u00e1zvu, funguje na \u00farovni str\u00e1nek. Po aktivaci tohoto mechanismu se pr\u00e1ce s daty v RAM prov\u00e1d\u00ed tak, jak jsou, bez jak\u00e9koli komprese, ale v okam\u017eiku ukl\u00e1d\u00e1n\u00ed str\u00e1nek z RAM na disk se prov\u00e1d\u00ed jejich komprese.<\/p>\n<p>Ale stla\u010dit ka\u017edou str\u00e1nku zvl\u00e1\u0161\u0165 je\u0161t\u011b nen\u00ed \u0159e\u0161en\u00ed probl\u00e9mu, je t\u0159eba n\u011bjak sn\u00ed\u017eit velikost v\u00fdsledn\u00fdch soubor\u016f s daty. Pokud se velikost str\u00e1nky p\u0159estane pevn\u011b definovat, u\u017e nem\u016f\u017eeme zapisovat str\u00e1nky do souboru jednu po druh\u00e9, proto\u017ee to m\u016f\u017ee vyvolat celou \u0159adu probl\u00e9m\u016f:<\/p>\n<ul>\n<li>Nebudeme schopni pomoc\u00ed indexu str\u00e1nky vypo\u010d\u00edtat offset, na kter\u00e9m se nach\u00e1z\u00ed v souboru.<\/li>\n<li>Nen\u00ed jasn\u00e9, co d\u011blat se str\u00e1nkami, kter\u00e9 se nenach\u00e1zej\u00ed na konci souboru a m\u011bn\u00ed svou velikost. Pokud se velikost str\u00e1nky zmen\u0161uje, m\u00edsto, kter\u00e9 uvolnila, se ztr\u00e1c\u00ed. Pokud se velikost str\u00e1nky zv\u011bt\u0161uje, pro ni je t\u0159eba hledat u\u017e nov\u00e9 m\u00edsto v souboru.<\/li>\n<li>Pokud se str\u00e1nka posune o po\u010det bajt\u016f, kter\u00fd nen\u00ed n\u00e1sobkem velikosti bloku souborov\u00e9ho syst\u00e9mu, bude pro jej\u00ed \u010dten\u00ed nebo z\u00e1pis nutn\u00e9 zas\u00e1hnout o jeden blok souborov\u00e9ho syst\u00e9mu v\u00edce, co\u017e m\u016f\u017ee v\u00e9st k degradaci v\u00fdkonu.<\/li>\n<\/ul>\n<p>\nAby se tyto probl\u00e9my ne\u0159e\u0161ily na sv\u00e9 \u00farovni, uv\u00e1d\u00ed komprese diskov\u00fdch str\u00e1nek v Apache Ignite mechanismus souborov\u00e9ho syst\u00e9mu nazvan\u00fd sparse files. Sparse (\u0159\u00eddce os\u00eddlen\u00fd) soubor je takov\u00fd soubor, ve kter\u00e9m mohou b\u00fdt n\u011bkter\u00e9 oblasti vypln\u011bn\u00e9 nulami ozna\u010deny jako \u201ed\u00edry\u201c. P\u0159i tom bloky souborov\u00e9ho syst\u00e9mu pro ukl\u00e1d\u00e1n\u00ed t\u011bchto d\u011br nebudou p\u0159id\u011bleny, \u010d\u00edm\u017e se dosahuje \u00faspory m\u00edsta na disku.<\/p>\n<p>Je logick\u00e9, \u017ee aby bylo mo\u017en\u00e9 uvolnit blok souborov\u00e9ho syst\u00e9mu, mus\u00ed b\u00fdt velikost d\u00edry v\u011bt\u0161\u00ed nebo rovna velikosti bloku souborov\u00e9ho syst\u00e9mu, co\u017e klade dal\u0161\u00ed omezen\u00ed na velikost str\u00e1nky v Apache Ignite: aby komprese m\u011bla n\u011bjak\u00fd efekt, mus\u00ed b\u00fdt velikost str\u00e1nky striktn\u011b v\u011bt\u0161\u00ed ne\u017e velikost bloku souborov\u00e9ho syst\u00e9mu. Pokud bude velikost str\u00e1nky rovna velikosti bloku, nikdy nebudeme schopni uvolnit \u017e\u00e1dn\u00fd blok, proto\u017ee aby bylo mo\u017en\u00e9 uvolnit jedin\u00fd blok, mus\u00ed stla\u010den\u00e1 str\u00e1nka zab\u00edrat 0 bajt\u016f. Pokud bude v\u0161ak velikost str\u00e1nky rovna velikosti dvou nebo \u010dty\u0159 blok\u016f, budeme schopni uvolnit alespo\u0148 jeden blok, pokud se na\u0161e str\u00e1nka stla\u010d\u00ed alespo\u0148 na 50 % nebo na 75 % p\u0159\u00edslu\u0161n\u011b.<\/p>\n<p>Tak\u017ee shrnut\u00ed fungov\u00e1n\u00ed mechanismu: P\u0159i z\u00e1pisu str\u00e1nky na disk se pokou\u0161\u00edme str\u00e1nku komprimovat. Pokud velikost komprimovan\u00e9 str\u00e1nky umo\u017e\u0148uje uvolnit jeden nebo v\u00edce blok\u016f souborov\u00e9ho syst\u00e9mu, str\u00e1nka se zap\u00ed\u0161e v komprimovan\u00e9 podob\u011b, na m\u00edst\u011b uvoln\u011bn\u00fdch blok\u016f se \u201evyvrt\u00e1 d\u00edra\u201c (prov\u00e1d\u00ed se syst\u00e9mov\u00fd v\u00fdpis s p\u0159\u00edznakem \u201epunch hole\u201c). <code>fallocate()<\/code> Pokud velikost komprimovan\u00e9 str\u00e1nky neumo\u017e\u0148uje uvolnit bloky, str\u00e1nka se ukl\u00e1d\u00e1 tak, jak je, v nezkomprimovan\u00e9 podob\u011b. V\u0161echny ofsety str\u00e1nek se po\u010d\u00edtaj\u00ed stejn\u011b jako bez komprese, n\u00e1soben\u00edm indexu str\u00e1nky velikost\u00ed str\u00e1nky. \u017d\u00e1dn\u00e1 relokace str\u00e1nek nen\u00ed nutn\u00e1. Ofsety str\u00e1nek, stejn\u011b jako bez komprese, spadaj\u00ed na hranice blok\u016f souborov\u00e9ho syst\u00e9mu.<\/p>\n<p><img decoding=\"async\" alt=\"Kompresn\u00ed data v Apache Ignite. Zku\u0161enosti Sberbanky\" src=\"\/wp-content\/uploads\/2020\/05\/6a6c6ad83d3b8591f76b9343ff067746.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nV aktu\u00e1ln\u00ed implementaci Ignite um\u00ed pracovat se sparse soubory pouze pod OS Linux, a proto m\u016f\u017ee b\u00fdt diskov\u00e1 komprese str\u00e1nek povolena pouze p\u0159i pou\u017e\u00edv\u00e1n\u00ed Ignite na tomto opera\u010dn\u00edm syst\u00e9mu.<\/p>\n<p>Algoritmy komprese, kter\u00e9 mohou b\u00fdt pou\u017eity pro diskovou kompresi str\u00e1nek: ZSTD, LZ4, Snappy. Krom\u011b toho existuje pracovn\u00ed re\u017eim (SKIP_GARBAGE), p\u0159i kter\u00e9m se pouze zahazuje nepou\u017e\u00edvan\u00e9 m\u00edsto na str\u00e1nce bez pou\u017eit\u00ed komprese na zb\u00fdvaj\u00edc\u00edch datech, co\u017e umo\u017e\u0148uje sn\u00ed\u017eit z\u00e1t\u011b\u017e CPU ve srovn\u00e1n\u00ed s d\u0159\u00edve zm\u00edn\u011bn\u00fdmi algoritmy.<\/p>\n<h4>Vliv na v\u00fdkonnost <\/h4>\n<p>\nBohu\u017eel jsem neprov\u00e1d\u011bl skute\u010dn\u00e9 m\u011b\u0159en\u00ed v\u00fdkonnosti na re\u00e1ln\u00fdch stroj\u00edch, proto\u017ee nepl\u00e1nujeme tento mechanismus pou\u017e\u00edt v produkci, ale m\u016f\u017eeme teoreticky uva\u017eovat, kde bychom mohli ztratit, a kde z\u00edskat.<\/p>\n<p>K tomu si mus\u00edme p\u0159ipomenout, jak prob\u00edh\u00e1 \u010dten\u00ed a z\u00e1pis str\u00e1nek p\u0159i p\u0159\u00edstupu k nim:<\/p>\n<ul>\n<li>P\u0159i vykon\u00e1v\u00e1n\u00ed operace \u010dten\u00ed se nejprve provede jej\u00ed vyhled\u00e1n\u00ed v RAM, pokud vyhled\u00e1v\u00e1n\u00ed sel\u017ee, str\u00e1nka se na\u010dte do RAM z disku stejn\u00fdm vl\u00e1knem, kter\u00e9 prov\u00e1d\u00ed \u010dten\u00ed.<\/li>\n<li>P\u0159i vykon\u00e1v\u00e1n\u00ed operace z\u00e1pisu je str\u00e1nka v RAM ozna\u010dena jako \u0161pinav\u00e1, p\u0159i\u010dem\u017e fyzick\u00e9 ulo\u017een\u00ed str\u00e1nky na disk se okam\u017eit\u011b ve vl\u00e1kn\u011b prov\u00e1d\u011bj\u00edc\u00edm z\u00e1pis neprov\u00e1d\u00ed. V\u0161echny \u0161pinav\u00e9 str\u00e1nky se ukl\u00e1daj\u00ed na disk pozd\u011bji v procesu checkpointu jednotliv\u00fdmi vl\u00e1kny.<\/li>\n<\/ul>\n<p>\nTak\u017ee vliv na operace \u010dten\u00ed:<\/p>\n<ul>\n<li>Pozitivn\u00ed (disk IO), d\u00edky sn\u00ed\u017een\u00ed po\u010dtu p\u0159e\u010dten\u00fdch blok\u016f souborov\u00e9ho syst\u00e9mu.<\/li>\n<li>Negativn\u00ed (CPU) z d\u016fvodu dal\u0161\u00ed z\u00e1t\u011b\u017ee, kterou opera\u010dn\u00ed syst\u00e9m pot\u0159ebuje pro pr\u00e1ci s sparse soubory. Tak\u00e9 zde mohou implicitn\u011b vzniknout dal\u0161\u00ed IO operace pro uchov\u00e1n\u00ed slo\u017eit\u011bj\u0161\u00ed struktury sparse souboru (s ve\u0161ker\u00fdmi detaily o fungov\u00e1n\u00ed sparse soubor\u016f, bohu\u017eel, nejsem obezn\u00e1men).<\/li>\n<li>Negativn\u00ed (CPU) kv\u016fli nutnosti dekomprese str\u00e1nek.<\/li>\n<li>\u017d\u00e1dn\u00fd vliv na operace z\u00e1pisu.<\/li>\n<li>Vliv na proces kontroln\u00edho bodu (zde je v\u0161e podobn\u00e9 operac\u00edm \u010dten\u00ed):<\/li>\n<li>Pozitivn\u00ed (disk IO) d\u00edky sn\u00ed\u017een\u00ed po\u010dtu zapsan\u00fdch blok\u016f souborov\u00e9ho syst\u00e9mu.<\/li>\n<li>Negativn\u00ed (CPU, mo\u017en\u00e1 disk IO) z d\u016fvodu pr\u00e1ce se sparse soubory.<\/li>\n<li>Negativn\u00ed (CPU) kv\u016fli pot\u0159eb\u011b komprese str\u00e1nek.<\/li>\n<\/ul>\n<p>\nKter\u00e1 strana vah p\u0159eva\u017e\u00ed? To velmi z\u00e1vis\u00ed na prost\u0159ed\u00ed, ale jsem naklon\u011bn k tomu, \u017ee komprese diskov\u00fdch str\u00e1nek povede sp\u00ed\u0161e k degradaci v\u00fdkonu na v\u011bt\u0161in\u011b syst\u00e9m\u016f. O to v\u00edc, \u017ee testy na jin\u00fdch DBMS, kter\u00e9 pou\u017e\u00edvaj\u00ed podobn\u00fd p\u0159\u00edstup se sparse soubory, ukazuj\u00ed pokles v\u00fdkonu p\u0159i zapnut\u00e9 kompresi.<\/p>\n<h4>Jak aktivovat a nastavit<\/h4>\n<p>\nJak ji\u017e bylo uvedeno v\u00fd\u0161e, minim\u00e1ln\u00ed verze Apache Ignite, kter\u00e1 podporuje kompresi diskov\u00fdch str\u00e1nek: 2.8 a je podporov\u00e1na pouze opera\u010dn\u00edm syst\u00e9mem Linux. Aktivace a nastaven\u00ed se prov\u00e1d\u00ed n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<ul>\n<li>V class-path mus\u00ed b\u00fdt modul ignite-compression. Ve v\u00fdchoz\u00edm nastaven\u00ed se nach\u00e1z\u00ed v distribuci Apache Ignite v adres\u00e1\u0159i libs\/optional a nen\u00ed zahrnut do class-path. M\u016f\u017eete jednodu\u0161e p\u0159esunout adres\u00e1\u0159 o jeden \u00farove\u0148 v\u00fd\u0161 do libs, a pak p\u0159i spu\u0161t\u011bn\u00ed skrze ignite.sh bude automaticky zahrnut.<\/li>\n<li>Perzistence mus\u00ed b\u00fdt povolena (Povoluje se skrze <code>DataRegionConfiguration.setPersistenceEnabled(true))<\/code>.<\/li>\n<li>Velikost str\u00e1nky mus\u00ed b\u00fdt v\u011bt\u0161\u00ed ne\u017e velikost bloku souborov\u00e9ho syst\u00e9mu (m\u016f\u017eete ji nastavit pomoc\u00ed <code>DataStorageConfiguration.setPageSize()<\/code> ).<\/li>\n<li>Pro ka\u017ed\u00fd cache, jeho\u017e data je t\u0159eba komprimovat, je nutn\u00e9 v konfiguraci nastavit metodu komprese a (voliteln\u011b) \u00farove\u0148 komprese (metody <code>CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()<\/code>).<\/li>\n<\/ul>\n<p><\/p>\n<h3>WAL komprese<\/h3>\n<p><\/p>\n<h4>Jak to funguje<\/h4>\n<p>\nCo je to WAL a k \u010demu je pot\u0159eba? Velmi stru\u010dn\u011b: je to \u017eurn\u00e1l, do kter\u00e9ho se zaznamen\u00e1vaj\u00ed v\u0161echny ud\u00e1losti m\u011bn\u00edc\u00ed na konci str\u00e1nkov\u00e9 \u00falo\u017ei\u0161t\u011b. Je zapot\u0159eb\u00ed p\u0159edev\u0161\u00edm pro mo\u017enost obnoven\u00ed v p\u0159\u00edpad\u011b selh\u00e1n\u00ed. Jak\u00e1koli operace mus\u00ed p\u0159ed p\u0159ed\u00e1n\u00edm kontroly u\u017eivateli nejprve zapsat ud\u00e1lost do WAL, aby v p\u0159\u00edpad\u011b p\u00e1du bylo mo\u017en\u00e9 znovu p\u0159ehr\u00e1t \u017eurn\u00e1l a obnovit v\u0161echny operace, za kter\u00e9 u\u017eivatel obdr\u017eel \u00fasp\u011b\u0161nou odpov\u011b\u010f, i kdy\u017e tyto operace je\u0161t\u011b nebyly odra\u017eeny ve str\u00e1nkov\u00e9m \u00falo\u017ei\u0161ti na disku (d\u0159\u00edve bylo uvedeno, \u017ee skute\u010dn\u00e9 z\u00e1pisy do str\u00e1nkov\u00e9ho \u00falo\u017ei\u0161t\u011b se prov\u00e1d\u011bj\u00ed v procesu nazvan\u00e9m \u201echeckpoint\u201c se zpo\u017ed\u011bn\u00edm odd\u011blen\u00fdmi vl\u00e1kny).<\/p>\n<p>Z\u00e1znamy v WAL se d\u011bl\u00ed na logick\u00e9 a fyzick\u00e9. Logick\u00e9 z\u00e1znamy p\u0159edstavuj\u00ed samotn\u00e9 kl\u00ed\u010de a hodnoty. Fyzick\u00e9 z\u00e1znamy odr\u00e1\u017eej\u00ed zm\u011bny str\u00e1nek ve str\u00e1nkov\u00e9m \u00falo\u017ei\u0161ti. Zat\u00edmco logick\u00e9 z\u00e1znamy mohou b\u00fdt u\u017eite\u010dn\u00e9 pro r\u016fzn\u00e9 p\u0159\u00edpady, fyzick\u00e9 z\u00e1znamy jsou zapot\u0159eb\u00ed pouze pro obnoven\u00ed v p\u0159\u00edpad\u011b selh\u00e1n\u00ed a pot\u0159ebujeme z\u00e1znamy pouze od posledn\u00edho \u00fasp\u011b\u0161n\u00e9ho checkpointu. Nebudeme se zde zab\u00fdvat podrobnostmi a vysv\u011btlovat, pro\u010d to tak funguje, ale kdo m\u00e1 z\u00e1jem, m\u016f\u017ee se obr\u00e1tit na ji\u017e zm\u00edn\u011bn\u00fd \u010dl\u00e1nek na Apache Ignite Wiki: <noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/IGNITE\/Ignite+Persistent+Store+-+under+the+hood\">Ignite Persistent Store \u2014 pod kapotou<\/a><\/noindex>.<\/p>\n<p>Na jednu logickou z\u00e1znamovou polo\u017eku \u010dasto p\u0159ipad\u00e1 n\u011bkolik fyzick\u00fdch z\u00e1znam\u016f. To znamen\u00e1, \u017ee nap\u0159\u00edklad jedna operace put v cache zasahuje n\u011bkolik str\u00e1nek ve str\u00e1nkov\u011b orientovan\u00e9 pam\u011bti (str\u00e1nku se samotn\u00fdmi daty, str\u00e1nky s indexy, str\u00e1nky s free-listy). V n\u011bkter\u00fdch syntetick\u00fdch testech jsem zjistil, \u017ee fyzick\u00e9 z\u00e1znamy zab\u00edraly a\u017e 90% objemu WAL souboru. Pot\u0159ebovaly p\u0159itom velmi kr\u00e1tkou dobu (p\u0159edvolen\u00fd interval mezi checkpointy je 3 minuty). Bylo by logick\u00e9 se t\u011bchto dat po ztr\u00e1t\u011b jejich aktu\u00e1lnosti zbavit. P\u0159esn\u011b to d\u011bl\u00e1 mechanismus WAL compaction, zbavuje se fyzick\u00fdch z\u00e1znam\u016f a s komprimac\u00ed zip z\u016fst\u00e1vaj\u00edc\u00edch logick\u00fdch z\u00e1znam\u016f, p\u0159i\u010dem\u017e velikost souboru se v\u00fdrazn\u011b zmen\u0161uje (n\u011bkdy a\u017e des\u00edtkykr\u00e1t).<\/p>\n<p>Fyzick\u00fd WAL se skl\u00e1d\u00e1 z n\u011bkolika segment\u016f (v\u00fdchoz\u00ed po\u010det 10), kter\u00e9 maj\u00ed pevnou velikost (v\u00fdchoz\u00ed velikost 64 MB) a jsou p\u0159episov\u00e1ny cyklicky. Jakmile je aktu\u00e1ln\u00ed segment zapln\u011bn, je mu p\u0159id\u011blen dal\u0161\u00ed n\u00e1sleduj\u00edc\u00ed segment a zapln\u011bn\u00fd segment je kop\u00edrov\u00e1n do archivu pomoc\u00ed samostatn\u00e9ho vl\u00e1kna. WAL komprese ji\u017e funguje s archivn\u00edmi segmenty. Tak\u00e9 pomoc\u00ed samostatn\u00e9ho vl\u00e1kna sleduje prov\u00e1d\u011bn\u00ed kontroln\u00edho bodu a zahajuje kompresi u archivn\u00edch segment\u016f, jejich\u017e fyzick\u00e9 z\u00e1znamy ji\u017e nejsou pot\u0159eba.<\/p>\n<p><img decoding=\"async\" alt=\"Kompresn\u00ed data v Apache Ignite. Zku\u0161enosti Sberbanky\" src=\"\/wp-content\/uploads\/2020\/05\/ca8690ba7a350df9530f2ccf01c90975.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h4>Vliv na v\u00fdkonnost<\/h4>\n<p>\nProto\u017ee WAL komprese pracuje ve sv\u00e9m vlastn\u00edm vl\u00e1kn\u011b, nem\u011blo by to m\u00edt p\u0159\u00edm\u00fd vliv na vykon\u00e1van\u00e9 operace. P\u0159esto v\u0161ak p\u0159edstavuje dodate\u010dn\u00e9 zat\u00ed\u017een\u00ed pro CPU (komprese) a disk (\u010dten\u00ed ka\u017ed\u00e9ho WAL segmentu z archivu a z\u00e1pis komprimovan\u00fdch segment\u016f), tak\u017ee pokud syst\u00e9m pracuje na hran\u011b sv\u00fdch mo\u017enost\u00ed, m\u016f\u017ee tak\u00e9 v\u00e9st k degradaci v\u00fdkonu.<\/p>\n<h4>Jak aktivovat a nastavit<\/h4>\n<p>\nWAL kompresi lze aktivovat pomoc\u00ed vlastnosti <code>WalCompactionEnabled<\/code> v <code>DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)<\/code>). Tak\u00e9 pomoc\u00ed metody DataStorageConfiguration.setWalCompactionLevel() lze nastavit \u00farove\u0148 komprese, pokud v\u00e1m nevyhovuje v\u00fdchoz\u00ed hodnota (BEST_SPEED).<\/p>\n<h3>Kompresn\u00ed snapshot WAL str\u00e1nkov\u00e1n\u00ed<\/h3>\n<p><\/p>\n<h4>Jak to funguje<\/h4>\n<p>\nD\u0159\u00edve jsme ji\u017e zjistili, \u017ee z\u00e1znamy WAL se d\u011bl\u00ed na logick\u00e9 a fyzick\u00e9. Na ka\u017edou zm\u011bnu ka\u017ed\u00e9 str\u00e1nky v pam\u011bti str\u00e1nky se vytv\u00e1\u0159\u00ed fyzick\u00fd z\u00e1znam WAL. Fyzi\u010dt\u00ed z\u00e1znamy se zase d\u011bl\u00ed na 2 podtypy: z\u00e1znam sn\u00edmku str\u00e1nky a z\u00e1znam rozd\u00edlu. Kdy\u017e n\u011bco zm\u011bn\u00edme na str\u00e1nce a p\u0159evedeme ji ze stavu ne\u010distoty do stavu \u010distoty, v WAL se uchov\u00e1v\u00e1 kompletn\u00ed kopie t\u00e9to str\u00e1nky (z\u00e1znam sn\u00edmku str\u00e1nky \u2014 snapshot str\u00e1nky). I kdy\u017e jsme zm\u011bnili pouze jeden byte, v WAL se zachov\u00e1 z\u00e1znam o n\u011bco v\u011bt\u0161\u00ed ne\u017e velikost str\u00e1nky. Pokud v\u0161ak n\u011bco zm\u011bn\u00edme na ji\u017e \u0161pinav\u00e9 str\u00e1nce, v WAL se vytvo\u0159\u00ed z\u00e1znam rozd\u00edlu, kter\u00fd odr\u00e1\u017e\u00ed pouze zm\u011bny ve srovn\u00e1n\u00ed s p\u0159edchoz\u00edm stavem str\u00e1nky, nikoli celou str\u00e1nku jako celek. Vzhledem k tomu, \u017ee resetov\u00e1n\u00ed stavu str\u00e1nek z \u0161pinav\u00e9ho na \u010dist\u00fd prob\u00edh\u00e1 b\u011bhem procesu kontroln\u00edho bodu, t\u00e9m\u011b\u0159 v\u0161echny fyzick\u00e9 z\u00e1znamy budou po za\u010d\u00e1tku kontroln\u00edho bodu sest\u00e1vat pouze ze sn\u00edmk\u016f str\u00e1nek (proto\u017ee v\u0161echny str\u00e1nky po za\u010d\u00e1tku kontroln\u00edho bodu jsou \u010dist\u00e9). Pak, jak se bl\u00ed\u017e\u00edme k dal\u0161\u00edmu kontroln\u00edmu bodu, pod\u00edl z\u00e1znam\u016f rozd\u00edlu za\u010d\u00edn\u00e1 r\u016fst a znovu se resetuje na za\u010d\u00e1tku dal\u0161\u00edho kontroln\u00edho bodu. M\u011b\u0159en\u00ed na n\u011bkter\u00fdch syntetick\u00fdch testech uk\u00e1zala, \u017ee pod\u00edl sn\u00edmk\u016f str\u00e1nek v celkov\u00e9m objemu fyzick\u00fdch z\u00e1znam\u016f dosahuje 90%.<\/p>\n<p>My\u0161lenka komprese sn\u00edmku str\u00e1nky WAL spo\u010d\u00edv\u00e1 v tom, \u017ee komprimuje sn\u00edmky str\u00e1nek pomoc\u00ed ji\u017e existuj\u00edc\u00edho n\u00e1stroje pro kompresi str\u00e1nek (viz. komprese diskov\u00fdch str\u00e1nek). Z\u00e1znamy v WAL p\u0159itom jsou uchov\u00e1v\u00e1ny sekven\u010dn\u011b v re\u017eimu pouze pro p\u0159id\u00e1n\u00ed a nen\u00ed pot\u0159eba provazov\u00e1n\u00ed z\u00e1znam\u016f na hranic\u00edch blok\u016f souborov\u00e9ho syst\u00e9mu, proto zde, na rozd\u00edl od mechanismu komprese diskov\u00fdch str\u00e1nek, nepot\u0159ebujeme sparse soubory, a tedy tento mechanismus bude fungovat nejen na opera\u010dn\u00edm syst\u00e9mu Linux. Nav\u00edc u\u017e nen\u00ed d\u016fle\u017eit\u00e9, jak moc jsme byli schopni str\u00e1nku komprimovat. I kdy\u017e jsme uvolnili 1 byte, to je ji\u017e pozitivn\u00ed v\u00fdsledek a m\u016f\u017eeme uchov\u00e1vat v WAL komprimovan\u00e1 data, na rozd\u00edl od komprese diskov\u00fdch str\u00e1nek, kde uchov\u00e1v\u00e1me komprimovanou str\u00e1nku pouze pokud jsme uvolnili v\u00edce ne\u017e 1 blok souborov\u00e9ho syst\u00e9mu.<\/p>\n<p>Str\u00e1nky jsou dob\u0159e komprimovateln\u00e9 data, jejich pod\u00edl na celkov\u00e9m objemu WAL je velmi vysok\u00fd, a tud\u00ed\u017e m\u016f\u017eeme v\u00fdrazn\u011b zkr\u00e1tit jejich velikost, ani\u017e bychom zm\u011bnili form\u00e1t WAL souboru. Komprese logick\u00fdch z\u00e1znam\u016f by si vy\u017e\u00e1dala zm\u011bnu form\u00e1tu a ztr\u00e1tu kompatibility nap\u0159\u00edklad pro extern\u00ed odb\u011bratele, kter\u00fdm by mohly b\u00fdt zaj\u00edmav\u00e9 logick\u00e9 z\u00e1znamy, p\u0159i\u010dem\u017e by to nep\u0159ineslo v\u00fdznamn\u00e9 sn\u00ed\u017een\u00ed objemu souboru.<\/p>\n<p>Pro kompresi sn\u00edmk\u016f WAL str\u00e1nek mohou b\u00fdt pou\u017eity kompresn\u00ed algoritmy ZSTD, LZ4, Snappy a tak\u00e9 re\u017eim SKIP_GARBAGE, stejn\u011b jako u komprese str\u00e1nkov\u00fdch disk\u016f.<\/p>\n<h4>Vliv na v\u00fdkonnost<\/h4>\n<p>\nJak nen\u00ed t\u011b\u017ek\u00e9 si v\u0161imnout, p\u0159\u00edm\u00e9 zapnut\u00ed komprese sn\u00edmk\u016f WAL str\u00e1nek ovliv\u0148uje pouze vl\u00e1kna, kter\u00e1 zapisuj\u00ed data do str\u00e1nkov\u00e9ho pam\u011bti, to znamen\u00e1, \u017ee ovliv\u0148uje t\u011bch, kte\u0159\u00ed m\u011bn\u00ed data v cache. \u010cten\u00ed fyzick\u00fdch z\u00e1znam\u016f z WAL prob\u00edh\u00e1 pouze jednor\u00e1zov\u011b, v okam\u017eiku spu\u0161t\u011bn\u00ed uzlu po p\u00e1du (a pouze v p\u0159\u00edpad\u011b p\u00e1du b\u011bhem checkpointingu).<\/p>\n<p>Na vl\u00e1kna m\u011bn\u00edc\u00ed data to m\u00e1 n\u00e1sleduj\u00edc\u00ed dopad: z\u00edsk\u00e1v\u00e1me negativn\u00ed efekt (CPU) kv\u016fli nutnosti ka\u017ed\u00e9 str\u00e1nce komprimovat p\u0159ed z\u00e1pisem na disk a pozitivn\u00ed efekt (disk IO) d\u00edky sn\u00ed\u017een\u00ed mno\u017estv\u00ed zapisovan\u00fdch dat. Odpov\u00eddaj\u00edc\u00edm zp\u016fsobem, je to jednoduch\u00e9, pokud v\u00fdkon syst\u00e9mu nar\u00e1\u017e\u00ed na CPU, dojde k m\u00edrn\u00e9mu poklesu, pokud na diskov\u00fd I\/O \u2014 dojde k n\u00e1r\u016fstu.<\/p>\n<p>Nep\u0159\u00edmo sn\u00ed\u017een\u00ed velikosti WAL tak\u00e9 pozitivn\u011b ovliv\u0148uje vl\u00e1kna, kter\u00e1 archivuj\u00ed segmenty WAL a na vl\u00e1kna WAL komprese.<\/p>\n<p>Skute\u010dn\u00e9 v\u00fdkonnostn\u00ed testy v na\u0161em prost\u0159ed\u00ed na syntetick\u00fdch datech uk\u00e1zaly m\u00edrn\u00fd n\u00e1r\u016fst (pr\u016fchodnost vzrostla o 10-15 %, latence se sn\u00ed\u017eila o 10-15 %).<\/p>\n<h4>Jak aktivovat a nastavit<\/h4>\n<p>\nMinim\u00e1ln\u00ed verze Apache Ignite: 2.8. Aktivace a nastaven\u00ed se prov\u00e1d\u00ed n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<ul>\n<li>V class-path mus\u00ed b\u00fdt modul ignite-compression. Ve v\u00fdchoz\u00edm nastaven\u00ed se nach\u00e1z\u00ed v distribuci Apache Ignite v adres\u00e1\u0159i libs\/optional a nen\u00ed zahrnut do class-path. M\u016f\u017eete jednodu\u0161e p\u0159esunout adres\u00e1\u0159 o jeden \u00farove\u0148 v\u00fd\u0161 do libs, a pak p\u0159i spu\u0161t\u011bn\u00ed skrze ignite.sh bude automaticky zahrnut.<\/li>\n<li>Perzistence mus\u00ed b\u00fdt povolena (Povoluje se skrze <code>DataRegionConfiguration.setPersistenceEnabled(true)<\/code>).<\/li>\n<li>Mus\u00ed b\u00fdt nastaven re\u017eim komprese pomoc\u00ed metody <code>DataStorageConfiguration.setWalPageCompression()<\/code>, ve v\u00fdchoz\u00edm nastaven\u00ed je komprese vypnuta (re\u017eim DISABLED).<\/li>\n<li>Voliteln\u011b lze nastavit \u00farove\u0148 komprese pomoc\u00ed metody <code>DataStorageConfiguration.setWalPageCompression()<\/code>, povolen\u00e9 hodnoty pro ka\u017ed\u00fd z re\u017eim\u016f naleznete v javadoc k metod\u011b.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Z\u00e1v\u011br<\/h3>\n<p>\nZv\u00e1\u017een\u00e9 mechanismy komprese dat v Apache Ignite mohou b\u00fdt pou\u017e\u00edv\u00e1ny nez\u00e1visle na sob\u011b, ale tak\u00e9 jsou povoleny jak\u00e9koli jejich kombinace. Pochopen\u00ed princip\u016f jejich fungov\u00e1n\u00ed umo\u017en\u00ed zjistit, jak dob\u0159e vyhovuj\u00ed va\u0161im \u00fakol\u016fm ve va\u0161em prost\u0159ed\u00ed a co budete muset ob\u011btovat p\u0159i jejich pou\u017eit\u00ed. Komprese diskov\u00fdch str\u00e1nek je ur\u010dena k tomu, aby zkomprimovala hlavn\u00ed \u00falo\u017ei\u0161t\u011b a m\u016f\u017ee poskytnout pr\u016fm\u011brn\u00fd stupe\u0148 komprese. Komprese snapshotu str\u00e1nek WAL ji\u017e poskytne st\u0159edn\u00ed stupe\u0148 komprese soubor\u016f WAL, p\u0159i\u010dem\u017e pravd\u011bpodobn\u011b dokonce zlep\u0161\u00ed v\u00fdkon. Komprese WAL nem\u00e1 pozitivn\u00ed vliv na v\u00fdkon, ale maxim\u00e1ln\u011b zkr\u00e1t\u00ed velikost soubor\u016f WAL odstran\u011bn\u00edm fyzick\u00fdch z\u00e1znam\u016f.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sberbank\/blog\/502136\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0430\u0445. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0436\u0430\u0442\u0438\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443, \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81937,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81936","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=\"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\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\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-05-17T23:42:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-17T23:42:37+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\udd47Komprese dat v Apache Ignite. Zku\u0161enost Sberu | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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\u0421\u0436\u0430\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Apache Ignite. \u041e\u043f\u044b\u0442 \u0421\u0431\u0435\u0440\u0430 | ProHoster","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","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-05-17T23:42:37+00:00","article:modified_time":"2020-05-17T23:42:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81936","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 15:47:30","updated":"2022-10-02 17:21:32","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\/81936","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=81936"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/81936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/81937"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=81936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=81936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=81936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}