Duomenų glaudinimas „Apache Ignite“. Sberio patirtis

Duomenų glaudinimas „Apache Ignite“. Sberio patirtisKai dirbate su dideliais duomenų kiekiais, kartais gali kilti disko vietos trūkumo problema. Vienas iš būdų išspręsti šią problemą yra suspaudimas, kurio dėka toje pačioje įrangoje galite sau leisti padidinti saugojimo apimtis. Šiame straipsnyje apžvelgsime, kaip duomenų glaudinimas veikia „Apache Ignite“. Šiame straipsnyje bus aprašyti tik gaminyje įdiegti disko glaudinimo metodai. Kiti duomenų glaudinimo būdai (tinkle, atmintyje), nesvarbu, ar jie įdiegti, ar ne, liks už taikymo srities ribų.

Taigi, įjungus patvarumo režimą, pasikeitus duomenų talpykloje, „Ignite“ pradeda rašyti į diską:

  1. Talpyklų turinys
  2. Write Ahead Log (toliau tiesiog WAL)

Jau gana seniai egzistuoja WAL suspaudimo mechanizmas, vadinamas WAL sutankinimu. Neseniai išleista Apache Ignite 2.8 pristatė dar du mechanizmus, leidžiančius suspausti duomenis diske: disko puslapių glaudinimą, skirtą talpyklų turiniui suspausti, ir WAL puslapio momentinių nuotraukų glaudinimą, skirtą kai kuriems WAL įrašams suspausti. Daugiau informacijos apie visus tris šiuos mechanizmus rasite toliau.

Disko puslapio suspaudimas

Kaip tai veikia

Pirmiausia labai trumpai pažvelkime į tai, kaip „Ignite“ saugo duomenis. Puslapio atmintis naudojama saugojimui. Puslapio dydis nustatomas mazgo pradžioje ir jo negalima keisti vėlesniuose etapuose; taip pat puslapio dydis turi būti du laipsniai ir failų sistemos bloko dydžio kartotinis. Puslapiai į RAM įkeliami iš disko pagal poreikį; diske esančių duomenų dydis gali viršyti skirtą RAM kiekį. Jei RAM neužtenka vietos įkelti puslapį iš disko, seni, nebenaudojami puslapiai bus iškeldinti iš RAM.

Duomenys diske saugomi tokia forma: kiekvienam kiekvienos talpyklos grupės skaidiniui sukuriamas atskiras failas, kuriame puslapiai vienas po kito rodomi didėjančia indekso tvarka. Visame puslapio identifikatoriuje yra talpyklos grupės identifikatorius, skaidinio numeris ir failo puslapio indeksas. Taigi, naudodami viso puslapio identifikatorių, galime unikaliai nustatyti failą ir kiekvieno puslapio poslinkį faile. Daugiau apie ieškos atmintį galite perskaityti Apache Ignite Wiki straipsnyje: Ignite Persistent Store – po gaubtu.

Disko puslapio glaudinimo mechanizmas, kaip galima atspėti iš pavadinimo, veikia puslapio lygiu. Kai šis mechanizmas įjungtas, duomenys RAM apdorojami tokie, kokie yra, be jokio suspaudimo, bet kai puslapiai išsaugomi iš RAM į diską, jie suglaudinami.

Tačiau kiekvieno puslapio suspaudimas atskirai nėra problemos sprendimas; reikia kažkaip sumažinti gaunamų duomenų failų dydį. Jei puslapio dydis nebefiksuotas, nebegalime rašyti puslapių į failą vienas po kito, nes tai gali sukelti daugybę problemų:

  • Naudodami puslapio indeksą negalėsime apskaičiuoti poslinkio, kuriuo jis yra faile.
  • Neaišku, ką daryti su puslapiais, kurių nėra failo pabaigoje, ir pakeisti jų dydį. Jei puslapio dydis sumažėja, jo atlaisvinta vieta išnyksta. Jei puslapio dydis padidėja, reikia ieškoti naujos vietos faile.
  • Jei puslapis juda baitų skaičiumi, kuris nėra failų sistemos bloko dydžio kartotinis, norint jį skaityti ar rašyti reikės paliesti dar vieną failų sistemos bloką, o tai gali pabloginti našumą.

Kad šios problemos neišspręstų savo lygmeniu, disko puslapių glaudinimas Apache Ignite naudoja failų sistemos mechanizmą, vadinamą retais failais. Retas failas yra toks, kuriame kai kurios nulio užpildytos sritys gali būti pažymėtos kaip „skylės“. Tokiu atveju failų sistemos blokai nebus skirti šioms skylėms saugoti, todėl sutaupoma vietos diske.

Logiška, kad norint atlaisvinti failų sistemos bloką, skylės dydis turi būti didesnis arba lygus failų sistemos blokui, o tai nustato papildomą puslapio dydžio ir Apache Ignite apribojimą: kad suspaudimas turėtų kokį nors poveikį, puslapio dydis turi būti griežtai didesnis nei failų sistemos bloko dydis. Jei puslapio dydis yra lygus bloko dydžiui, mes niekada negalėsime atlaisvinti vieno bloko, nes norint atlaisvinti vieną bloką, suspaustas puslapis turi užimti 0 baitų. Jei puslapio dydis lygus 2 ar 4 blokų dydžiui, jau galėsime atlaisvinti bent vieną bloką, jei mūsų puslapis bus suglaudintas atitinkamai bent 50% arba 75%.

Taigi, galutinis mechanizmo veikimo aprašymas: Rašant puslapį į diską, bandoma suspausti puslapį. Jei suspausto puslapio dydis leidžia atlaisvinti vieną ar daugiau failų sistemos blokų, tada puslapis rašomas suglaudinta forma, o vietoje atlaisvintų blokų padaroma „skylė“ (vykdomas sistemos iškvietimas fallocate() su skylės vėliava). Jei suspausto puslapio dydis neleidžia atlaisvinti blokų, puslapis išsaugomas toks, koks yra, nesuspaustas. Visi puslapių poslinkiai apskaičiuojami taip pat, kaip ir be suspaudimo, puslapių rodyklę padauginus iš puslapio dydžio. Nereikia savarankiškai perkelti puslapių. Puslapių poslinkiai, kaip ir be suspaudimo, patenka į failų sistemos blokų ribas.

Duomenų glaudinimas „Apache Ignite“. Sberio patirtis

Esant dabartiniam diegimui, „Ignite“ gali veikti tik su retais failais „Linux“ OS; atitinkamai disko puslapio glaudinimą galima įjungti tik naudojant „Ignite“ šioje operacinėje sistemoje.

Suspaudimo algoritmai, kuriuos galima naudoti disko puslapių glaudinimui: ZSTD, LZ4, Snappy. Be to, yra darbo režimas (SKIP_GARBAGE), kuriame išmeta tik nepanaudota vieta puslapyje, netaikant suspaudimo likusiems duomenims, o tai sumažina procesoriaus apkrovą, palyginti su anksčiau išvardytais algoritmais.

Poveikis našumui

Deja, realių eksploatacinių savybių matavimų ant tikrų stendų neatlikau, nes gamyboje šio mechanizmo naudoti neplanuojame, bet teoriškai galime spėlioti, kur pralaimėsime, o kur laimėsime.

Norėdami tai padaryti, turime atsiminti, kaip skaitomi ir rašomi puslapiai, kai pasiekiami:

  • Atliekant skaitymo operaciją, pirmiausia ieškoma RAM, o jei paieška nepavyksta, puslapis į RAM iš disko įkeliamas ta pačia gija, kuri atlieka nuskaitymą.
  • Kai atliekama rašymo operacija, puslapis RAM pažymimas kaip nešvarus, tačiau puslapis nėra fiziškai išsaugomas diske iš karto, kai rašoma gija. Visi nešvarūs puslapiai išsaugomi diske vėliau tikrinimo taško procese atskirose gijose.

Taigi įtaka skaitymo operacijoms yra tokia:

  • Teigiamas (disko IO), nes sumažėjo skaitomų failų sistemos blokų skaičius.
  • Neigiamas (CPU), dėl papildomos apkrovos, reikalingos operacinei sistemai dirbti su retais failais. Taip pat gali būti, kad čia netiesiogiai atsiras papildomos IO operacijos, kad būtų išsaugota sudėtingesnė reta failų struktūra (deja, nesu susipažinęs su visomis smulkmenomis, kaip veikia retieji failai).
  • Neigiamas (CPU), nes reikia išskleisti puslapius.
  • Nėra jokios įtakos rašymo operacijoms.
  • Poveikis kontrolinio taško procesui (čia viskas panašu į skaitymo operacijas):
  • Teigiamas (diskas IO), dėl sumažėjusio rašytinių failų sistemos blokų skaičiaus.
  • Neigiamas (CPU, galbūt disko IO), nes dirbama su retais failais.
  • Neigiamas (CPU), nes reikia suspausti puslapį.

Kuri svarstyklių pusė palenks svarstykles? Visa tai labai priklauso nuo aplinkos, tačiau esu linkęs manyti, kad disko puslapio suspaudimas greičiausiai pablogins daugelio sistemų našumą. Be to, kitų DBVS, naudojančių panašų metodą su retais failais, bandymai rodo, kad našumas sumažėja, kai įjungtas glaudinimas.

Kaip įjungti ir konfigūruoti

Kaip minėta pirmiau, minimali „Apache Ignite“ versija, palaikanti disko puslapio glaudinimą, yra 2.8 ir palaikoma tik „Linux“ operacinė sistema. Įjunkite ir sukonfigūruokite taip:

  • Klasės kelyje turi būti uždegimo suspaudimo modulis. Pagal numatytuosius nustatymus jis yra „Apache Ignite“ paskirstyme libs/neprivalomame kataloge ir nėra įtrauktas į klasės kelią. Galite tiesiog perkelti katalogą vienu lygiu į libs ir tada, kai paleisite jį per ignite.sh, jis bus automatiškai įjungtas.
  • Patvarumas turi būti įjungtas (Įjungta per DataRegionConfiguration.setPersistenceEnabled(true)).
  • Puslapio dydis turi būti didesnis nei failų sistemos bloko dydis (jį galite nustatyti naudodami DataStorageConfiguration.setPageSize() ).
  • Kiekvienai talpyklai, kurios duomenis reikia suspausti, turite sukonfigūruoti glaudinimo metodą ir (pasirinktinai) glaudinimo lygį (metodai CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

WAL tankinimas

Kaip tai veikia

Kas yra WAL ir kam jis reikalingas? Labai trumpai: tai žurnalas, kuriame yra visi įvykiai, kurie galiausiai pakeičia puslapio saugyklą. Jis reikalingas pirmiausia tam, kad būtų galima atsigauti kritimo atveju. Bet kokia operacija, prieš suteikiant valdymą vartotojui, pirmiausia turi įrašyti įvykį WAL, kad gedimo atveju jį būtų galima atkurti žurnale ir atkurti visas operacijas, į kurias vartotojas gavo sėkmingą atsakymą, net jei šios operacijos neturėjo laiko atsispindėti puslapio saugykloje diske (jau aukščiau buvo aprašyta, kad tikrasis įrašymas į puslapių saugyklą atliekamas procesu, vadinamu "kontroliniu tašku" su tam tikra uždelsimu atskiromis gijomis).

WAL įrašai skirstomi į loginius ir fizinius. Būlio reikšmės yra patys raktai ir vertybės. Fizinis – atspindi puslapio parduotuvės puslapių pakeitimus. Nors loginiai įrašai gali būti naudingi kai kuriais kitais atvejais, fiziniai įrašai reikalingi tik atkūrimui avarijos atveju, o įrašai reikalingi tik nuo paskutinio sėkmingo patikrinimo taško. Čia mes nesigilinsime į detales ir nepaaiškinsime, kodėl tai veikia taip, tačiau norintieji gali kreiptis į jau minėtą Apache Ignite Wiki straipsnį: Ignite Persistent Store – po gaubtu.

Viename loginiame įraše dažnai yra keli fiziniai įrašai. Tai yra, pavyzdžiui, viena įdėjimo į talpyklą operacija paveikia kelis puslapio atminties puslapius (puslapį su pačiais duomenimis, puslapius su indeksais, puslapius su laisvaisiais sąrašais). Kai kuriuose sintetiniuose testuose radau, kad fiziniai įrašai užėmė iki 90 % WAL failo. Tačiau jų reikia labai trumpai (pagal numatytuosius nustatymus intervalas tarp kontrolinių punktų yra 3 minutės). Būtų logiška šių duomenų atsikratyti praradus aktualumą. Būtent tai daro WAL sutankinimo mechanizmas: jis atsikrato fizinių įrašų ir suspaudžia likusius loginius įrašus naudodamas zip, o failo dydis labai sumažinamas (kartais dešimtis kartų).

Fiziškai WAL sudaro keli fiksuoto dydžio segmentai (pagal nutylėjimą 10) (pagal nutylėjimą 64 MB), kurie perrašomi apskritimu. Kai tik dabartinis segmentas užpildomas, kitas segmentas priskiriamas kaip dabartinis, o užpildytas segmentas atskira gija nukopijuojamas į archyvą. WAL tankinimas jau veikia su archyvo segmentais. Be to, kaip atskira gija, ji stebi kontrolinio taško vykdymą ir pradeda glaudinti archyvo segmentus, kuriems nebereikia fizinių įrašų.

Duomenų glaudinimas „Apache Ignite“. Sberio patirtis

Poveikis našumui

Kadangi WAL tankinimas vyksta kaip atskira sriegis, tai neturėtų turėti tiesioginės įtakos atliekamoms operacijoms. Tačiau tai vis tiek papildomai apkrauna centrinį procesorių (glaudinimą) ir diską (kiekvieno WAL segmento nuskaitymas iš archyvo ir suglaudintų segmentų rašymas), taigi, jei sistema veikia maksimaliu pajėgumu, tai taip pat sumažės našumas.

Kaip įjungti ir konfigūruoti

Naudodamiesi nuosavybe galite įjungti WAL tankinimą WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Be to, naudodamiesi DataStorageConfiguration.setWalCompactionLevel() metodu, galite nustatyti suspaudimo lygį, jei nesate patenkinti numatytoji reikšme (BEST_SPEED).

WAL puslapio momentinės nuotraukos suspaudimas

Kaip tai veikia

Jau išsiaiškinome, kad WAL įrašai skirstomi į loginius ir fizinius. Kiekvienam kiekvieno puslapio pakeitimui puslapio atmintyje sukuriamas fizinis WAL įrašas. Savo ruožtu fiziniai įrašai taip pat skirstomi į 2 potipius: puslapio momentinės nuotraukos įrašą ir delta įrašą. Kiekvieną kartą, kai ką nors keičiame puslapyje ir perkeliame jį iš švarios būsenos į nešvarią būseną, visa šio puslapio kopija išsaugoma WAL (puslapio momentinės nuotraukos įrašas). Net jei WAL pakeisime tik vieną baitą, įrašas bus šiek tiek didesnis nei puslapio dydis. Jei ką nors pakeičiame jau nešvariame puslapyje, tada WAL formuojamas delta įrašas, kuris atspindi tik pokyčius, palyginti su ankstesne puslapio būsena, bet ne visą puslapį. Kadangi puslapių būsena iš nešvarios į švarią atkuriama tikrinimo punkto proceso metu, iškart po patikros taško pradžios, beveik visi fiziniai įrašai susideda tik iš puslapių momentinių nuotraukų (nes visi puslapiai iš karto po patikros pradžios yra švarūs) , tada artėjant prie kito kontrolinio taško, delta įrašo trupmena pradeda augti ir vėl nustatoma iš naujo kito kontrolinio taško pradžioje. Kai kurių sintetinių testų matavimai parodė, kad puslapių momentinių vaizdų dalis bendroje fizinių įrašų apimtyje siekia 90%.

WAL puslapio momentinių kopijų glaudinimo idėja yra suspausti puslapių momentines nuotraukas naudojant paruoštą puslapių glaudinimo įrankį (žr. disko puslapio glaudinimą). Tuo pačiu metu WAL įrašai išsaugomi nuosekliai tik pridėjimo režimu ir nereikia susieti įrašų su failų sistemos blokų ribomis, todėl čia, skirtingai nei disko puslapių glaudinimo mechanizme, mums nereikia retų failų viskas; atitinkamai šis mechanizmas veiks ne tik OS Linux. Be to, mums nebesvarbu, kiek sugebėjome suspausti puslapį. Net jei atlaisvinome 1 baitą, tai jau yra teigiamas rezultatas ir suglaudintus duomenis galime išsaugoti WAL, skirtingai nuo disko puslapio suspaudimo, kai suglaudintą puslapį išsaugome tik tuo atveju, jei atlaisvinome daugiau nei 1 failų sistemos bloką.

Puslapiai yra labai suspaudžiami duomenys, jų dalis bendroje WAL apimtyje yra labai didelė, todėl nekeičiant WAL failo formato galime žymiai sumažinti jo dydį. Suglaudinant, įskaitant loginius įrašus, reikėtų pakeisti formatą ir prarasti suderinamumą, pavyzdžiui, išoriniams vartotojams, kurie gali būti suinteresuoti loginiais įrašais, tačiau failo dydis labai nesumažėtų.

Kaip ir disko puslapių glaudinimo atveju, WAL puslapio momentinės nuotraukos glaudinimas gali naudoti ZSTD, LZ4, Snappy glaudinimo algoritmus, taip pat SKIP_GARBAGE režimą.

Poveikis našumui

Nesunku pastebėti, kad tiesiogiai įjungus WAL puslapio momentinio vaizdo glaudinimą, paveikiamos tik gijos, kurios įrašo duomenis į puslapio atmintį, tai yra gijos, kurios keičia duomenis talpykloje. Fiziniai įrašai iš WAL nuskaitomi tik vieną kartą, tuo momentu, kai mazgas pakeliamas po kritimo (ir tik tuo atveju, jei nukrenta patikrinimo taško metu).

Tai paveikia gijas, kurios keičia duomenis tokiu būdu: gauname neigiamą efektą (CPU) dėl būtinybės kiekvieną kartą prieš rašant į diską suspausti puslapį ir teigiamą efektą (disko IO) dėl sumažėjusio įrašyti duomenys. Atitinkamai, čia viskas paprasta: jei sistemos našumą riboja CPU, gauname nedidelį pablogėjimą, jei riboja disko I/O, gauname padidėjimą.

Netiesiogiai WAL dydžio sumažinimas taip pat turi įtakos (teigiamai) srautams, kurie WAL segmentus išmeta į archyvą ir WAL tankinimo srautus.

Realūs našumo testai mūsų aplinkoje, naudojant sintetinius duomenis, parodė nedidelį padidėjimą (našumas padidėjo 10%-15%, delsa sumažėjo 10%-15%).

Kaip įjungti ir konfigūruoti

Minimali „Apache Ignite“ versija: 2.8. Įjunkite ir sukonfigūruokite taip:

  • Klasės kelyje turi būti uždegimo suspaudimo modulis. Pagal numatytuosius nustatymus jis yra „Apache Ignite“ paskirstyme libs/neprivalomame kataloge ir nėra įtrauktas į klasės kelią. Galite tiesiog perkelti katalogą vienu lygiu į libs ir tada, kai paleisite jį per ignite.sh, jis bus automatiškai įjungtas.
  • Patvarumas turi būti įjungtas (Įjungta per DataRegionConfiguration.setPersistenceEnabled(true)).
  • Suspaudimo režimas turi būti nustatytas naudojant metodą DataStorageConfiguration.setWalPageCompression(), glaudinimas pagal numatytuosius nustatymus yra išjungtas (išjungtas režimas).
  • Pasirinktinai galite nustatyti suspaudimo lygį naudodami metodą DataStorageConfiguration.setWalPageCompression(), žr. „Javadoc“, kur rasite kiekvieno režimo galiojančių verčių metodą.

išvada

Nagrinėjami „Apache Ignite“ duomenų glaudinimo mechanizmai gali būti naudojami nepriklausomai vienas nuo kito, tačiau bet koks jų derinys taip pat yra priimtinas. Suprasdami, kaip jie veikia, galėsite nustatyti, kiek jie tinka jūsų užduotims jūsų aplinkoje ir ką turėsite paaukoti juos naudodami. Disko puslapio glaudinimas skirtas pagrindinei saugyklai suspausti ir gali suteikti vidutinį glaudinimo laipsnį. WAL puslapio momentinės nuotraukos glaudinimas suteiks vidutinį WAL failų glaudinimo laipsnį ir greičiausiai netgi pagerins našumą. WAL sutankinimas neturės teigiamos įtakos našumui, tačiau kiek įmanoma sumažins WAL failų dydį, pašalindamas fizinius įrašus.

Šaltinis: www.habr.com

Добавить комментарий