{"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\/sk\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","title":{"rendered":"Data compression in Apache Ignite. Experience of Sber","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Data compression in Apache Ignite. Experience of Sber\" src=\"\/wp-content\/uploads\/2020\/05\/0e26c686b1f29e88e6be4b8df81ab668.jpg\" style=\"display:block;margin: 0 auto;\" \/>Pri pr\u00e1ci s ve\u013ek\u00fdmi objemami d\u00e1t m\u00f4\u017ee nasta\u0165 probl\u00e9m nedostatku miesta na diskoch. Jedn\u00fdm z rie\u0161en\u00ed tohto probl\u00e9mu je kompresia, ktor\u00e1 umo\u017e\u0148uje na rovnakom zariaden\u00ed zv\u00fd\u0161i\u0165 objemy \u00falo\u017eiska. V tomto \u010dl\u00e1nku sa pozrieme na to, ako funguje kompresia d\u00e1t v Apache Ignite. V \u010dl\u00e1nku bud\u00fa op\u00edsan\u00e9 len sp\u00f4soby kompresie implementovan\u00e9 v r\u00e1mci produktu. In\u00e9 sp\u00f4soby kompresie d\u00e1t (cez sie\u0165, v pam\u00e4ti), \u010di u\u017e realizovan\u00e9 alebo nie, zostan\u00fa mimo na\u0161ich \u00favah.<\/p>\n<p>Tak\u017ee pri zapnutom re\u017eime persistence, v d\u00f4sledku zmien d\u00e1t v ke\u0161och, Ignite za\u010dne zapisova\u0165 na disk:<\/p>\n<ol>\n<li>Obsah ke\u0161ov<\/li>\n<li>Z\u00e1znamov\u00fd denn\u00edk predbe\u017en\u00e9ho z\u00e1pisu (Write Ahead Log, \u010falej len WAL)<\/li>\n<\/ol>\n<p>\nPre kompresiu WAL u\u017e existuje mechanizmus, ktor\u00fd sa naz\u00fdva WAL compaction. V ned\u00e1vno vydanom Apache Ignite 2.8 pribudli \u010fal\u0161ie dva mechanizmy umo\u017e\u0148uj\u00face kompresiu d\u00e1t na disku, a to disk page compression pre kompresiu obsahu ke\u0161ov a WAL page snapshot compression pre kompresiu niektor\u00fdch z\u00e1znamov WAL. Viac o v\u0161etk\u00fdch t\u00fdchto troch mechanizmoch n\u00e1jdete ni\u017e\u0161ie.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Disk page compression<\/h3>\n<p><\/p>\n<h4>Ako to funguje<\/h4>\n<p>\nNa za\u010diatok si ve\u013emi stru\u010dne povieme, ako Ignite uchov\u00e1va d\u00e1ta. Na uchov\u00e1vanie sa pou\u017e\u00edva str\u00e1nkov\u00e1 pam\u00e4\u0165. Ve\u013ekos\u0165 str\u00e1nky je stanoven\u00e1 pri spusten\u00ed uzla a nem\u00f4\u017ee by\u0165 zmenen\u00e1 v neskor\u0161\u00edch f\u00e1zach, takisto mus\u00ed by\u0165 ve\u013ekos\u0165 str\u00e1nky mocninou dvoch a n\u00e1sobkom ve\u013ekosti bloku s\u00faborov\u00e9ho syst\u00e9mu. Str\u00e1nky sa na\u010d\u00edtavaj\u00fa do RAM z disku pod\u013ea potreby, pri\u010dom ve\u013ekos\u0165 d\u00e1t na disku m\u00f4\u017ee presahova\u0165 objem vyhradenej RAM. V pr\u00edpade nedostatku miesta v RAM na na\u010d\u00edtanie str\u00e1nky z disku bud\u00fa star\u0161ie, u\u017e nepou\u017e\u00edvan\u00e9 str\u00e1nky vytla\u010den\u00e9 z RAM.<\/p>\n<p>Na disku sa d\u00e1ta uchov\u00e1vaj\u00fa nasleduj\u00facim sp\u00f4sobom: pre ka\u017ed\u00fa part\u00edciu ka\u017edej ke\u0161ovej skupiny sa vytv\u00e1ra samostatn\u00fd s\u00fabor, v tomto s\u00fabore, v porad\u00ed vzostupne pod\u013ea indexu, nasleduj\u00fa str\u00e1nky. Celkov\u00fd identifik\u00e1tor str\u00e1nky obsahuje identifik\u00e1tor ke\u0161ovej skupiny, \u010d\u00edslo part\u00edcie a index str\u00e1nky v s\u00fabore. T\u00fdmto sp\u00f4sobom m\u00f4\u017eeme pod\u013ea celkov\u00e9ho identifik\u00e1tora str\u00e1nky jednozna\u010dne ur\u010di\u0165 s\u00fabor a offset v s\u00fabore pre ka\u017ed\u00fa str\u00e1nku. Podrobnej\u0161ie inform\u00e1cie o fungovan\u00ed str\u00e1nkovej pam\u00e4te m\u00f4\u017eete n\u00e1js\u0165 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>Mechaniz diskovej kompresie str\u00e1nok, ako nazna\u010duje n\u00e1zov, pracuje na \u00farovni str\u00e1nok. Pri zapnut\u00ed tohto mechanizmu sa pr\u00e1ca s \u00fadajmi v RAM vykon\u00e1va bez ak\u00fdchko\u013evek kompresi\u00ed, av\u0161ak v momente ukladania str\u00e1nok z RAM na disk sa vykon\u00e1va ich kompresia.<\/p>\n<p>Ale zmen\u0161i\u0165 ka\u017ed\u00fa str\u00e1nku zvl\u00e1\u0161\u0165 nie je e\u0161te rie\u0161en\u00edm probl\u00e9mu, je potrebn\u00e9 nejak\u00fdm sp\u00f4sobom zmen\u0161i\u0165 ve\u013ekos\u0165 kone\u010dn\u00fdch s\u00faborov s \u00fadajmi. Ak prestane by\u0165 ve\u013ekos\u0165 str\u00e1nky pevn\u00fdm \u010d\u00edslom, u\u017e nem\u00f4\u017eeme zapisova\u0165 str\u00e1nky do s\u00faboru jednu po druhej, preto\u017ee to m\u00f4\u017ee sp\u00f4sobi\u0165 cel\u00fa radu probl\u00e9mov:<\/p>\n<ul>\n<li>Nebudeme m\u00f4c\u0165 pomocou indexu str\u00e1nky vypo\u010d\u00edta\u0165 offset, na ktorom sa nach\u00e1dza v s\u00fabore.<\/li>\n<li>Nie je jasn\u00e9, \u010do robi\u0165 so str\u00e1nkami, ktor\u00e9 sa nach\u00e1dzaj\u00fa nie na konci s\u00faboru a menia svoju ve\u013ekos\u0165. Ak sa ve\u013ekos\u0165 str\u00e1nky zmen\u0161\u00ed, miesto, ktor\u00e9 uvo\u013enila, zmizne. Ak sa ve\u013ekos\u0165 str\u00e1nky zv\u00fd\u0161i, pre \u0148u bude potrebn\u00e9 h\u013eada\u0165 u\u017e nov\u00e9 miesto v s\u00fabore.<\/li>\n<li>Ak sa str\u00e1nka posunie na po\u010det bajtov, ktor\u00fd nie je n\u00e1sobkom ve\u013ekosti bloku s\u00faborov\u00e9ho syst\u00e9mu, na jej \u010d\u00edtanie alebo z\u00e1pis bude potrebn\u00e9 zasiahnu\u0165 o jeden blok s\u00faborov\u00e9ho syst\u00e9mu viac, \u010do m\u00f4\u017ee sp\u00f4sobi\u0165 zhor\u0161enie v\u00fdkonu.<\/li>\n<\/ul>\n<p>\nAby sa tieto probl\u00e9my nemuseli rie\u0161i\u0165 na svojej \u00farovni, diskov\u00e1 kompresia str\u00e1nok v Apache Ignite vyu\u017e\u00edva mechanizmus s\u00faborov\u00e9ho syst\u00e9mu nazvan\u00fd sparse s\u00fabory. Sparse (riedky) s\u00fabor je tak\u00fd s\u00fabor, v ktorom niektor\u00e9 regi\u00f3ny vyplnen\u00e9 nulami m\u00f4\u017eu by\u0165 ozna\u010den\u00e9 ako \u201ed\u00edry\u201c. V tomto pr\u00edpade nebude pre tieto d\u00edry vyhraden\u00fdch \u017eiadne bloky s\u00faborov\u00e9ho syst\u00e9mu, \u010do vedie k \u00faspore miesta na disku.<\/p>\n<p>Je logick\u00e9, \u017ee na uvo\u013enenie bloku s\u00faborov\u00e9ho syst\u00e9mu mus\u00ed by\u0165 ve\u013ekos\u0165 d\u00edry v\u00e4\u010d\u0161ia alebo rovn\u00e1 bloku s\u00faborov\u00e9ho syst\u00e9mu, \u010do uklada\u0165 dodato\u010dn\u00e9 obmedzenie na ve\u013ekos\u0165 str\u00e1nky v Apache Ignite: aby kompresia mala nejak\u00fd efekt, mus\u00ed by\u0165 ve\u013ekos\u0165 str\u00e1nky pr\u00edsne v\u00e4\u010d\u0161ia ako ve\u013ekos\u0165 bloku s\u00faborov\u00e9ho syst\u00e9mu. Ak bude ve\u013ekos\u0165 str\u00e1nky rovn\u00e1 ve\u013ekosti bloku, nikdy nebudeme m\u00f4c\u0165 uvo\u013eni\u0165 ani jeden blok, preto\u017ee na uvo\u013enenie jedin\u00e9ho bloku mus\u00ed zmen\u0161en\u00e1 str\u00e1nka zaberat 0 bajtov. Ak bude ve\u013ekos\u0165 str\u00e1nky rovn\u00e1 ve\u013ekosti 2 alebo 4 blokov, u\u017e m\u00f4\u017eeme uvo\u013eni\u0165 aspo\u0148 jeden blok, ak sa na\u0161a str\u00e1nka zmen\u0161\u00ed minim\u00e1lne na 50% alebo na 75% pr\u00edslu\u0161ne.<\/p>\n<p>Tak\u017ee kone\u010dn\u00e9 popisovanie fungovania mechanizmu: Pri zapisovan\u00ed str\u00e1nky na disk sa pok\u00fasi str\u00e1nku komprimova\u0165. Ak ve\u013ekos\u0165 komprimovanej str\u00e1nky umo\u017e\u0148uje uvo\u013eni\u0165 jeden alebo viac blokov s\u00faborov\u00e9ho syst\u00e9mu, str\u00e1nka sa zapisuje v komprimovanej forme, na mieste uvo\u013enen\u00fdch blokov sa vytvor\u00ed \u201ediera\u201c (vykon\u00e1 sa syst\u00e9mov\u00fd volanie s praporkom \u201epunch hole\"). <code>fallocate()<\/code> Ak ve\u013ekos\u0165 komprimovanej str\u00e1nky neumo\u017e\u0148uje uvo\u013eni\u0165 bloky, str\u00e1nka sa ulo\u017e\u00ed tak, ako je, v nekomprimovanej forme. V\u0161etky ofsety str\u00e1nok sa po\u010d\u00edtaj\u00fa rovnako ako bez kompresie, n\u00e1soben\u00edm indexu str\u00e1nky rozmerom str\u00e1nky. \u017diadna relok\u00e1cia str\u00e1nok nie je potrebn\u00e1. Ofsety str\u00e1nok, ako aj bez kompresie, sa dost\u00e1vaj\u00fa na hranice blokov s\u00faborov\u00e9ho syst\u00e9mu.<\/p>\n<p><img decoding=\"async\" alt=\"Data compression in Apache Ignite. Experience of Sber\" src=\"\/wp-content\/uploads\/2020\/05\/6a6c6ad83d3b8591f76b9343ff067746.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nV s\u00fa\u010dasnej implement\u00e1cii dok\u00e1\u017ee Ignite pracova\u0165 so sparse s\u00fabormi len pod opera\u010dn\u00fdm syst\u00e9mom Linux; preto m\u00f4\u017ee by\u0165 diskov\u00e1 kompresia str\u00e1n zapnut\u00e1 len pri pou\u017e\u00edvan\u00ed Ignite na tomto opera\u010dnom syst\u00e9me.<\/p>\n<p>Algoritmy kompresie, ktor\u00e9 m\u00f4\u017eu by\u0165 pou\u017eit\u00e9 pre diskov\u00fa kompresiu str\u00e1n: ZSTD, LZ4, Snappy. Navy\u0161e existuje re\u017eim prev\u00e1dzky (SKIP_GARBAGE), pri ktorom sa len vyhod\u00ed nepou\u017e\u00edvan\u00e9 miesto na str\u00e1nke bez pou\u017eitia kompresie na zost\u00e1vaj\u00facich \u00fadajoch, \u010do umo\u017e\u0148uje zn\u00ed\u017ei\u0165 za\u0165a\u017eenie CPU v porovnan\u00ed s predt\u00fdm uveden\u00fdmi algoritmami.<\/p>\n<h4>Vplyv na v\u00fdkon <\/h4>\n<p>\n\u017dia\u013e, skuto\u010dn\u00e9 meranie v\u00fdkonu na re\u00e1lnych testovac\u00edch staniciach som nevykonal, preto\u017ee nepl\u00e1nujeme pou\u017e\u00edva\u0165 tento mechanizmus v produkcii, ale m\u00f4\u017eeme teoretizova\u0165, kde strat\u00edme a kde zisk\u00e1me.<\/p>\n<p>Aby sme to mohli zv\u00e1\u017ei\u0165, mus\u00edme si pripomen\u00fa\u0165, ako sa vykon\u00e1va \u010d\u00edtanie a p\u00edsanie str\u00e1n pri ich pr\u00edstupe:<\/p>\n<ul>\n<li>Pri vykon\u00e1van\u00ed oper\u00e1cie \u010d\u00edtania sa najprv vyh\u013ead\u00e1 v RAM, ak h\u013eadanie zlyh\u00e1, str\u00e1nka sa na\u010d\u00edta do RAM z disku rovnak\u00fdm vl\u00e1knom, ktor\u00e9 vykon\u00e1va \u010d\u00edtanie.<\/li>\n<li>Pri vykon\u00e1van\u00ed oper\u00e1cie p\u00edsania sa str\u00e1nka v RAM ozna\u010d\u00ed ako \u0161pinav\u00e1, pri\u010dom fyzick\u00e9 ulo\u017eenie str\u00e1nky na disk sa ihne\u010f v toku, ktor\u00fd vykon\u00e1va zapisovanie, nevykon\u00e1va. V\u0161etky \u0161pinav\u00e9 str\u00e1nky sa ulo\u017eia na disk nesk\u00f4r po\u010das procesu checkpointu prostredn\u00edctvom samostatn\u00fdch vl\u00e1kien.<\/li>\n<\/ul>\n<p>\nTak\u017ee vplyv na oper\u00e1cie \u010d\u00edtania:<\/p>\n<ul>\n<li>Pozit\u00edvny (disk IO), v\u010faka zn\u00ed\u017eeniu po\u010dtu \u010d\u00edtan\u00fdch blokov s\u00faborov\u00e9ho syst\u00e9mu.<\/li>\n<li>Negat\u00edvny (CPU), kv\u00f4li dodato\u010dnej z\u00e1\u0165a\u017ei potrebnej pre opera\u010dn\u00fd syst\u00e9m, aby mohol pracova\u0165 so sparse s\u00fabormi. Rovnako je mo\u017en\u00e9, \u017ee sa tu implicitne objavia dodato\u010dn\u00e9 IO oper\u00e1cie na ulo\u017eenie zlo\u017eitej\u0161ej \u0161trukt\u00fary sparse s\u00faboru (so v\u0161etk\u00fdmi detailmi funkcie sparse s\u00faborov, \u017eia\u013e, nie som obozn\u00e1men\u00fd).<\/li>\n<li>Negat\u00edvny (CPU), kv\u00f4li potrebe dekompresie str\u00e1n.<\/li>\n<li>Vplyv na z\u00e1pisov\u00e9 oper\u00e1cie nie je.<\/li>\n<li>Vplyv na proces checkpointu (tu je to v\u0161etko podobn\u00e9 ako pri \u010d\u00edtac\u00edch oper\u00e1ci\u00e1ch):<\/li>\n<li>Pozit\u00edvny (disk IO), kv\u00f4li zn\u00ed\u017een\u00e9mu po\u010dtu zap\u00edsan\u00fdch blokov s\u00faborov\u00e9ho syst\u00e9mu.<\/li>\n<li>Negat\u00edvny (CPU, mo\u017eno disk IO), kv\u00f4li pr\u00e1ci so sparse s\u00fabormi.<\/li>\n<li>Negat\u00edvny (CPU), kv\u00f4li potrebe kompresie str\u00e1n.<\/li>\n<\/ul>\n<p>\nKtor\u00e1 strana sa prepo\u010d\u00edta? V\u0161etko ve\u013emi z\u00e1vis\u00ed od prostredia, ale naklonen\u00fd som k tomu, \u017ee kompresia diskov\u00fdch str\u00e1n pravdepodobne povedie k degrad\u00e1cii v\u00fdkonu na v\u00e4\u010d\u0161ine syst\u00e9mov. O to viac, \u017ee testy na in\u00fdch DBMS, ktor\u00e9 pou\u017e\u00edvaj\u00fa podobn\u00fd pr\u00edstup so sparse s\u00fabormi, ukazuj\u00fa pokles v\u00fdkonu pri zapnutej kompresii.<\/p>\n<h4>Ako zapn\u00fa\u0165 a nastavi\u0165<\/h4>\n<p>\nAko u\u017e bolo uveden\u00e9 vy\u0161\u0161ie, minim\u00e1lna verzia Apache Ignite, ktor\u00e1 podporuje kompresiu diskov\u00fdch str\u00e1n: 2.8 a je podporovan\u00e1 iba opera\u010dn\u00fdm syst\u00e9mom Linux. Zapnutie a nastavenie sa vykon\u00e1va nasledovne:<\/p>\n<ul>\n<li>V class-path by mal by\u0165 modul ignite-compression. Predvolene sa nach\u00e1dza v distrib\u00facii Apache Ignite v adres\u00e1ri libs\/optional a nie je zahrnut\u00fd v class-path. Jednoducho m\u00f4\u017eete presun\u00fa\u0165 adres\u00e1r o jeden level vy\u0161\u0161ie do libs a pri spusten\u00ed cez ignite.sh bude automaticky zahrnut\u00fd.<\/li>\n<li>Trvalos\u0165 mus\u00ed by\u0165 zapnut\u00e1 (zap\u00edna sa cez <code>DataRegionConfiguration.setPersistenceEnabled(true))<\/code>.<\/li>\n<li>Ve\u013ekos\u0165 str\u00e1nky mus\u00ed by\u0165 v\u00e4\u010d\u0161ia ako ve\u013ekos\u0165 bloku s\u00faborov\u00e9ho syst\u00e9mu (mo\u017eno nastavi\u0165 pomocou <code>DataStorageConfiguration.setPageSize()<\/code> ).<\/li>\n<li>Pre ka\u017ed\u00fd cache, ktor\u00e9ho d\u00e1ta je potrebn\u00e9 komprimova\u0165, je nutn\u00e9 v konfigur\u00e1cii nastavi\u0165 met\u00f3du kompresie a (volite\u013ene) \u00farove\u0148 kompresie (met\u00f3dy <code>CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()<\/code>).<\/li>\n<\/ul>\n<p><\/p>\n<h3>WAL kompresia<\/h3>\n<p><\/p>\n<h4>Ako to funguje<\/h4>\n<p>\n\u010co je WAL a na \u010do je potrebn\u00fd? Ve\u013emi stru\u010dne: je to \u017eurn\u00e1l, do ktor\u00e9ho sa zapisuj\u00fa v\u0161etky udalosti, ktor\u00e9 nakoniec menia str\u00e1nkov\u00e9 \u00falo\u017eisko. Potrebn\u00fd je predov\u0161etk\u00fdm na mo\u017enos\u0165 obnovy v pr\u00edpade p\u00e1du. Ka\u017ed\u00e1 oper\u00e1cia, sk\u00f4r ne\u017e odovzd\u00e1 kontrolu u\u017e\u00edvate\u013eovi, by mala najprv zap\u00edsa\u0165 udalosti do WAL, aby v pr\u00edpade p\u00e1du mohla tieto udalosti prehr\u00e1va\u0165 z \u017eurn\u00e1lu a obnovi\u0165 v\u0161etky oper\u00e1cie, pri ktor\u00fdch u\u017e\u00edvate\u013e dostal \u00faspe\u0161n\u00fa odpove\u010f, aj ke\u010f tieto oper\u00e1cie sa e\u0161te nestihli odrazi\u0165 v str\u00e1nkovom \u00falo\u017eisku na disku (vy\u0161\u0161ie u\u017e bolo pop\u00edsan\u00e9, \u017ee skuto\u010dn\u00fd z\u00e1pis do str\u00e1nkov\u00e9ho \u00falo\u017eiska sa vykon\u00e1va v procese, ktor\u00fd sa naz\u00fdva \u201echeckpoint\u201c s ur\u010dit\u00fdm oneskoren\u00edm jednotliv\u00fdmi vl\u00e1knami).<\/p>\n<p>Z\u00e1znamy v WAL sa delia na logick\u00e9 a fyzick\u00e9. Logick\u00e9 \u2014 to s\u00fa samotn\u00e9 k\u013e\u00fa\u010de a hodnoty. Fyzick\u00e9 \u2014 odr\u00e1\u017eaj\u00fa zmeny str\u00e1nok v str\u00e1nkovom \u00falo\u017eisku. Ak m\u00f4\u017eu by\u0165 logick\u00e9 z\u00e1znamy u\u017eito\u010dn\u00e9 aj pre in\u00e9 pr\u00edpady, fyzick\u00e9 z\u00e1znamy s\u00fa potrebn\u00e9 iba na obnovenie v pr\u00edpade p\u00e1du a potrebuj\u00fa z\u00e1znamy iba od posledn\u00e9ho \u00faspe\u0161n\u00e9ho checkpointu. Tu sa nebudeme zaobera\u0165 podrobnos\u0165ami a vysvet\u013eova\u0165, pre\u010do to funguje pr\u00e1ve takto, ale kto m\u00e1 z\u00e1ujem, m\u00f4\u017ee sa obr\u00e1ti\u0165 na u\u017e spom\u00ednan\u00fd \u010dl\u00e1nok 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 jeden logick\u00fd z\u00e1znam \u010dasto pripad\u00e1 nieko\u013eko fyzick\u00fdch z\u00e1znamov. To znamen\u00e1, \u017ee napr\u00edklad jedna oper\u00e1cia put v cache sa dot\u00fdka nieko\u013ek\u00fdch str\u00e1nok v str\u00e1nkovej pam\u00e4ti (str\u00e1nka s \u00fadaji, str\u00e1nky s indexmi, str\u00e1nky s free-listami). Na niektor\u00fdch syntetick\u00fdch testoch som zistil, \u017ee fyzick\u00e9 z\u00e1znamy zaberali a\u017e 90 % objemu s\u00faboru WAL. Tieto z\u00e1znamy s\u00fa potrebn\u00e9 iba ve\u013emi kr\u00e1tku dobu (predvolen\u00fd interval medzi checkpointami je 3 min\u00faty). Logick\u00e9 by bolo zbavi\u0165 sa t\u00fdchto \u00fadajov po strate ich aktu\u00e1lnosti. Presne to vykon\u00e1va mechanizmus WAL compaction, odstra\u0148uje fyzick\u00e9 z\u00e1znamy a komprimuje zost\u00e1vaj\u00face logick\u00e9 z\u00e1znamy pomocou zip, pri\u010dom sa ve\u013ekos\u0165 s\u00faboru v\u00fdrazne zmen\u0161uje (niekedy a\u017e desiatky kr\u00e1t).<\/p>\n<p>Fyzick\u00fd WAL sa sklad\u00e1 z nieko\u013ek\u00fdch segmentov (predvolene 10) pevn\u00fdch rozmerov (predvolene 64MB), ktor\u00e9 sa prepisuj\u00fa dookola. Akon\u00e1hle je aktu\u00e1lny segment zaplnen\u00fd, prirad\u00ed sa mu nasleduj\u00faci segment, a zaplnen\u00fd segment sa kop\u00edruje do arch\u00edvu pomocou samostatn\u00e9ho vl\u00e1kna. WAL kompresia u\u017e pracuje s arch\u00edvnymi segmentami. Taktie\u017e samostatn\u00e9 vl\u00e1kno sleduje vykon\u00e1vanie kontroln\u00e9ho bodu a za\u010d\u00edna s\u0165ahovanie po arch\u00edvnych segmentoch, fyzick\u00e9 z\u00e1pisy, ktor\u00e9 u\u017e nie s\u00fa potrebn\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Data compression in Apache Ignite. Experience of Sber\" src=\"\/wp-content\/uploads\/2020\/05\/ca8690ba7a350df9530f2ccf01c90975.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h4>Vplyv na v\u00fdkon<\/h4>\n<p>\nKe\u010f\u017ee WAL kompresia pracuje samostatn\u00fdm vl\u00e1knom, nemala by ma\u0165 priamy dopad na vykon\u00e1van\u00e9 oper\u00e1cie. Napriek tomu vytv\u00e1ra dodato\u010dn\u00fa z\u00e1\u0165a\u017e na CPU (kompresia) a disk (\u010d\u00edtanie ka\u017ed\u00e9ho WAL segmentu z arch\u00edvu a zapisovanie zkomprimovan\u00fdch segmentov), tak\u017ee ak je syst\u00e9m na hranici mo\u017enost\u00ed, tak povedie aj k degrad\u00e1cii v\u00fdkonu.<\/p>\n<h4>Ako zapn\u00fa\u0165 a nastavi\u0165<\/h4>\n<p>\nWAL kompresiu je mo\u017en\u00e9 povoli\u0165 pomocou vlastnosti <code>WalCompactionEnabled<\/code> v <code>DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)<\/code>). Taktie\u017e, pomocou met\u00f3dy DataStorageConfiguration.setWalCompactionLevel() je mo\u017en\u00e9 nastavi\u0165 \u00farove\u0148 kompresie, ak nie je spokojn\u00fd s predvolenou hodnotou (BEST_SPEED).<\/p>\n<h3>Kompresia sn\u00edmky WAL str\u00e1nky<\/h3>\n<p><\/p>\n<h4>Ako to funguje<\/h4>\n<p>\nU\u017e sme zistili, \u017ee z\u00e1znamy WAL sa delia na logick\u00e9 a fyzick\u00e9. Na ka\u017ed\u00fa zmenu ka\u017edej str\u00e1nky v str\u00e1nkovej pam\u00e4ti sa vytv\u00e1ra fyzick\u00fd z\u00e1znam WAL. Fyzick\u00e9 z\u00e1znamy sa tie\u017e delia na dva podtypy: z\u00e1znam sn\u00edmky str\u00e1nky a delta z\u00e1znam. Kedyko\u013evek zmen\u00edme nie\u010do na str\u00e1nke a pretransformujeme ju z \u010dist\u00e9ho stavu na \u0161pinav\u00fd, v WAL sa zachov\u00e1va \u00fapln\u00e1 k\u00f3pia tejto str\u00e1nky (z\u00e1znam sn\u00edmky str\u00e1nky \u2013 snapshot str\u00e1nky). Aj ke\u010f zmen\u00edme iba jeden bajt, v WAL sa zachov\u00e1 z\u00e1znam ve\u013ekosti len o nie\u010do v\u00e4\u010d\u0161ej ako ve\u013ekos\u0165 str\u00e1nky. Ak v\u0161ak men\u00edme nie\u010do na u\u017e \u0161pinavej str\u00e1nke, v WAL sa vytv\u00e1ra delta z\u00e1znam, ktor\u00fd odr\u00e1\u017ea iba zmeny v porovnan\u00ed s predch\u00e1dzaj\u00facim stavom str\u00e1nky, ale nie cel\u00fa str\u00e1nku. Ke\u010f\u017ee resetovanie stavu str\u00e1nok z \u0161pinav\u00e9ho na \u010dist\u00fd sa vykon\u00e1va po\u010das procesu kontroln\u00e9ho bodu, takmer v\u0161etky fyzick\u00e9 z\u00e1znamy na za\u010diatku kontroln\u00e9ho bodu bud\u00fa pozost\u00e1va\u0165 iba zo sn\u00edmok str\u00e1nok (preto\u017ee v\u0161etky str\u00e1nky s\u00fa na za\u010diatku kontroln\u00e9ho bodu \u010dist\u00e9). N\u00e1sledne, ako sa bl\u00ed\u017eime k \u010fal\u0161iemu kontroln\u00e9mu bodu, podiel delta z\u00e1znamov za\u010d\u00edna r\u00e1s\u0165 a op\u00e4\u0165 sa resetuje na za\u010diatku nasleduj\u00faceho kontroln\u00e9ho bodu. Merania na niektor\u00fdch syntetick\u00fdch testoch uk\u00e1zali, \u017ee podiel sn\u00edmok str\u00e1nok v celkovom objeme fyzick\u00fdch z\u00e1znamov dosahuje a\u017e 90%.<\/p>\n<p>My\u0161lienka kompresie sn\u00edmok str\u00e1nok WAL spo\u010d\u00edva v tom, aby sa sn\u00edmky str\u00e1nok komprezovali pomocou u\u017e existuj\u00faceho n\u00e1stroja na kompresiu str\u00e1nok (pozri kompresiu str\u00e1nok na disku). Pri tom sa z\u00e1znamy WAL ukladaj\u00fa sekven\u010dne v re\u017eime append-only a nie je potrebn\u00e1 v\u00e4zba z\u00e1znamov na hranice blokov s\u00faborov\u00e9ho syst\u00e9mu, a preto tu, na rozdiel od mechanizmu kompresie str\u00e1nok na disku, nepotrebujeme sparse s\u00fabory. T\u00fdm p\u00e1dom bude tento mechanizmus fungova\u0165 nielen na opera\u010dnom syst\u00e9me Linux. Okrem toho n\u00e1m u\u017e nez\u00e1le\u017e\u00ed na tom, ak\u00fa vysok\u00fa kompresiu sa n\u00e1m podarilo dosiahnu\u0165. Aj ke\u010f sme uvo\u013enili iba 1 bajt, je to u\u017e pozit\u00edvny v\u00fdsledok a m\u00f4\u017eeme uklada\u0165 do WAL komprimovan\u00e9 \u00fadaje, na rozdiel od kompresie str\u00e1nok na disku, kde ukl\u00e1dame komprimovan\u00fa str\u00e1nku iba ak sme uvo\u013enili viac ne\u017e 1 blok s\u00faborov\u00e9ho syst\u00e9mu.<\/p>\n<p>Str\u00e1nky s\u00fa dobre komprimovate\u013en\u00e9 \u00fadaje, ich podiel na celkovom objeme WAL je ve\u013emi vysok\u00fd, tak\u017ee bez zmeny form\u00e1tu s\u00faboru WAL m\u00f4\u017eeme dosiahnu\u0165 v\u00fdznamn\u00e9 zn\u00ed\u017eenie jeho ve\u013ekosti. Kompresia vr\u00e1tane logick\u00fdch z\u00e1znamov by si vy\u017eadovala zmenu form\u00e1tu a stratu kompatibility, napr\u00edklad pre vonkaj\u0161\u00edch spotrebite\u013eov, ktor\u00ed m\u00f4\u017eu ma\u0165 z\u00e1ujem o logick\u00e9 z\u00e1znamy, pritom by to neprinieslo v\u00fdznamn\u00e9 zmen\u0161enie objemu s\u00faboru.<\/p>\n<p>Rovnako ako pri kompresii diskov\u00fdch str\u00e1nok, pre kompresiu sn\u00edmok str\u00e1nok WAL m\u00f4\u017eu by\u0165 pou\u017eit\u00e9 algoritmy kompresie ZSTD, LZ4, Snappy, ako aj re\u017eim SKIP_GARBAGE.<\/p>\n<h4>Vplyv na v\u00fdkon<\/h4>\n<p>\nNie je \u0165a\u017ek\u00e9 si v\u0161imn\u00fa\u0165, \u017ee priame zapnutie kompresie sn\u00edmok str\u00e1nok WAL ovplyv\u0148uje iba pr\u00fady, ktor\u00e9 ukladaj\u00fa d\u00e1ta do str\u00e1nkovej pam\u00e4te, teda tie pr\u00fady, ktor\u00e9 menia d\u00e1ta v cache. \u010c\u00edtanie z fyzick\u00fdch z\u00e1znamov WAL sa deje iba jednorazovo, v momente obnovy uzla po zlyhan\u00ed (a to iba v pr\u00edpade zlyhania po\u010das checkpointu).<\/p>\n<p>Na pr\u00fady, ktor\u00e9 menia d\u00e1ta, to vpl\u00fdva nasleduj\u00facim sp\u00f4sobom: z\u00edskavame negat\u00edvny efekt (CPU) z d\u00f4vodu nutnosti zaka\u017ed\u00fdm komprimova\u0165 str\u00e1nku pred z\u00e1pisom na disk a pozit\u00edvny efekt (disk IO) z d\u00f4vodu zn\u00ed\u017eenia mno\u017estva zapisovan\u00fdch \u00fadajov. Zodpovedaj\u00facim sp\u00f4sobom, ak sa v\u00fdkon syst\u00e9mu obmedzuje na CPU, z\u00edskavame mal\u00e9 zhor\u0161enie, ak na diskov\u00fd vstup\/v\u00fdstup \u2014 z\u00edskavame n\u00e1rast.<\/p>\n<p>Nepriamo zn\u00ed\u017eenie ve\u013ekosti WAL taktie\u017e pozit\u00edvne ovplyv\u0148uje pr\u00fady, ktor\u00e9 archivuj\u00fa segmenty WAL, a pr\u00fady WAL compaction.<\/p>\n<p>Skuto\u010dn\u00e9 testy v\u00fdkonu v na\u0161om prostred\u00ed na syntetick\u00fdch d\u00e1tach uk\u00e1zali mierny n\u00e1rast (priepustnos\u0165 vzr\u00e1stla o 10%-15%, latencia sa zn\u00ed\u017eila o 10%-15%).<\/p>\n<h4>Ako zapn\u00fa\u0165 a nastavi\u0165<\/h4>\n<p>\nMinim\u00e1lna verzia Apache Ignite: 2.8. Zapnutie a nastavenie sa vykon\u00e1va nasledovne:<\/p>\n<ul>\n<li>V class-path by mal by\u0165 modul ignite-compression. Predvolene sa nach\u00e1dza v distrib\u00facii Apache Ignite v adres\u00e1ri libs\/optional a nie je zahrnut\u00fd v class-path. Jednoducho m\u00f4\u017eete presun\u00fa\u0165 adres\u00e1r o jeden level vy\u0161\u0161ie do libs a pri spusten\u00ed cez ignite.sh bude automaticky zahrnut\u00fd.<\/li>\n<li>Trvalos\u0165 mus\u00ed by\u0165 zapnut\u00e1 (zap\u00edna sa cez <code>DataRegionConfiguration.setPersistenceEnabled(true)<\/code>).<\/li>\n<li>Mus\u00ed by\u0165 zadan\u00fd re\u017eim kompresie pomocou met\u00f3dy <code>DataStorageConfiguration.setWalPageCompression()<\/code>, predvolene je kompresia vypnut\u00e1 (re\u017eim DISABLED).<\/li>\n<li>Volite\u013ene je mo\u017en\u00e9 zada\u0165 stupe\u0148 kompresie pomocou met\u00f3dy <code>DataStorageConfiguration.setWalPageCompression()<\/code>, povolen\u00e9 hodnoty pre ka\u017ed\u00fd z re\u017eimov n\u00e1jdete v javadoc k met\u00f3de.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Z\u00e1ver<\/h3>\n<p>\nMechanizmy kompresie \u00fadajov v Apache Ignite m\u00f4\u017eu by\u0165 pou\u017e\u00edvan\u00e9 nez\u00e1visle jeden od druh\u00e9ho, ale rovnako s\u00fa pr\u00edpustn\u00e9 aj ak\u00e9ko\u013evek ich kombin\u00e1cie. Pochopenie princ\u00edpov ich fungovania umo\u017en\u00ed ur\u010di\u0165, ako dobre vyhovuj\u00fa va\u0161im \u00faloh\u00e1m vo va\u0161om prostred\u00ed a s \u010d\u00edm sa budete musie\u0165 pri ich pou\u017e\u00edvan\u00ed zmieri\u0165. Kompresia diskov\u00fdch str\u00e1n je ur\u010den\u00e1 na kompresiu hlavn\u00e9ho \u00falo\u017eiska a m\u00f4\u017ee dosiahnu\u0165 priemern\u00fd stupe\u0148 kompresie. Kompresia sn\u00edmok str\u00e1nky WAL poskytne priemern\u00fd stupe\u0148 kompresie u\u017e pre s\u00fabory WAL, pri\u010dom pravdepodobne dokonca zv\u00fd\u0161i v\u00fdkon. Kompresia WAL nebude ma\u0165 pozit\u00edvny vplyv na v\u00fdkon, ale maxim\u00e1lne zn\u00ed\u017ei ve\u013ekos\u0165 s\u00faborov WAL odstr\u00e1nen\u00edm fyzick\u00fdch z\u00e1znamov.<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.4 - 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\/sk\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Kompresia \u00fadajov v Apache Ignite. Sk\u00fasenosti Sberbanky | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/81936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=81936"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/81936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/81937"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=81936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=81936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=81936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}