Adatok tömörítése Apache Ignite-ban. A Sber tapasztalatai

Adatok tömörĂ­tĂ©se Apache Ignite-ban. A Sber tapasztalataiNagy adatmennyisĂ©gek kezelĂ©se sorĂĄn gyakran felmerĂŒl a lemezhely hiĂĄnyĂĄnak problĂ©mĂĄja. Az egyik megoldĂĄs a tömörĂ­tĂ©s, amely lehetƑvĂ© teszi, hogy ugyanazon a hardveren megnöveljĂŒk a tĂĄrolĂĄsi kapacitĂĄst. Ebben a cikkben megvizsgĂĄljuk, hogyan mƱködik az adat tömörĂ­tĂ©se az Apache Ignite-ban. Csak a termĂ©kben megvalĂłsĂ­tott lemezes tömörĂ­tĂ©si mĂłdszereket tĂĄrgyaljuk. MĂĄs, pĂ©ldĂĄul hĂĄlĂłzaton vagy memĂłriĂĄban vĂ©gzett tömörĂ­tĂ©si mĂłdszerek, akĂĄr megvalĂłsĂ­tott, akĂĄr nem, kĂ­vĂŒl maradnak.

TehĂĄt, a perzisztensek ĂŒzemmĂłdjĂĄnak bekapcsolĂĄsakor, az adatok cache-be törtĂ©nƑ megvĂĄltoztatĂĄsĂĄnak eredmĂ©nyekĂ©nt az Ignite elkezdi a lemezre Ă­rĂĄst:

  1. A cache-ek tartalma
  2. ElƑzetes írási napló (Write Ahead Log, a továbbiakban csak WAL)

A WAL tömörĂ­tĂ©sĂ©re mĂĄr rĂ©gĂłta lĂ©tezik egy mechanizmus, amelyet WAL compaction-nak hĂ­vnak. A nemrĂ©giben megjelent Apache Ignite 2.8-ban tovĂĄbbi kĂ©t mechanizmus is megjelent, amelyek lehetƑvĂ© teszik a lemezen lĂ©vƑ adatok tömörĂ­tĂ©sĂ©t: ez a disk page compression a cache-ek tartalmĂĄnak tömörĂ­tĂ©sĂ©re Ă©s a WAL page snapshot compression a WAL nĂ©hĂĄny bejegyzĂ©sĂ©nek tömörĂ­tĂ©sĂ©re. RĂ©szletesebben az alĂĄbbiakban mindhĂĄrom mechanizmust bemutatjuk.

Disk page compression

Hogyan mƱködik ez

ElƑször is, röviden nĂ©zzĂŒk meg, hogyan tĂĄrolja az Ignite az adatokat. Az adatok lapozott memĂłriĂĄban kerĂŒlnek tĂĄrolĂĄsra. A lap mĂ©rete a csomĂłpont indĂ­tĂĄsakor van megadva, Ă©s nem vĂĄltoztathatĂł meg kĂ©sƑbbi szakaszokban; a lap mĂ©retĂ©nek kettƑ hatvĂĄnyĂĄnak kell lennie, Ă©s meg kell egyeznie a fĂĄjlrendszer blokk mĂ©retĂ©vel. A lapok szĂŒksĂ©g szerint, lemezrƑl kerĂŒlnek betöltĂ©sre a RAM-ba, Ă©s a lemezen lĂ©vƑ adatmennyisĂ©g meghaladhatja a lefoglalt RAM mennyisĂ©gĂ©t. Ha a RAM-ban nem ĂĄll rendelkezĂ©sre elegendƑ hely egy lap betöltĂ©sĂ©hez, a rĂ©gi, mĂĄr nem hasznĂĄlt lapok kerĂŒlnek ki a RAM-bĂłl.

A lemezen az adatok a következƑ formĂĄtumban tĂĄrolĂłdnak: minden cache-csoporthoz kĂŒlön fĂĄjl kĂ©szĂŒl, ebben a fĂĄjlban, a növekvƑ index sorrendjĂ©ben egybeesnek a lapok. A teljes lapazonosĂ­tĂł tartalmazza a cache-csoport azonosĂ­tĂłjĂĄt, a partĂ­ciĂł szĂĄmĂĄt Ă©s a lap indexĂ©t a fĂĄjlban. Így a teljes lapazonosĂ­tĂł alapjĂĄn egyĂ©rtelmƱen azonosĂ­thatjuk a fĂĄjlt Ă©s a fĂĄjlban lĂ©vƑ offsetet minden lap szĂĄmĂĄra. A lapozott memĂłria felĂ©pĂ­tĂ©sĂ©rƑl bƑvebben olvashat a Apache Ignite Wiki-ban: Ignite Persistent Store — a hĂĄttĂ©rben.

A lemez oldalmĂ©retƱ tömörĂ­tĂ©si mechanizmusa, ahogy az a nevĂ©bƑl is kiderĂŒl, az oldal szintjĂ©n mƱködik. Ennek a mechanizmusnak a bekapcsolĂĄsĂĄval a RAM-ban vĂ©gzett adatkezelĂ©s Ășgy törtĂ©nik, ahogy van, bĂĄrmifĂ©le tömörĂ­tĂ©s nĂ©lkĂŒl, de amikor az oldalakat a RAM-bĂłl a lemezre mentjĂŒk, vĂ©gbemegy a tömörĂ­tĂ©s.

De minden egyes oldal kĂŒlön-kĂŒlön törtĂ©nƑ tömörĂ­tĂ©se mĂ©g nem oldja meg a problĂ©mĂĄt, valahogy csökkenteni kell a vĂ©gsƑ adatfĂĄjlok mĂ©retĂ©t. Ha az oldal mĂ©rete nem fixĂĄlt, akkor mĂĄr nem tudjuk az oldalakat egyesĂ©vel a fĂĄjlba Ă­rni, mert ez egy sor problĂ©mĂĄt okozhat:

  • Nem tudjuk az oldal indexĂ©vel kiszĂĄmĂ­tani az offsetet, ahol az a fĂĄjlban talĂĄlhatĂł.
  • Nem vilĂĄgos, hogy mit tegyĂŒnk azokkal az oldalakkal, amelyek nem a fĂĄjl vĂ©gĂ©n helyezkednek el, Ă©s amelyek mĂ©rete vĂĄltozik. Ha az oldal mĂ©rete csökken, akkor a felszabadĂ­tott hely eltƱnik. Ha az oldal mĂ©rete növekszik, akkor mĂĄr Ășj helyet kell keresni a fĂĄjlban.
  • Ha az oldal a fĂĄjlrendszer blokk mĂ©retĂ©hez nem többszörös szĂĄmĂ­tĂĄssal elmozdul, akkor annak olvasĂĄsĂĄhoz vagy Ă­rĂĄsĂĄhoz egy blokk fĂĄjlrendszert is Ă©rinteni kell, ami teljesĂ­tmĂ©nycsökkenĂ©shez vezethet.

Annak Ă©rdekĂ©ben, hogy ezeket a problĂ©mĂĄkat ne kelljen önĂĄllĂłan megoldani, a disk page compression az Apache Ignite-ban a fĂĄjlrendszer egy mechanizmusĂĄt hasznĂĄlja, amelyet sparse fĂĄjloknak nevezĂŒnk. A sparse (ritka) fĂĄjl olyan fĂĄjl, amelyben a nullĂĄkkal kitöltött terĂŒletek „lyukkĂ©nt” jelölhetƑk. Ezzel a fĂĄjlrendszer blokkjai nem kerĂŒlnek tĂĄrolĂĄsra ezekhez a lyukakhoz, ezzel helyet takarĂ­tva meg a lemezen.

Logikus, hogy ahhoz, hogy egy fĂĄjlrendszer blokkot felszabadĂ­tsunk, a lyuk mĂ©retĂ©nek nagyobbnak vagy egyenlƑnek kell lennie a fĂĄjlrendszer blokk mĂ©retĂ©vel, ami tovĂĄbbi korlĂĄtozĂĄst jelent az Apache Ignite oldalmĂ©retĂ©re: ahhoz, hogy a tömörĂ­tĂ©s valamilyen hatĂĄst gyakoroljon, az oldal mĂ©retĂ©nek mindenkĂ©ppen nagyobbnak kell lennie a fĂĄjlrendszer blokk mĂ©retĂ©nĂ©l. Ha az oldalmĂ©ret megegyezik a blokk mĂ©retĂ©vel, soha nem tudunk felszabadĂ­tani egyetlen blokkot sem, mivel ahhoz, hogy egyetlen blokkot felszabadĂ­tsunk, a tömörĂ­tett oldalnak 0 bĂĄjtnak kell lennie. Ha az oldal mĂ©rete 2 vagy 4 blokk mĂ©retĂ©vel egyezik meg, akkor mĂĄr legalĂĄbb egy blokkot felszabadĂ­thatunk, ha az oldalunk legalĂĄbb 50%-kal vagy 75%-kal tömörĂŒl.

TehĂĄt a mechanizmus mƱködĂ©sĂ©nek vĂ©gsƑ leĂ­rĂĄsa a következƑ: Amikor egy oldalt leĂ­runk a lemezre, megprĂłbĂĄljuk tömörĂ­teni az oldalt. Ha a tömörĂ­tett oldal mĂ©rete lehetƑvĂ© teszi, hogy egy vagy több fĂĄjlrendszer blokk szabaduljon fel, az oldal tömörĂ­tett formĂĄban kerĂŒl rögzĂ­tĂ©sre, a felszabadĂ­tott blokkok helyĂ©n pedig „lyuk” keletkezik (rendszervhĂ­vĂĄs törtĂ©nik a "punch hole" cĂ­mkĂ©vel). fallocate() Ha a tömörĂ­tett oldal mĂ©rete nem teszi lehetƑvĂ© a blokkok felszabadĂ­tĂĄsĂĄt, az oldal vĂĄltozatlan formĂĄban, tömörĂ­tetlenĂŒl kerĂŒl mentĂ©sre. Minden oldal offsetjei ugyanĂșgy szĂĄmĂ­tĂłdnak, mint tömörĂ­tĂ©s nĂ©lkĂŒl, az oldal indexĂ©nek Ă©s az oldal mĂ©retĂ©nek szorzatakĂ©nt. Oldalak relokĂĄciĂłjĂĄra nincs szĂŒksĂ©g. Az oldalak offsetjei, mĂ©g tömörĂ­tĂ©s nĂ©lkĂŒl, a fĂĄjlrendszer blokkjainak hatĂĄrain Ă©rkeznek.

Adatok tömörítése Apache Ignite-ban. A Sber tapasztalatai

A jelenlegi Ignite implementåció csak Linux operåciós rendszer alatt képes sparse fåjlokkal dolgozni, így a disk page compression csak ezen operåciós rendszer hasznålatåval kapcsolható be.

A disk page compressionhoz hasznĂĄlhatĂł tömörĂ­tĂ©si algoritmusok: ZSTD, LZ4, Snappy. Ezen kĂ­vĂŒl lĂ©tezik egy ĂŒzemmĂłd (SKIP_GARBAGE), amelyben csak a lapban nem hasznĂĄlt helyet dobjuk el anĂ©lkĂŒl, hogy a fennmaradĂł adatokon tömörĂ­tĂ©st alkalmaznĂĄnk, ami csökkenti a CPU terhelĂ©sĂ©t a fent emlĂ­tett algoritmusokhoz kĂ©pest.

Hatås a teljesítményre

Sajnos a tĂ©nyleges teljesĂ­tmĂ©nymĂ©rĂ©seket valĂłs környezetben nem vĂ©geztem, mivel nem tervezzĂŒk, hogy ezt a mechanizmust a termelĂ©sben hasznĂĄljuk, de teoretikusan el lehet gondolkodni, hogy hol veszĂ­tĂŒnk Ă©s hol nyerĂŒnk.

Ehhez emlĂ©keznĂŒnk kell arra, hogyan törtĂ©nik az oldalak olvasĂĄsa Ă©s Ă­rĂĄsa a hozzĂĄfĂ©rĂ©s sorĂĄn:

  • OlvasĂĄsi mƱvelet vĂ©grehajtĂĄsakor elƑször a RAM-ban keresik az oldalt, ha a keresĂ©s nem sikeres, az oldal a lemezrƑl betöltƑdik a RAM-ba abban a folyamatban, amelyik az olvasĂĄst vĂ©gzi.
  • ÍrĂĄsi mƱvelet vĂ©grehajtĂĄsakor az oldal a RAM-ban piszkoskĂ©nt van megjelölve, ĂĄm az oldal fizikailag nem kerĂŒl azonnal mentĂ©sre a lemezre abban a folyamatban, amelyik az Ă­rĂĄst vĂ©gzi. Minden piszkos oldal kĂ©sƑbb, egy checkpoint sorĂĄn kĂŒlön folyamatok ĂĄltal kerĂŒl a lemezre mentĂ©sre.

Tehåt a hatås az olvasåsi mƱveletekre:

  • PozitĂ­v (disk IO), a fĂĄjlrendszer blokkjainak olvasott szĂĄmĂĄnak csökkentĂ©se rĂ©vĂ©n.
  • NegatĂ­v hatĂĄs (CPU), a sparse fĂĄjlokkal valĂł munka sorĂĄn a mƱködĂ©shez szĂŒksĂ©ges tovĂĄbbi terhelĂ©s miatt. LehetsĂ©ges, hogy itt implicit mĂłdon tovĂĄbbi IO mƱveletek is megjelennek a sparse fĂĄjlok bonyolultabb struktĂșrĂĄjĂĄnak mentĂ©sĂ©hez (sajnĂĄlom, de nem ismerem rĂ©szletesen a sparse fĂĄjlok mƱködĂ©sĂ©t).
  • NegatĂ­v hatĂĄs (CPU), a lapok dekompressziĂłjĂĄnak szĂŒksĂ©gessĂ©ge miatt.
  • Nincs hatĂĄs a Ă­rĂĄsi mƱveletekre.
  • HatĂĄs a checkpoint folyamatra (itt minden hasonlĂł a beolvasĂĄsi mƱveletekhez):
  • PozitĂ­v hatĂĄs (disk IO), a fĂĄjlrendszerre Ă­rt blokkok szĂĄmĂĄnak csökkentĂ©se miatt.
  • NegatĂ­v hatĂĄs (CPU, esetleg disk IO), a sparse fĂĄjlokkal valĂł munka miatt.
  • NegatĂ­v hatĂĄs (CPU), a lapok tömörĂ­tĂ©sĂ©nek szĂŒksĂ©gessĂ©ge miatt.

Melyik serpenyƑ fog dominĂĄlni? Ez nagyon az környezettƑl fĂŒgg, de hajlok arra, hogy a disk page compression a legtöbb rendszeren inkĂĄbb teljesĂ­tmĂ©nyromlĂĄshoz vezet. RĂĄadĂĄsul mĂĄs adatbĂĄzis-kezelƑk tesztjei, amelyek hasonlĂł megközelĂ­tĂ©st hasznĂĄlnak sparse fĂĄjlokkal, teljesĂ­tmĂ©nycsökkenĂ©st mutatnak a tömörĂ­tĂ©s bekapcsolĂĄsakor.

Hogyan lehet bekapcsolni és beållítani.

Ahogy fentebb mĂĄr emlĂ­tettĂŒk, az Apache Ignite minimĂĄlis verziĂłja, amely tĂĄmogatja a disk page compression-t: 2.8 Ă©s csak Linux operĂĄciĂłs rendszeren tĂĄmogatott. A bekapcsolĂĄs Ă©s beĂĄllĂ­tĂĄs a következƑkĂ©ppen törtĂ©nik:

  • A class-path-ban kell, hogy legyen az ignite-compression modul. AlapĂ©rtelmezĂ©s szerint az Apache Ignite disztribĂșciĂłjĂĄban a libs/optional könyvtĂĄrban talĂĄlhatĂł Ă©s nincs ĐČĐșĐ»ŃŽŃ‡Đ”Đœ a class-path-ba. EgyszerƱen ĂĄthelyezheti a könyvtĂĄrat egy szinttel feljebb a libs-be, Ă©s akkor az ignite.sh futtatĂĄsakor automatikusan be fog kapcsolĂłdni.
  • A PersistenciĂĄnak be kell kapcsolva lennie (Bekapcsolva a DataRegionConfiguration.setPersistenceEnabled(true)).
  • Az oldal mĂ©retĂ©nek nagyobbnak kell lennie, mint a fĂĄjlrendszer blokkmĂ©rete (beĂĄllĂ­thatĂł a DataStorageConfiguration.setPageSize() ).
  • Minden cache esetĂ©ben, amelynek adatait tömörĂ­teni kell, a konfigurĂĄciĂłban be kell ĂĄllĂ­tani a tömörĂ­tĂ©si mĂłdszert Ă©s (opcionĂĄlisan) a tömörĂ­tĂ©si szintet (mĂłdszerek CacheConfiguration.setDiskPageCompression(), CacheConfiguration.setDiskPageCompressionLevel()).

WAL tömörítés

Hogyan mƱködik ez

Mi az a WAL Ă©s mire jĂł? Nagyon röviden: ez egy naplĂł, amelybe minden olyan esemĂ©ny bekerĂŒl, ami vĂ©gĂŒl megvĂĄltoztatja az oldal alapĂș tĂĄrolĂłt. ElsƑsorban a visszaĂĄllĂ­tĂĄs lehetƑsĂ©ge miatt szĂŒksĂ©ges, ha bekövetkezik egy hiba. MielƑtt bĂĄrmely mƱvelet ĂĄtadnĂĄ a vezĂ©rlĂ©st a felhasznĂĄlĂłnak, elƑször fel kell jegyeznie az esemĂ©nyt a WAL-ban, hogy a hiba esetĂ©n kĂ©pes legyen visszajĂĄtszani a naplĂł alapjĂĄn, Ă©s helyreĂĄllĂ­tani a sikeres vĂĄlaszokat, mĂ©g akkor is, ha ezek a mƱveletek mĂ©g nem tĂŒkrözƑdtek az oldal alapĂș tĂĄrolĂłn a lemezen (feljebb mĂĄr emlĂ­tĂ©sre kerĂŒlt, hogy az oldal alapĂș tĂĄrolĂłra törtĂ©nƑ tĂ©nyleges Ă­rĂĄs a „csomĂłpont” nevƱ folyamat sorĂĄn törtĂ©nik, mely kĂ©sleltetve törtĂ©nik kĂŒlön folyamatok ĂĄltal).

A WAL-ban lĂ©vƑ bejegyzĂ©sek logikai Ă©s fizikai kategĂłriĂĄkra oszthatĂłk. A logikai bejegyzĂ©sek maguk a kulcsok Ă©s Ă©rtĂ©kek. A fizikai bejegyzĂ©sek az oldal alapĂș tĂĄrolĂł vĂĄltozĂĄsait tĂŒkrözik. MĂ­g a logikai bejegyzĂ©sek mĂĄs esetekben is hasznosak lehetnek, a fizikai bejegyzĂ©sek kizĂĄrĂłlag a hiba esetĂ©n törtĂ©nt helyreĂĄllĂ­tĂĄsra szolgĂĄlnak, Ă©s csak az utolsĂł sikeres csomĂłpont Ăłta szĂŒksĂ©gesek. Itt nem merĂŒlĂŒnk el a rĂ©szletekben, Ă©s nem magyarĂĄzzuk el, hogy miĂ©rt mƱködik Ă­gy, de aki Ă©rdeklƑdik, az hivatkozhat az Apache Ignite Wiki mĂĄr emlĂ­tett cikkĂ©re: Ignite Persistent Store — a hĂĄttĂ©rben.

Egy logikai bejegyzĂ©shez gyakran több fizikai bejegyzĂ©s tartozik. Azaz pĂ©ldĂĄul egy put mƱvelet a gyorsĂ­tĂłtĂĄrban több oldalra vonatkozik az oldal alapĂș memĂłriĂĄban (az adatokhoz tartozĂł oldal, az index oldalai, a free-list oldalak). NĂ©hĂĄny szintetikus teszt sorĂĄn megĂĄllapĂ­tottam, hogy a fizikai bejegyzĂ©sek a WAL fĂĄjl mĂ©retĂ©nek akĂĄr 90%-ĂĄt is kitehetik. Eközben nagyon rövid ideig szĂŒksĂ©gesek (alapĂ©rtelmezetten a csomĂłpontok közötti intervallum 3 perc). Logikus lenne, hogy ezektƑl az adatoktĂłl, miutĂĄn elveszĂ­tik aktualitĂĄsukat, megszabaduljunk. Ezt vĂ©gzi a WAL tömörĂ­tĂ©si mechanizmus, amely eltĂĄvolĂ­tja a fizikai bejegyzĂ©seket, Ă©s a zip segĂ­tsĂ©gĂ©vel tömörĂ­ti a megmaradt logikai bejegyzĂ©seket, ezĂĄltal a fĂĄjl mĂ©rete jelentƑsen csökken (nĂ©ha akĂĄr tĂ­zszeresĂ©re).

A WAL fizikailag több, ĂĄllandĂł mĂ©retƱ (alapĂ©rtelmezett 64MB) szegmenst tartalmaz (alapĂ©rtelmezett 10), amelyek körkörösen felĂŒlĂ­rĂłdnak. Amint a jelenlegi szegmens megtelik, a következƑ szegmens kerĂŒl kijelölĂ©sre, mĂ­g a megtelt szegmens egy kĂŒlön szĂĄlon archĂ­vĂĄlĂĄsra kerĂŒl. A WAL tömörĂ­tĂ©se mĂĄr mƱködik az archĂ­v szegmensekkel. Egy kĂŒlön szĂĄl a checkpoint vĂ©grehajtĂĄsĂĄt is nyomon követi, Ă©s megkezdi a tömörĂ­tĂ©st az archĂ­v szegmensek esetĂ©ben, amelyekre mĂĄr nincs szĂŒksĂ©g fizikailag.

Adatok tömörítése Apache Ignite-ban. A Sber tapasztalatai

Hatås a teljesítményre

Mivel a WAL tömörĂ­tĂ©se kĂŒlön szĂĄlon mƱködik, közvetlen hatĂĄssal nem szabadna, hogy legyen a vĂ©grehajtott mƱveletekre. Ugyanakkor tovĂĄbbi hĂĄttĂ©rterhelĂ©st ad a CPU-ra (tömörĂ­tĂ©s) Ă©s a lemezre (minden WAL szegmens archivĂĄlĂĄsbĂłl valĂł olvasĂĄsa Ă©s a tömörĂ­tett szegmensek Ă­rĂĄsa), Ă­gy ha a rendszer a kapacitĂĄs hatĂĄrĂĄn mƱködik, teljesĂ­tmĂ©nyromlĂĄst is okozhat.

Hogyan lehet bekapcsolni és beållítani.

A WAL tömörĂ­tĂ©st a következƑ tulajdonsĂĄg hasznĂĄlatĂĄval lehet engedĂ©lyezni: WalCompactionEnabled be. DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). EzenkĂ­vĂŒl a DataStorageConfiguration.setWalCompactionLevel() metĂłdussal beĂĄllĂ­thatĂł a tömörĂ­tĂ©s mĂ©rtĂ©ke, ha az alapĂ©rtelmezett Ă©rtĂ©k (BEST_SPEED) nem megfelelƑ.

WAL oldal pillanatkép tömörítés

Hogyan mƱködik ez

KorĂĄbban mĂĄr megĂĄllapĂ­tottuk, hogy a WAL bejegyzĂ©sek logikai Ă©s fizikai tĂ­pusokra oszlanak. Minden egyes vĂĄltozĂĄsnĂĄl az oldal memĂłriĂĄjĂĄban fizikai WAL bejegyzĂ©s keletkezik. A fizikai bejegyzĂ©sek viszont kĂ©t alkategĂłriĂĄra is oszthatĂłk: page snapshot record Ă©s delta record. Minden alkalommal, amikor vĂĄltoztatunk az oldalon, Ă©s tiszta ĂĄllapotĂĄbĂłl piszkos ĂĄllapotĂĄba fordĂ­tjuk, a WAL-ban egy teljes mĂĄsolatot tĂĄrolunk errƑl az oldalrĂłl (page snapshot record — az oldal pillanatkĂ©pe). MĂ©g ha csak egy bĂĄjtot is vĂĄltoztatunk, a WAL egy, az oldal mĂ©retĂ©nĂ©l kissĂ© nagyobb bejegyzĂ©st tĂĄrol. Ha viszont mĂĄr egy piszkos oldalon vĂĄltoztatunk, a WAL-ban delta record keletkezik, amely csak a korĂĄbbi ĂĄllapothoz viszonyĂ­tott vĂĄltoztatĂĄsokat tartalmazza, nem az egĂ©sz oldalt. Mivel a piszkos ĂĄllapotĂș oldalak tisztĂĄra törtĂ©nƑ visszaĂĄllĂ­tĂĄsa a checkpoint folyamat sorĂĄn törtĂ©nik, a checkpoint kezdetĂ©n gyakorlatilag az összes fizikai bejegyzĂ©s csak az oldal pillanatkĂ©peibƑl ĂĄll (mivel az összes oldal a checkpoint kezdetĂ©n tiszta), majd a következƑ checkpoint felĂ© haladva a delta recordok arĂĄnya növekedni kezd, Ă©s ismĂ©t visszaĂĄll a következƑ checkpoint kezdetĂ©n. NĂ©hĂĄny szintetikus teszt mĂ©rĂ©sei azt mutattĂĄk, hogy az oldal pillanatkĂ©peinek arĂĄnya a teljes fizikai bejegyzĂ©sek körĂ©ben elĂ©rheti a 90%-ot.

A WAL page snapshot compression lĂ©nyege, hogy az oldal pillanatkĂ©peit a mĂĄr meglĂ©vƑ oldal tömörĂ­tĂ©si eszköz hasznĂĄlatĂĄval tömörĂ­tjĂŒk (lĂĄsd disk page compression). Ebben az esetben a WAL bejegyzĂ©sek sorban, append-only mĂłdban kerĂŒlnek tĂĄrolĂĄsra, Ă©s nincs szĂŒksĂ©g a bejegyzĂ©sek fĂĄjlrendszer blokkjainak hatĂĄraihoz törtĂ©nƑ kötĂ©sĂ©re, ezĂ©rt itt, ellentĂ©tben a disk page compression mechanizmussal, egyĂĄltalĂĄn nem szĂŒksĂ©gesek sparse fĂĄjlok, Ă­gy ez a mechanizmus nem csupĂĄn Linux operĂĄciĂłs rendszeren fog mƱködni. TovĂĄbbĂĄ, mĂĄr nem szĂĄmĂ­t, hogy mennyire tudtuk tömörĂ­teni az oldalt. MĂ©g ha csak 1 bĂĄjtot is felszabadĂ­tottunk, az mĂĄr egy pozitĂ­v eredmĂ©ny, Ă©s a WAL-ban eltĂĄrolhatjuk a tömörĂ­tett adatokat, ellentĂ©tben a disk page compression-nel, ahol a tömörĂ­tett oldalt csak akkor mentjĂŒk el, ha több mint 1 fĂĄjlrendszer blokkot szabadĂ­tottunk fel.

Az oldalak jĂłl tömörĂ­thetƑ adatok, rĂ©szarĂĄnyuk a WAL összes mennyisĂ©gĂ©ben nagyon magas, Ă­gy a WAL fĂĄjl formĂĄtumĂĄnak megvĂĄltoztatĂĄsa nĂ©lkĂŒl jelentƑs mĂ©retcsökkentĂ©st Ă©rhetĂŒnk el. A logikai bejegyzĂ©sek tömörĂ­tĂ©se formĂĄtumvĂĄltoztatĂĄst Ă©s kompatibilitĂĄs elvesztĂ©sĂ©t igĂ©nyelnĂ©, pĂ©ldĂĄul a kĂŒlsƑ felhasznĂĄlĂłk szĂĄmĂĄra, akiket a logikai bejegyzĂ©sek Ă©rdekelhetnek, ugyanakkor nem hozna jelentƑs csökkenĂ©st a fĂĄjl mĂ©retĂ©ben.

A WAL oldal pillanatfelvétel tömörítéshez, akårcsak a lemezoldal tömörítéshez, a ZSTD, LZ4, Snappy tömörítési algoritmusok, valamint a SKIP_GARBAGE mód hasznålható.

Hatås a teljesítményre

Mint könnyen Ă©szlelhetƑ, a WAL oldal pillanatfelvĂ©tel tömörĂ­tĂ©s közvetlen aktivĂĄlĂĄsa csak azokra a szĂĄlakra hat, amelyek adatokat Ă­rnak a lapmemĂłriĂĄba, azaz azokra, amelyek mĂłdosĂ­tjĂĄk az adatokat a gyorsĂ­tĂłtĂĄrakban. A WAL fizikai bejegyzĂ©sekbƑl valĂł olvasĂĄs csak egyszeri alkalommal törtĂ©nik, a csomĂłpont leĂĄllĂĄsĂĄt követƑen (Ă©s csak ha a leĂĄllĂĄs a checkpoint folyamatĂĄban törtĂ©nt).

Ez a szĂĄlakra, amelyek adatokat mĂłdosĂ­tanak, a következƑ mĂłdon hat: negatĂ­v hatĂĄst (CPU) okoz, mivel minden alkalommal tömörĂ­teni kell az oldalt, mielƑtt az lemezre kerĂŒl, Ă©s pozitĂ­v hatĂĄst (diszk IO) a Ă­randĂł adatok mennyisĂ©gĂ©nek csökkentĂ©sĂ©vel. Itt tehĂĄt minden egyszerƱ: ha a rendszer teljesĂ­tmĂ©nye a CPU ĂĄltal kihĂ­vott, kis mĂ©rtĂ©kƱ degradĂĄciĂłt tapasztalunk, ha a lemez Ă­rĂĄs/olvashatĂłsĂĄga, akkor növekedĂ©st.

Közvetetten a WAL méretének csökkentése szintén (pozitívan) hat azokra a szålakra, amelyek a WAL szegmenseit archivåljåk, és a WAL tömörítési szålakra.

ValĂłs teljesĂ­tmĂ©nytesztek a környezetĂŒnkben szintetikus adatokon kis növekedĂ©st mutattak (a throughput 10%-15%-kal nƑtt, a latencia 10%-15%-kal csökkent).

Hogyan lehet bekapcsolni és beållítani.

Az Apache Ignite minimĂĄlis verziĂłja: 2.8. A bekapcsolĂĄs Ă©s beĂĄllĂ­tĂĄs a következƑ mĂłdon törtĂ©nik:

  • A class-path-ban kell, hogy legyen az ignite-compression modul. AlapĂ©rtelmezĂ©s szerint az Apache Ignite disztribĂșciĂłjĂĄban a libs/optional könyvtĂĄrban talĂĄlhatĂł Ă©s nincs ĐČĐșĐ»ŃŽŃ‡Đ”Đœ a class-path-ba. EgyszerƱen ĂĄthelyezheti a könyvtĂĄrat egy szinttel feljebb a libs-be, Ă©s akkor az ignite.sh futtatĂĄsakor automatikusan be fog kapcsolĂłdni.
  • A PersistenciĂĄnak be kell kapcsolva lennie (Bekapcsolva a DataRegionConfiguration.setPersistenceEnabled(true)).
  • A tömörĂ­tĂ©si mĂłdot a következƑ metĂłdussal kell megadni DataStorageConfiguration.setWalPageCompression(), alapĂ©rtelmezĂ©s szerint a tömörĂ­tĂ©s ki van kapcsolva (DISABLED mĂłd).
  • OpcionĂĄlisan megadhatjuk a tömörĂ­tĂ©s mĂ©rtĂ©kĂ©t a következƑ metĂłdussal DataStorageConfiguration.setWalPageCompression(), a megengedett Ă©rtĂ©kek minden egyes mĂłdszerhez a metĂłdus javadocjĂĄban talĂĄlhatĂłk.

ZĂĄrĂĄs

Az Apache Ignite-ban tĂĄrgyalt adattömörĂ­tĂ©si mechanizmusok fĂŒggetlenĂŒl is hasznĂĄlhatĂłk, de bĂĄrmilyen kombinĂĄciĂłjuk is megengedett. Az elvĂŒk megĂ©rtĂ©se lehetƑvĂ© teszi, hogy meghatĂĄrozzuk, mennyire felelnek meg a feladatainknak a környezetĂŒnkben, Ă©s mivel kell kompromisszumot kötnĂŒnk a hasznĂĄlatuk sorĂĄn. A lemezoldali tömörĂ­tĂ©s a fƑ tĂĄrolĂłnak a tömörĂ­tĂ©sĂ©re szolgĂĄl, Ă©s ĂĄtlagos tömörĂ­tĂ©si fokot biztosĂ­that. A WAL oldal pillanatfelvĂ©teli tömörĂ­tĂ©s ĂĄtlagos tömörĂ­tĂ©si fokot ad a WAL fĂĄjloknak, miközben valĂłszĂ­nƱleg mĂ©g a teljesĂ­tmĂ©nyt is javĂ­tja. A WAL tömörĂ­tĂ©s nem befolyĂĄsolja pozitĂ­van a teljesĂ­tmĂ©nyt, de maximĂĄlisan csökkenti a WAL fĂĄjlok mĂ©retĂ©t a fizikai rekordok eltĂĄvolĂ­tĂĄsĂĄval.

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster