{"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\/ro\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","title":{"rendered":"Compresia datelor \u00een Apache Ignite. Experien\u021ba Sberbank","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Compresia datelor \u00een Apache Ignite. Experien\u021ba Sberbank\" src=\"\/wp-content\/uploads\/2020\/05\/0e26c686b1f29e88e6be4b8df81ab668.jpg\" style=\"display:block;margin: 0 auto;\" \/>C\u00e2nd lucr\u0103m cu volume mari de date, problema lipsei de spa\u021biu pe discuri poate deveni acut\u0103. O modalitate de a rezolva aceast\u0103 problem\u0103 este comprimarea, care ne permite s\u0103 cre\u0219tem capacitatea de stocare pe acela\u0219i echipament. \u00cen acest articol, vom explora cum func\u021bioneaz\u0103 comprimarea datelor \u00een Apache Ignite. Vom discuta doar metodele de comprimare implementate \u00een produs. Alte metode de comprimare a datelor (prin re\u021bea, \u00een memorie), at\u00e2t implementate, c\u00e2t \u0219i neimplementate, vor fi excluse.<\/p>\n<p>A\u0219adar, cu modul de persisten\u021b\u0103 activat, \u00een urma modific\u0103rii datelor din cache-uri, Ignite \u00eencepe s\u0103 scrie pe disc:<\/p>\n<ol>\n<li>Con\u021binutul cache-urilor<\/li>\n<li>Jurnalul scrierii anticipative (Write Ahead Log, \u00een continuare doar WAL)<\/li>\n<\/ol>\n<p>\nPentru comprimarea WAL, exist\u0103 de ceva timp un mecanism numit compresie WAL. \u00cen versiunea recent lansat\u0103 Apache Ignite 2.8 au fost introduse \u00eenc\u0103 dou\u0103 mecanisme care permit comprimarea datelor pe disc, \u0219i anume compresia paginii de disc pentru comprimarea con\u021binutului cache-urilor \u0219i compresia instantaneelor paginilor WAL pentru comprimarea unor \u00eenregistr\u0103ri din WAL. Mai multe detalii despre aceste trei mecanisme mai jos.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Compresia paginii de disc<\/h3>\n<p><\/p>\n<h4>Cum func\u021bioneaz\u0103<\/h4>\n<p>\nPentru \u00eenceput, s\u0103 discut\u0103m foarte pe scurt despre cum Ignite stocheaz\u0103 datele. Stocarea se realizeaz\u0103 prin memorie pe pagini. Dimensiunea paginii este stabilit\u0103 la pornirea nodului \u0219i nu poate fi schimbat\u0103 \u00een etapele ulterioare; dimensiunea paginii trebuie s\u0103 fie o putere a lui 2 \u0219i s\u0103 fie multipl\u0103 de dimensiunea blocului sistemului de fi\u0219iere. Pagini sunt \u00eenc\u0103rcate \u00een RAM din disc pe m\u0103sur\u0103 ce este necesar, dimensiunea datelor de pe disc poate dep\u0103\u0219i volumul de RAM alocat. \u00cen cazul \u00een care RAM nu are suficient spa\u021biu pentru a \u00eenc\u0103rca o pagin\u0103 din disc, paginile vechi, deja neutilizate, vor fi \u00eenlocuite din RAM.<\/p>\n<p>Pe disc, datele sunt stocate \u00een urm\u0103toarea form\u0103: pentru fiecare parti\u021bie a fiec\u0103rei grupuri de cache se creeaz\u0103 un fi\u0219ier separat, \u00een acest fi\u0219ier, paginile sunt aranjate una dup\u0103 alta, \u00een ordinea cresc\u0103toare a indexului. Identificatorul complet al paginii con\u021bine identificatorul grupului de cache, num\u0103rul parti\u021biei \u0219i indexul paginii \u00een fi\u0219ier. Astfel, pe baza identificatorului complet al paginii, putem determina f\u0103r\u0103 ambiguitate fi\u0219ierul \u0219i offset-ul din fi\u0219ier pentru fiecare pagin\u0103. Detalii suplimentare despre structura memoriei pe pagini pot fi citite \u00een articolul de pe 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 sub capot\u0103<\/a><\/noindex>.<\/p>\n<p>Mecanismul de comprimare a paginilor de disc, a\u0219a cum sugereaz\u0103 numele, func\u021bioneaz\u0103 la nivel de pagin\u0103. Atunci c\u00e2nd acest mecanism este activat, lucrul cu datele \u00een RAM se face a\u0219a cum este, f\u0103r\u0103 nicio comprimare, dar \u00een momentul salv\u0103rii paginilor din RAM pe disc, se aplic\u0103 comprimarea acestora.<\/p>\n<p>Dar comprimarea fiec\u0103rei pagini individual nu este suficient\u0103 pentru a rezolva problema; trebuie cumva s\u0103 reducem dimensiunea fi\u0219ierelor finale cu date. Dac\u0103 dimensiunea paginii nu mai este fix\u0103, nu putem scrie paginile \u00eentr-un fi\u0219ier una dup\u0103 alta, deoarece acest lucru poate crea o serie de probleme:<\/p>\n<ul>\n<li>Nu vom putea calcula offset-ul la care se afl\u0103 pagina \u00een fi\u0219ier folosind indexul paginii.<\/li>\n<li>Nu este clar ce s\u0103 facem cu paginile care nu se afl\u0103 la sf\u00e2r\u0219itul fi\u0219ierului \u0219i \u00ee\u0219i schimb\u0103 dimensiunea. Dac\u0103 dimensiunea paginii se mic\u0219oreaz\u0103, locul pe care l-a eliberat se pierde. Dac\u0103 dimensiunea paginii cre\u0219te, trebuie s\u0103 c\u0103ut\u0103m un nou loc \u00een fi\u0219ier pentru aceasta.<\/li>\n<li>Dac\u0103 pagina se va deplasa cu un num\u0103r de octe\u021bi care nu este multiplu de dimensiunea blocului sistemului de fi\u0219iere, pentru a o citi sau salva va trebui s\u0103 atingem un bloc de sistem de fi\u0219iere \u00een plus, ceea ce poate duce la degradarea performan\u021bei.<\/li>\n<\/ul>\n<p>\nPentru a nu rezolva aceste probleme la nivelul s\u0103u, comprimarea paginilor de disc \u00een Apache Ignite utilizeaz\u0103 un mecanism de sistem de fi\u0219iere numit fi\u0219iere sparse. Un fi\u0219ier sparse este un fi\u0219ier \u00een care unele regiuni umplute cu zerouri pot fi marcate ca \u201eg\u0103uri\u201d. Astfel, blocurile de sistem de fi\u0219iere pentru stocarea acestor g\u0103uri nu vor fi alocate, ceea ce duce la economisirea de spa\u021biu pe disc.<\/p>\n<p>Este logic c\u0103 pentru a elibera un bloc de sistem de fi\u0219iere, dimensiunea g\u0103urii trebuie s\u0103 fie mai mare sau egal\u0103 cu dimensiunea blocului de sistem de fi\u0219iere, ceea ce impune o limitare suplimentar\u0103 asupra dimensiunii paginii \u00een Apache Ignite: pentru ca comprimarea s\u0103 aib\u0103 un efect, dimensiunea paginii trebuie s\u0103 fie strict mai mare dec\u00e2t dimensiunea blocului de sistem de fi\u0219iere. Dac\u0103 dimensiunea paginii este egal\u0103 cu dimensiunea blocului, nu vom putea elibera niciun bloc, deoarece pentru a elibera un singur bloc, pagina comprimat\u0103 trebuie s\u0103 ocupe 0 octe\u021bi. Dac\u0103 dimensiunea paginii este egal\u0103 cu dimensiunea a 2 sau 4 blocuri, putem elibera cel pu\u021bin un bloc dac\u0103 pagina noastr\u0103 se comprim\u0103 cu cel pu\u021bin 50% sau 75%, respectiv.<\/p>\n<p>Astfel, descrierea final\u0103 a func\u021bion\u0103rii mecanismului: Atunci c\u00e2nd se scrie o pagin\u0103 pe disc, se \u00eencearc\u0103 comprimarea acesteia. Dac\u0103 dimensiunea paginii comprimate permite eliberarea unui sau mai multor blocuri din sistemul de fi\u0219iere, pagina este scris\u0103 \u00een format comprimat, iar \u00een locul blocurilor eliberate se creeaz\u0103 un \"gol\" (se execut\u0103 un apel de sistem) <code>fallocate()<\/code> cu flagul \u201epunch hole\u201d). Dac\u0103 dimensiunea paginii comprimate nu permite eliberarea blocurilor, pagina este salvat\u0103 a\u0219a cum este, \u00een format necomprimat. Toate offseturile paginilor sunt considerate la fel ca \u0219i f\u0103r\u0103 compresie, prin \u00eenmul\u021birea indexului paginii cu dimensiunea paginii. Nicio relocare a paginilor nu este necesar\u0103 din partea utilizatorului. Offseturile paginilor, ca \u0219i \u00een cazul f\u0103r\u0103 compresie, se aliniaz\u0103 la limitele blocurilor din sistemul de fi\u0219iere.<\/p>\n<p><img decoding=\"async\" alt=\"Compresia datelor \u00een Apache Ignite. Experien\u021ba Sberbank\" src=\"\/wp-content\/uploads\/2020\/05\/6a6c6ad83d3b8591f76b9343ff067746.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00cen implementarea actual\u0103, Ignite poate lucra cu fi\u0219iere sparse doar pe sistemul de operare Linux, astfel \u00eenc\u00e2t compresia paginilor pe disc poate fi activat\u0103 doar atunci c\u00e2nd se folose\u0219te Ignite pe acest sistem de operare.<\/p>\n<p>Algoritmii de compresie care pot fi utiliza\u021bi pentru compresia paginilor pe disc: ZSTD, LZ4, Snappy. \u00cen plus, exist\u0103 un mod de lucru (SKIP_GARBAGE), \u00een care doar spa\u021biile neutilizate \u00een pagin\u0103 sunt eliminate f\u0103r\u0103 aplicarea compresiei asupra datelor r\u0103mase, ceea ce permite reducerea sarcinii pe CPU comparativ cu algoritmii men\u021biona\u021bi anterior.<\/p>\n<h4>Influen\u021ba asupra performan\u021bei <\/h4>\n<p>\nDin p\u0103cate, nu am efectuat m\u0103sur\u0103tori reale ale performan\u021bei \u00een medii reale, deoarece nu se preconizeaz\u0103 utilizarea acestui mecanism \u00een produc\u021bie, dar putem specula teoretic unde vom pierde \u0219i unde vom c\u00e2\u0219tiga.<\/p>\n<p>Pentru aceasta, trebuie s\u0103 ne amintim cum se realizeaz\u0103 citirea \u0219i scrierea paginilor la accesarea acestora:<\/p>\n<ul>\n<li>\u00cen timpul opera\u021biei de citire, \u00eent\u00e2i se caut\u0103 \u00een RAM, dac\u0103 c\u0103utarea e\u0219ueaz\u0103, pagina este \u00eenc\u0103rcat\u0103 \u00een RAM din disc de c\u0103tre acela\u0219i fir de execu\u021bie care efectueaz\u0103 citirea.<\/li>\n<li>\u00cen timpul opera\u021biei de scriere, pagina din RAM este marcat\u0103 ca murdar\u0103, iar salvarea fizic\u0103 a paginii pe disc nu se efectueaz\u0103 imediat de c\u0103tre firul care execut\u0103 scrierea. Toate paginile murdare sunt salvate pe disc ulterior, \u00een timpul procesului de checkpoint de c\u0103tre fire separate.<\/li>\n<\/ul>\n<p>\nAstfel, influen\u021ba asupra opera\u021biunilor de citire:<\/p>\n<ul>\n<li>Pozitiv\u0103 (disk IO), datorit\u0103 reducerii num\u0103rului de blocuri citite din sistemul de fi\u0219iere.<\/li>\n<li>Negativ (CPU), din cauza sarcinii suplimentare necesare sistemului de operare pentru a lucra cu fi\u0219iere sparse. De asemenea, este posibil s\u0103 apar\u0103 implicit opera\u021bii IO suplimentare pentru salvarea unei structuri mai complexe a fi\u0219ierului sparse (din p\u0103cate, nu sunt familiarizat cu toate detaliile func\u021bion\u0103rii fi\u0219ierelor sparse).<\/li>\n<li>Negativ (CPU), din cauza necesit\u0103\u021bii de decomprimare a paginilor.<\/li>\n<li>Nu exist\u0103 influen\u021be asupra opera\u021biunilor de scriere.<\/li>\n<li>Influen\u021ba asupra procesului de checkpoint (aici totul este similar opera\u021biunilor de citire):<\/li>\n<li>Pozitiv (disk IO), datorit\u0103 reducerii num\u0103rului de blocuri scrise \u00een sistemul de fi\u0219iere.<\/li>\n<li>Negativ (CPU, posibil disk IO), din cauza lucrului cu fi\u0219ierele sparse.<\/li>\n<li>Negativ (CPU), din cauza necesit\u0103\u021bii de comprimare a paginilor.<\/li>\n<\/ul>\n<p>\nCare dintre cele dou\u0103 talere va c\u00e2nt\u0103ri mai mult? Totul depinde foarte mult de mediu, dar m\u0103 inclin s\u0103 cred c\u0103 compresia paginilor disk va duce mai degrab\u0103 la o degradare a performan\u021bei \u00een majoritatea sistemelor. Cu at\u00e2t mai mult cu c\u00e2t testele pe alte RDBMS care folosesc o abordare similar\u0103 cu fi\u0219ierele sparse arat\u0103 o sc\u0103dere a performan\u021bei atunci c\u00e2nd compresia este activat\u0103.<\/p>\n<h4>Cum s\u0103 activ\u0103m \u0219i s\u0103 configur\u0103m<\/h4>\n<p>\nA\u0219a cum am men\u021bionat mai sus, versiunea minim\u0103 Apache Ignite care suport\u0103 compresia paginilor disk: 2.8 \u0219i este sus\u021binut\u0103 doar de sistemul de operare Linux. Activarea \u0219i configurarea se face astfel:<\/p>\n<ul>\n<li>\u00cen class-path trebuie s\u0103 fie modulele ignite-compression. Prin default se afl\u0103 \u00een distribu\u021bia Apache Ignite \u00een directorul libs\/optional \u0219i nu este inclus \u00een class-path. Po\u021bi pur \u0219i simplu s\u0103 mu\u021bi directorul cu un nivel mai sus \u00een libs \u0219i astfel la rularea prin ignite.sh va fi inclus automat.<\/li>\n<li>Persisten\u021ba trebuie s\u0103 fie activat\u0103 (se activeaz\u0103 prin <code>DataRegionConfiguration.setPersistenceEnabled(true))<\/code>.<\/li>\n<li>Dimensiunea paginii trebuie s\u0103 fie mai mare dec\u00e2t dimensiunea blocului sistemului de fi\u0219iere (poate fi specificat\u0103 prin <code>DataStorageConfiguration.setPageSize()<\/code> ).<\/li>\n<li>Pentru fiecare cache al c\u0103rui date trebuie comprimate, este necesar \u00een configura\u021bie s\u0103 se configureze metoda de compresie \u0219i (op\u021bional) nivelul de compresie (metodele <code>CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()<\/code>).<\/li>\n<\/ul>\n<p><\/p>\n<h3>Compresia WAL<\/h3>\n<p><\/p>\n<h4>Cum func\u021bioneaz\u0103<\/h4>\n<p>\nCe este WAL \u0219i de ce este necesar? Pe scurt: este un jurnal \u00een care sunt \u00eenregistrate toate evenimentele care, \u00een final, afecteaz\u0103 stocarea paginilor. Acesta este, \u00een primul r\u00e2nd, necesar pentru a permite recuperarea \u00een caz de c\u0103dere. Orice opera\u021bie, \u00eenainte de a pred\u0430 controlul utilizatorului, trebuie s\u0103 \u00eenregistreze mai \u00eent\u00e2i un eveniment \u00een WAL, astfel \u00eenc\u00e2t, \u00een cazul unei pr\u0103bu\u0219iri, s\u0103 se poat\u0103 reproduce din jurnal \u0219i s\u0103 se recupereze toate opera\u021biile pentru care utilizatorul a primit un r\u0103spuns de succes, chiar dac\u0103 aceste opera\u021bii nu au reu\u0219it s\u0103 se reflecte \u00een stocarea paginilor pe disc (s-a men\u021bionat mai sus c\u0103 \u00eenregistrarea efectiv\u0103 \u00een stocarea paginilor se face \u00eentr-un proces numit \u201echeckpoint\u201d cu o \u00eent\u00e2rziere prin fluxuri separate).<\/p>\n<p>\u00censcrierile \u00een WAL sunt \u00eemp\u0103r\u021bite \u00een logice \u0219i fizice. \u00censcrierile logice sunt cheile \u0219i valorile \u00een sine. \u00censcrierile fizice reflect\u0103 modific\u0103rile paginilor \u00een stocarea paginilor. Dac\u0103 \u00eenscrierile logice pot fi utile \u0219i \u00een alte situa\u021bii, \u00eenscrierile fizice sunt necesare doar pentru recuperare \u00een caz de c\u0103dere \u0219i sunt necesare doar \u00eenscrierile de la ultimul checkpoint de succes. Aici nu ne vom ad\u00e2nci \u00een detalii \u0219i nu vom explica de ce func\u021bioneaz\u0103 a\u0219a, dar cei interesa\u021bi pot consulta articolul men\u021bionat anterior pe 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 sub capot\u0103<\/a><\/noindex>.<\/p>\n<p>Pentru o \u00eenregistrare logic\u0103, adesea exist\u0103 mai multe \u00eenregistr\u0103ri fizice. De exemplu, o opera\u021biune put \u00een cache afecteaz\u0103 mai multe pagini din memoria paginat\u0103 (pagina cu datele, paginile cu indec\u0219i, paginile cu liste gratuite). La unele teste sintetice, am observat c\u0103 \u00eenregistr\u0103rile fizice ocupau p\u00e2n\u0103 la 90% din volumul fi\u0219ierului WAL. Acestea sunt necesare pentru o perioad\u0103 foarte scurt\u0103 de timp (\u00een mod implicit, intervalul dintre checkpoint-uri este de 3 minute). Ar fi logic s\u0103 ne eliber\u0103m de aceste date dup\u0103 ce devin neactualizate. Acesta este exact ceea ce face mecanismul de compresie WAL, elimin\u00e2nd \u00eenregistr\u0103rile fizice \u0219i comprim\u00e2nd \u00eenregistr\u0103rile logice r\u0103mase cu zip, reduc\u00e2nd semnificativ dimensiunea fi\u0219ierului (uneori de zeci de ori).<\/p>\n<p>WAL fizic const\u0103 din mai multe segmente (\u00een mod implicit 10) de dimensiuni fixe (\u00een mod implicit 64Mb), care sunt rescrise \u00een mod circular. Odat\u0103 ce segmentul curent este complet, urm\u0103torul segment \u00eei este alocat, iar segmentul completat este copiat \u00een arhiv\u0103 printr-un flux separat. Compresia WAL func\u021bioneaz\u0103 deja cu segmentele arhivate. De asemenea, printr-un flux separat, acesta urm\u0103re\u0219te finalizarea punctului de control \u0219i \u00eencepe compresia pe segmentele arhivate pentru care \u00eenregistr\u0103rile fizice nu mai sunt necesare.<\/p>\n<p><img decoding=\"async\" alt=\"Compresia datelor \u00een Apache Ignite. Experien\u021ba Sberbank\" src=\"\/wp-content\/uploads\/2020\/05\/ca8690ba7a350df9530f2ccf01c90975.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h4>Influen\u021ba asupra performan\u021bei<\/h4>\n<p>\nDeoarece compresia WAL func\u021bioneaz\u0103 printr-un flux separat, nu ar trebui s\u0103 aib\u0103 un impact direct asupra opera\u021biunilor \u00een desf\u0103\u0219urare. Totu\u0219i, aceasta genereaz\u0103 o sarcin\u0103 suplimentar\u0103 pe CPU (compresie) \u0219i pe disc (citirea fiec\u0103rui segment WAL din arhiv\u0103 \u0219i scrierea segmentelor comprimate), astfel \u00eenc\u00e2t, dac\u0103 sistemul func\u021bioneaz\u0103 la limita capacit\u0103\u021bilor, va duce la o degradare a performan\u021bei.<\/p>\n<h4>Cum s\u0103 activ\u0103m \u0219i s\u0103 configur\u0103m<\/h4>\n<p>\nActivarea compresiei WAL se poate face prin intermediul propriet\u0103\u021bii <code>WalCompactionEnabled<\/code> \u00een <code>DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)<\/code>). De asemenea, prin metoda DataStorageConfiguration.setWalCompactionLevel() se poate stabili nivelul de compresie, dac\u0103 valoarea implicit\u0103 (BEST_SPEED) nu este satisf\u0103c\u0103toare.<\/p>\n<h3>Compresia instantaneelor paginilor WAL<\/h3>\n<p><\/p>\n<h4>Cum func\u021bioneaz\u0103<\/h4>\n<p>\nAnterioar\u0103, am stabilit deja c\u0103 \u00een \u00eenregistr\u0103rile WAL se \u00eempart \u00een logice \u0219i fizice. La fiecare modificare a fiec\u0103rei pagini \u00een memoria paginii se formeaz\u0103 o \u00eenregistrare fizic\u0103 WAL. \u00cenregistr\u0103rile fizice, la r\u00e2ndul lor, se \u00eempart \u00een 2 subtipuri: \u00eenregistrarea instantanee a paginii \u0219i \u00eenregistrarea delta. De fiecare dat\u0103 c\u00e2nd schimb\u0103m ceva pe pagin\u0103 \u0219i o transform\u0103m dintr-o stare curat\u0103 \u00eentr-una murdar\u0103, se salveaz\u0103 o copie complet\u0103 a acestei pagini \u00een WAL (\u00eenregistrarea instantanee a paginii \u2014 snapshot page). Chiar dac\u0103 am schimbat doar un byte, \u00een WAL se va salva o \u00eenregistrare de aproximativ dimensiunea paginii. Dac\u0103 schimb\u0103m ceva pe o pagin\u0103 deja murdar\u0103, atunci \u00een WAL se formeaz\u0103 o \u00eenregistrare delta, care reflect\u0103 doar modific\u0103rile fa\u021b\u0103 de starea anterioar\u0103 a paginii, dar nu \u00eentreaga pagin\u0103. Deoarece resetarea st\u0103rii paginilor de la murdar la curat se efectueaz\u0103 \u00een timpul checkpoint-ului, imediat dup\u0103 \u00eenceperea checkpoint-ului, practic toate \u00eenregistr\u0103rile fizice vor consta doar din instantanee ale paginilor (deoarece toate paginile sunt cur\u0103\u021bate imediat dup\u0103 \u00eenceperea checkpoint-ului), apoi, pe m\u0103sur\u0103 ce ne apropiem de urm\u0103torul checkpoint, propor\u021bia \u00eenregistr\u0103rilor delta \u00eencepe s\u0103 creasc\u0103 \u0219i din nou se reseteaz\u0103 la \u00eenceputul urm\u0103torului checkpoint. M\u0103sur\u0103torile efectuate pe unele teste sintetic au ar\u0103tat c\u0103 propor\u021bia instantaneelor paginilor \u00een volumul total al \u00eenregistr\u0103rilor fizice ajunge la 90%.<\/p>\n<p>Ideea compresiei instantanee a paginii WAL const\u0103 \u00een comprimarea instantaneelor paginilor folosind deja un instrument disponibil pentru comprimarea paginilor (vezi comprimarea paginilor de disc). \u00cen acest caz, \u00eenregistr\u0103rile WAL sunt salvate secven\u021bial \u00een mod append-only \u0219i nu este necesar\u0103 asocierea \u00eenregistr\u0103rilor cu limitele blocurilor sistemului de fi\u0219iere, astfel c\u0103, spre deosebire de mecanismul de comprimare a paginilor de disc, nu avem nevoie de fi\u0219iere sparse, astfel \u00eenc\u00e2t acest mecanism va func\u021biona nu doar pe sistemele de operare Linux. \u00cen plus, nu ne mai pas\u0103 c\u00e2t de mult am reu\u0219it s\u0103 comprin\u0103m pagina. Chiar dac\u0103 am eliberat 1 byte, acesta este deja un rezultat pozitiv \u0219i putem salva \u00een WAL datele comprimate, spre deosebire de comprimarea paginilor de disc, unde salv\u0103m pagina comprimat\u0103 doar dac\u0103 am eliberat mai mult de 1 bloc din sistemul de fi\u0219iere.<\/p>\n<p>Pagini \u2014 date bine comprimate, ponderea lor \u00een volumul total al WAL este foarte mare, astfel, p\u0103str\u00e2nd formatul fi\u0219ierului WAL, putem ob\u021bine o reducere semnificativ\u0103 a dimensiunii acestuia. Compresia, inclusiv a \u00eenregistr\u0103rilor logice, ar necesita modificarea formatului \u0219i pierderea compatibilit\u0103\u021bii, de exemplu, pentru consumatorii externi care ar putea fi interesa\u021bi de \u00eenregistr\u0103rile logice, f\u0103r\u0103 a aduce o reducere semnificativ\u0103 a volumului fi\u0219ierului.<\/p>\n<p>La fel ca pentru compresia paginilor de disc, pentru compresia paginilor snapshot WAL pot fi utilizate algoritmi de compresie ZSTD, LZ4, Snappy, precum \u0219i modul SKIP_GARBAGE.<\/p>\n<h4>Influen\u021ba asupra performan\u021bei<\/h4>\n<p>\nDup\u0103 cum se poate observa, activarea direct\u0103 a compresiei paginilor snapshot WAL afecteaz\u0103 doar firele care scriu date \u00een memoria paginilor, adic\u0103 acele fire care modific\u0103 datele \u00een cache. Citirea din WAL a \u00eenregistr\u0103rilor fizice se face doar o singur\u0103 dat\u0103, \u00een momentul ridic\u0103rii nodului dup\u0103 o c\u0103dere (\u0219i doar \u00een cazul c\u0103derii \u00een timpul checkpoint-ului).<\/p>\n<p>Aceasta afecteaz\u0103 firele care modific\u0103 datele \u00een urm\u0103torul mod: ob\u021binem un efect negativ (CPU) din cauza necesit\u0103\u021bii de a compresa pagina \u00eenainte de a o scrie pe disc \u0219i un efect pozitiv (disk IO) din reducerea cantit\u0103\u021bii de date scrise. Astfel, totul este simplu: dac\u0103 performan\u021ba sistemului este limitat\u0103 de CPU, ob\u021binem o mic\u0103 degradare; dac\u0103 este limitat\u0103 de I\/O-ul de disc, ob\u021binem un avantaj.<\/p>\n<p>Indirect, reducerea dimensiunii WAL influen\u021beaz\u0103 de asemenea (pozitiv) firele care arhiveaz\u0103 segmentele WAL \u0219i firele de compactare WAL.<\/p>\n<p>Testele reale de performan\u021b\u0103 \u00een mediu nostru cu date sintetice au ar\u0103tat o mic\u0103 cre\u0219tere (prin 10%-15% a crescut throughput-ul, prin 10%-15% a sc\u0103zut laten\u021ba).<\/p>\n<h4>Cum s\u0103 activ\u0103m \u0219i s\u0103 configur\u0103m<\/h4>\n<p>\nVersiunea minim\u0103 de Apache Ignite: 2.8. Activarea \u0219i configurarea se efectueaz\u0103 \u00een urm\u0103torul mod:<\/p>\n<ul>\n<li>\u00cen class-path trebuie s\u0103 fie modulele ignite-compression. Prin default se afl\u0103 \u00een distribu\u021bia Apache Ignite \u00een directorul libs\/optional \u0219i nu este inclus \u00een class-path. Po\u021bi pur \u0219i simplu s\u0103 mu\u021bi directorul cu un nivel mai sus \u00een libs \u0219i astfel la rularea prin ignite.sh va fi inclus automat.<\/li>\n<li>Persisten\u021ba trebuie s\u0103 fie activat\u0103 (se activeaz\u0103 prin <code>DataRegionConfiguration.setPersistenceEnabled(true)<\/code>).<\/li>\n<li>Trebuie s\u0103 fie stabilit modul de compresie folosind metoda <code>DataStorageConfiguration.setWalPageCompression()<\/code>, \u00een mod implicit compresia este dezactivat\u0103 (modul DISABLED).<\/li>\n<li>Op\u021bional, se poate stabili gradul de compresie folosind metoda <code>DataStorageConfiguration.setWalPageCompression()<\/code>, valorile permise pentru fiecare dintre moduri pot fi g\u0103site \u00een javadoc pentru metod\u0103.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Concluzie<\/h3>\n<p>\nMecanismele de compresie a datelor discutate \u00een Apache Ignite pot fi utilizate independent unul de cel\u0103lalt, dar sunt acceptate \u0219i orice combina\u021bii ale acestora. \u00cen\u021belegerea principiilor lor de func\u021bionare va permite s\u0103 determina\u021bi c\u00e2t de bine se potrivesc nevoilor dumneavoastr\u0103 \u00een mediul \u00een care lucra\u021bi \u0219i ce va trebui s\u0103 sacrifica\u021bi pentru a le utiliza. Compresia paginii de disc este destinat\u0103 comprim\u0103rii stoc\u0103rii principale \u0219i poate oferi un grad mediu de compresie. Compresia instantaneelor paginii WAL va oferi un grad mediu de compresie pentru fi\u0219ierele WAL, cel mai probabil chiar va \u00eembun\u0103t\u0103\u021bi performan\u021ba. Compac\u021bia WAL nu va afecta pozitiv performan\u021ba, dar va reduce la minimum dimensiunea fi\u0219ierelor WAL prin eliminarea \u00eenregistr\u0103rilor fizice.<br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Compresia datelor \u00een Apache Ignite. Experien\u021ba Sber | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/szhatie-dannyh-v-apache-ignite-opyt-sbera","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/81936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=81936"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/81936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/81937"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=81936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=81936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=81936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}