Datu saspieŔana programmā Apache Ignite. Sber pieredze

Datu saspieÅ”ana programmā Apache Ignite. Sber pieredzeStrādājot ar lielu datu apjomu, dažkārt var rasties diska vietas trÅ«kuma problēma. Viens veids, kā atrisināt Å”o problēmu, ir saspieÅ”ana, pateicoties kurai vienā un tajā paŔā iekārtā jÅ«s varat atļauties palielināt uzglabāŔanas apjomu. Å ajā rakstā mēs apskatÄ«sim, kā Apache Ignite darbojas datu saspieÅ”ana. Å ajā rakstā tiks aprakstÄ«tas tikai produktā ieviestās diska saspieÅ”anas metodes. Citas datu saspieÅ”anas metodes (tÄ«klā, atmiņā), neatkarÄ«gi no tā, vai tās ir ieviestas vai nav, paliks ārpus darbÄ«bas jomas.

Tātad, ja ir iespējots noturÄ«bas režīms, keÅ”atmiņā esoÅ”o datu izmaiņu rezultātā Ignite sāk rakstÄ«t diskā:

  1. KeÅ”atmiņu saturs
  2. Rakstīt iepriekŔ žurnālu (turpmāk vienkārŔi WAL)

Jau labu laiku pastāv WAL saspieÅ”anas mehānisms, ko sauc par WAL blÄ«vÄ“Å”anu. Nesen izlaistajā Apache Ignite 2.8 tika ieviesti vēl divi mehānismi, kas ļauj saspiest datus diskā: diska lapu saspieÅ”ana keÅ”atmiņas satura saspieÅ”anai un WAL lapas momentuzņēmuma saspieÅ”ana dažu WAL ierakstu saspieÅ”anai. PlaŔāka informācija par visiem trim Å”iem mehānismiem tālāk.

Diska lapas saspieŔana

Kā tas darbojas

Vispirms ļoti Ä«si apskatÄ«sim, kā Ignite glabā datus. Lapas atmiņa tiek izmantota glabāŔanai. Lapas lielums tiek iestatÄ«ts mezgla sākumā, un to nevar mainÄ«t vēlākos posmos; arÄ« lapas izmēram ir jābÅ«t pakāpē ar diviem un failu sistēmas bloka lieluma daudzkārtņiem. Lapas pēc vajadzÄ«bas tiek ielādētas RAM no diska; diskā esoÅ”o datu apjoms var pārsniegt pieŔķirtās RAM apjomu. Ja RAM nav pietiekami daudz vietas, lai ielādētu lapu no diska, vecās, vairs neizmantotās lapas tiks izliktas no RAM.

Dati tiek glabāti diskā Ŕādā formā: katras keÅ”atmiņas grupas katram nodalÄ«jumam tiek izveidots atseviŔķs fails, Å”ajā failā lapas tiek rādÄ«tas viena pēc otras augoŔā indeksa secÄ«bā. Pilns lapas identifikators satur keÅ”atmiņas grupas identifikatoru, nodalÄ«juma numuru un lappuses indeksu failā. Tādējādi, izmantojot pilnu lapas identifikatoru, mēs varam unikāli noteikt failu un nobÄ«di failā katrai lapai. Vairāk par peidžeru atmiņu varat lasÄ«t Apache Ignite Wiki rakstā: Ignite Persistent Store - zem pārsega.

Diska lapu saspieÅ”anas mehānisms, kā jÅ«s varētu nojaust pēc nosaukuma, darbojas lapas lÄ«menÄ«. Kad Å”is mehānisms ir iespējots, dati RAM tiek apstrādāti tādi, kādi tie ir, bez saspieÅ”anas, bet, kad lapas tiek saglabātas no RAM diskā, tās tiek saspiestas.

Bet katras lapas saspieÅ”ana atseviŔķi nav problēmas risinājums; jums ir kaut kā jāsamazina iegÅ«to datu failu lielums. Ja lapas izmērs vairs nav fiksēts, mēs vairs nevaram rakstÄ«t lapas failā vienu pēc otras, jo tas var radÄ«t vairākas problēmas:

  • Izmantojot lapas indeksu, mēs nevarēsim aprēķināt nobÄ«di, ar kādu tas atrodas failā.
  • Nav skaidrs, ko darÄ«t ar lapām, kas neatrodas faila beigās, un mainÄ«t to izmēru. Ja lapas izmērs samazinās, tā atbrÄ«votā vieta pazÅ«d. Ja lapas izmērs palielinās, jums ir jāmeklē jauna vieta failā.
  • Ja lapa pārvietojas par vairākiem baitiem, kas nav failu sistēmas bloka lieluma reizinājums, tad, lai to lasÄ«tu vai rakstÄ«tu, bÅ«s jāpieskaras vēl vienam failu sistēmas blokam, kas var izraisÄ«t veiktspējas pasliktināŔanos.

Lai izvairÄ«tos no Å”o problēmu risināŔanas savā lÄ«menÄ«, diska lapu saspieÅ”ana programmā Apache Ignite izmanto failu sistēmas mehānismu, ko sauc par retajiem failiem. Rets fails ir tāds, kurā dažus ar nulli aizpildÄ«tus reÄ£ionus var atzÄ«mēt kā "caurumus". Å ajā gadÄ«jumā failu sistēmas bloki netiks pieŔķirti Å”o caurumu glabāŔanai, tādējādi ietaupot diska vietu.

LoÄ£iski, ka, lai atbrÄ«votu failu sistēmas bloku, cauruma izmēram ir jābÅ«t lielākam vai vienādam ar failu sistēmas bloku, kas uzliek papildu ierobežojumu lapas izmēram un Apache Ignite: lai saspieÅ”anai bÅ«tu kāda ietekme, lapas izmēram jābÅ«t stingri lielākam par failu sistēmas bloka izmēru. Ja lapas izmērs ir vienāds ar bloka izmēru, mēs nekad nevarēsim atbrÄ«vot vienu bloku, jo, lai atbrÄ«votu vienu bloku, saspiestajai lapai ir jāaizņem 0 baiti. Ja lapas izmērs ir vienāds ar 2 vai 4 bloku izmēru, mēs jau varēsim atbrÄ«vot vismaz vienu bloku, ja mÅ«su lapa bÅ«s saspiesta attiecÄ«gi vismaz lÄ«dz 50% vai 75%.

LÄ«dz ar to galÄ«gais mehānisma darbÄ«bas apraksts: Rakstot lapu diskā, tiek mēģināts lapu saspiest. Ja saspiestās lapas izmērs ļauj atbrÄ«vot vienu vai vairākus failu sistēmas blokus, tad lapa tiek rakstÄ«ta saspiestā formā un atbrÄ«voto bloku vietā tiek izveidots ā€œcaurumsā€ (tiek izpildÄ«ts sistēmas izsaukums fallocate() ar caurumu karogu). Ja saspiestās lapas izmērs neļauj atbrÄ«vot blokus, lapa tiek saglabāta tāda, kāda tā ir, nesaspiesta. Visas lappuses nobÄ«des tiek aprēķinātas tāpat kā bez saspieÅ”anas, lapas indeksu reizinot ar lapas izmēru. Nav nepiecieÅ”ams patstāvÄ«gi pārvietot lapas. Lapu nobÄ«des, tāpat kā bez saspieÅ”anas, ietilpst failu sistēmas bloku robežās.

Datu saspieŔana programmā Apache Ignite. Sber pieredze

PaÅ”reizējā ievieÅ”anā Ignite var darboties tikai ar retajiem failiem operētājsistēmā Linux; attiecÄ«gi diska lapu saspieÅ”anu var iespējot tikai tad, ja Å”ajā operētājsistēmā izmantojat Ignite.

SaspieŔanas algoritmi, kurus var izmantot diska lapu saspieŔanai: ZSTD, LZ4, Snappy. Turklāt ir arī darbības režīms (SKIP_GARBAGE), kurā tiek izmesta tikai neizmantotā vieta lapā, neveicot kompresiju uz atlikuŔajiem datiem, kas samazina CPU slodzi, salīdzinot ar iepriekŔ uzskaitītajiem algoritmiem.

Ietekme uz veiktspēju

Diemžēl reālos veiktspējas mērÄ«jumus uz reāliem stendiem neveicu, jo Å”o mehānismu ražoÅ”anā izmantot neplānojam, taču teorētiski varam spriest, kur zaudēsim un kur uzvarēsim.

Lai to izdarītu, mums ir jāatceras, kā lapas tiek lasītas un rakstītas, kad tām piekļūst:

  • Veicot lasÄ«Å”anas darbÄ«bu, tā vispirms tiek meklēta RAM, ja meklÄ“Å”ana ir neveiksmÄ«ga, lapa tiek ielādēta RAM no diska ar to paÅ”u pavedienu, kas veic lasÄ«Å”anu.
  • Kad tiek veikta rakstÄ«Å”anas darbÄ«ba, lapa RAM tiek atzÄ«mēta kā netÄ«ra, bet pavediens, kas veic rakstÄ«Å”anu, lapa netiek fiziski saglabāta diskā uzreiz. Visas netÄ«rās lapas tiek saglabātas diskā vēlāk kontrolpunkta procesā atseviŔķos pavedienos.

Tātad ietekme uz lasīŔanas darbībām ir:

  • PozitÄ«vs (disks IO), jo ir samazinājies nolasÄ«to failu sistēmas bloku skaits.
  • NegatÄ«vs (CPU), jo operētājsistēmai nepiecieÅ”ama papildu slodze, lai strādātu ar retajiem failiem. Ir arÄ« iespējams, ka Å”eit netieÅ”i parādÄ«sies papildu IO darbÄ«bas, lai saglabātu sarežģītāku retu failu struktÅ«ru (diemžēl es neesmu pazÄ«stams ar visām detaļām par retu failu darbÄ«bu).
  • NegatÄ«vs (CPU), jo ir nepiecieÅ”ams atspiest lapas.
  • Tas neietekmē rakstÄ«Å”anas darbÄ«bas.
  • Ietekme uz kontrolpunkta procesu (Å”eit viss ir lÄ«dzÄ«gs lasÄ«Å”anas darbÄ«bām):
  • PozitÄ«vs (disks IO), jo ir samazinājies rakstÄ«to failu sistēmas bloku skaits.
  • NegatÄ«vs (CPU, iespējams, diska IO), jo strādājat ar retajiem failiem.
  • NegatÄ«vs (CPU), jo ir nepiecieÅ”ama lapas saspieÅ”ana.

Kura skalas puse nogāzÄ«s skalu? Tas viss ir ļoti atkarÄ«gs no vides, taču es sliecos uzskatÄ«t, ka diska lapu saspieÅ”ana, visticamāk, izraisÄ«s veiktspējas pasliktināŔanos lielākajā daļā sistēmu. Turklāt testi citās DBVS, kas izmanto lÄ«dzÄ«gu pieeju ar retajiem failiem, parāda veiktspējas kritumu, kad ir iespējota saspieÅ”ana.

Kā iespējot un konfigurēt

Kā minēts iepriekÅ”, Apache Ignite minimālā versija, kas atbalsta diska lapu saspieÅ”anu, ir 2.8, un tiek atbalstÄ«ta tikai operētājsistēma Linux. Iespējojiet un konfigurējiet Ŕādi:

  • Klases ceļā ir jābÅ«t aizdedzes saspieÅ”anas modulim. Pēc noklusējuma tas atrodas Apache Ignite izplatÄ«jumā libs/optional direktorijā un nav iekļauts klases ceļā. Varat vienkārÅ”i pārvietot direktoriju vienu lÄ«meni uz augÅ”u uz libs, un, palaižot to caur ignite.sh, tas tiks automātiski iespējots.
  • NoturÄ«bai ir jābÅ«t iespējotai (Iespējots, izmantojot DataRegionConfiguration.setPersistenceEnabled(true)).
  • Lapas izmēram jābÅ«t lielākam par failu sistēmas bloka izmēru (to var iestatÄ«t, izmantojot DataStorageConfiguration.setPageSize() ).
  • Katrai keÅ”atmiņai, kuras dati ir jāsaspiež, ir jākonfigurē saspieÅ”anas metode un (pēc izvēles) saspieÅ”anas lÄ«menis (metodes CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

WAL blīvēŔana

Kā tas darbojas

Kas ir WAL un kāpēc tas ir vajadzÄ«gs? Ä»oti Ä«si: Å”is ir žurnāls, kurā ir visi notikumi, kas galu galā maina lapas krātuvi. Tas galvenokārt ir nepiecieÅ”ams, lai varētu atgÅ«ties kritiena gadÄ«jumā. Jebkura darbÄ«ba, pirms lietotājam tiek dota kontrole, vispirms ir jāreÄ£istrē notikums WAL, lai kļūmes gadÄ«jumā to varētu atskaņot žurnālā un atjaunot visas darbÄ«bas, par kurām lietotājs saņēmis veiksmÄ«gu atbildi, pat ja Ŕīs darbÄ«bas nebija laika atspoguļoties lapas krātuvē diskā (jau iepriekÅ” Ir aprakstÄ«ts, ka faktiskā rakstÄ«Å”ana uz lapu krātuvi tiek veikta procesā, ko sauc par "kontrolpunktu" ar zināmu aizkavi, izmantojot atseviŔķus pavedienus).

WAL ieraksti ir sadalÄ«ti loÄ£iskajos un fiziskajos. BÅ«la vērtÄ«bas ir paÅ”as atslēgas un vērtÄ«bas. Fizisks ā€” atspoguļo izmaiņas lapu veikalā. Lai gan loÄ£iskie ieraksti var bÅ«t noderÄ«gi dažos citos gadÄ«jumos, fiziskie ieraksti ir nepiecieÅ”ami tikai atkopÅ”anai avārijas gadÄ«jumā, un ieraksti ir nepiecieÅ”ami tikai kopÅ” pēdējā veiksmÄ«gā kontrolpunkta. Å eit mēs neiedziļināsimies un nepaskaidrosim, kāpēc tas darbojas Ŕādi, bet interesenti var atsaukties uz jau minēto rakstu Apache Ignite Wiki: Ignite Persistent Store - zem pārsega.

Katrā loÄ£iskajā ierakstā bieži ir vairāki fiziski ieraksti. Tas ir, piemēram, viena ievietoÅ”anas operācija keÅ”atmiņā ietekmē vairākas lapas lapas atmiņā (lapa ar paÅ”iem datiem, lapas ar indeksiem, lapas ar brÄ«vajiem sarakstiem). Dažos sintētiskos testos es atklāju, ka fiziskie ieraksti aizņēma lÄ«dz pat 90% no WAL faila. Taču tie ir nepiecieÅ”ami ļoti Ä«su laiku (pēc noklusējuma intervāls starp kontrolpunktiem ir 3 minÅ«tes). BÅ«tu loÄ£iski atbrÄ«voties no Å”iem datiem pēc to aktualitātes zaudÄ“Å”anas. TieÅ”i to dara WAL blÄ«vÄ“Å”anas mehānisms: tas atbrÄ«vojas no fiziskajiem ierakstiem un saspiež atlikuÅ”os loÄ£iskos ierakstus, izmantojot zip, savukārt faila lielums tiek ļoti ievērojami samazināts (dažreiz desmitiem reižu).

Fiziski WAL sastāv no vairākiem fiksēta izmēra segmentiem (pēc noklusējuma 10) (pēc noklusējuma 64 MB), kas tiek pārrakstÄ«ti apļveida veidā. TiklÄ«dz paÅ”reizējais segments ir aizpildÄ«ts, nākamais segments tiek pieŔķirts kā paÅ”reizējais, un aizpildÄ«tais segments tiek kopēts arhÄ«vā ar atseviŔķu pavedienu. WAL blÄ«vÄ“Å”ana jau darbojas ar arhÄ«va segmentiem. Tāpat kā atseviŔķs pavediens tas uzrauga kontrolpunkta izpildi un sāk saspieÅ”anu arhÄ«va segmentos, kuriem fiziskie ieraksti vairs nav nepiecieÅ”ami.

Datu saspieŔana programmā Apache Ignite. Sber pieredze

Ietekme uz veiktspēju

Tā kā WAL blÄ«vÄ“Å”ana notiek kā atseviŔķs pavediens, tai nevajadzētu tieÅ”i ietekmēt veicamās darbÄ«bas. Bet tas joprojām rada papildu fona slodzi CPU (saspieÅ”anai) un diskam (nolasot katru WAL segmentu no arhÄ«va un rakstot saspiestos segmentus), tāpēc, ja sistēma darbojas ar maksimālo jaudu, tas arÄ« novedÄ«s pie veiktspējas pasliktināŔanās.

Kā iespējot un konfigurēt

Izmantojot Ä«paÅ”umu, varat iespējot WAL blÄ«vÄ“Å”anu WalCompactionEnabled Š² DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Turklāt, izmantojot metodi DataStorageConfiguration.setWalCompactionLevel(), varat iestatÄ«t saspieÅ”anas lÄ«meni, ja neesat apmierināts ar noklusējuma vērtÄ«bu (BEST_SPEED).

WAL lapas momentuzņēmuma saspieÅ”ana

Kā tas darbojas

Mēs jau esam noskaidrojuÅ”i, ka WAL ierakstus iedala loÄ£iskajos un fiziskajos. Katrai katras lapas izmaiņai lapas atmiņā tiek Ä£enerēts fizisks WAL ieraksts. Savukārt fiziskie ieraksti tiek iedalÄ«ti 2 apakÅ”tipos: lapas momentuzņēmuma ieraksts un delta ieraksts. Katru reizi, kad mēs kaut ko mainām lapā un pārceļam to no tÄ«ra stāvokļa uz netÄ«ro stāvokli, pilnÄ«ga Ŕīs lapas kopija tiek saglabāta WAL (lapas momentuzņēmuma ieraksts). Pat ja mēs mainÄ«jām tikai vienu baitu WAL, ieraksts bÅ«s nedaudz lielāks par lapas izmēru. Ja kaut ko mainām jau netÄ«rā lapā, WAL tiek izveidots delta ieraksts, kas atspoguļo tikai izmaiņas salÄ«dzinājumā ar iepriekŔējo lapas stāvokli, bet ne visu lapu. Tā kā lapu stāvokļa atiestatÄ«Å”ana no netÄ«ras uz tÄ«ru tiek veikta kontrolpunkta procesa laikā, tÅ«lÄ«t pēc kontrolpunkta sākuma gandrÄ«z visi fiziskie ieraksti sastāvēs tikai no lapu momentuzņēmumiem (jo visas lapas uzreiz pēc kontrolpunkta sākuma ir tÄ«ras) , tad, tuvojoties nākamajam kontrolpunktam, delta ieraksta daļa sāk augt un atkal atiestatÄ«t nākamā kontrolpunkta sākumā. MērÄ«jumi dažos sintētiskos testos parādÄ«ja, ka lapas momentuzņēmumu Ä«patsvars kopējā fizisko ierakstu apjomā sasniedz 90%.

WAL lapas momentuzņēmumu saspieÅ”anas ideja ir saspiest lapu momentuzņēmumus, izmantojot gatavu lapu saspieÅ”anas rÄ«ku (skatiet diska lapu saspieÅ”anu). Tajā paŔā laikā WAL ieraksti tiek saglabāti secÄ«gi tikai pievienoÅ”anas režīmā un nav nepiecieÅ”ams saistÄ«t ierakstus ar failu sistēmas bloku robežām, tāpēc Å”eit, atŔķirÄ«bā no diska lapu saspieÅ”anas mehānisma, mums nav nepiecieÅ”ami reti faili viss; attiecÄ«gi Å”is mehānisms darbosies ne tikai operētājsistēmā Linux. Turklāt mums vairs nav nozÄ«mes, cik ļoti mēs varējām lapu saspiest. Pat ja mēs atbrÄ«vojām 1 baitu, tas jau ir pozitÄ«vs rezultāts un mēs varam saglabāt saspiestos datus WAL, atŔķirÄ«bā no diska lapu saspieÅ”anas, kur mēs saglabājam saspiesto lapu tikai tad, ja atbrÄ«vojām vairāk nekā 1 failu sistēmas bloku.

Lapas ir ļoti saspiežami dati, to Ä«patsvars kopējā WAL apjomā ir ļoti liels, tāpēc, nemainot WAL faila formātu, varam iegÅ«t bÅ«tisku tā izmēra samazinājumu. SaspieÅ”anai, tostarp loÄ£iskiem ierakstiem, bÅ«tu jāmaina formāts un jāzaudē savietojamÄ«ba, piemēram, ārējiem patērētājiem, kurus varētu interesēt loÄ£iskie ieraksti, taču tas neradÄ«tu ievērojamu faila lieluma samazināŔanos.

Tāpat kā diska lapu saspieÅ”anā, WAL lapas momentuzņēmuma saspieÅ”anā var izmantot ZSTD, LZ4, Snappy saspieÅ”anas algoritmus, kā arÄ« režīmu SKIP_GARBAGE.

Ietekme uz veiktspēju

Nav grÅ«ti pamanÄ«t, ka tieÅ”a WAL lapas momentuzņēmuma saspieÅ”anas iespējoÅ”ana ietekmē tikai pavedienus, kas ieraksta datus lapas atmiņā, tas ir, tos pavedienus, kas maina datus keÅ”atmiņā. Fizisko ierakstu nolasÄ«Å”ana no WAL notiek tikai vienu reizi, brÄ«dÄ«, kad mezgls tiek pacelts pēc kritiena (un tikai tad, ja tas nokrÄ«t kontrolpunkta laikā).

Tas ietekmē pavedienus, kas maina datus Ŕādā veidā: mēs iegÅ«stam negatÄ«vu efektu (CPU), jo katru reizi pirms rakstÄ«Å”anas diskā ir jāsaspiež lapa, un pozitÄ«vu efektu (diska IO), jo tiek samazināts faila apjoms. uzrakstÄ«ti dati. AttiecÄ«gi Å”eit viss ir vienkārÅ”s: ja sistēmas veiktspēju ierobežo CPU, mēs iegÅ«stam nelielu degradāciju, ja to ierobežo diska I / O, mēs saņemam pieaugumu.

NetieÅ”i WAL izmēra samazināŔana ietekmē arÄ« (pozitÄ«vi) straumes, kas WAL segmentus izmet arhÄ«vā un WAL blÄ«vÄ“Å”anas plÅ«smās.

Reāli veiktspējas testi mūsu vidē, izmantojot sintētiskos datus, uzrādīja nelielu pieaugumu (caurlaidspēja palielinājās par 10%-15%, latentums samazinājās par 10%-15%).

Kā iespējot un konfigurēt

Minimālā Apache Ignite versija: 2.8. Iespējojiet un konfigurējiet Ŕādi:

  • Klases ceļā ir jābÅ«t aizdedzes saspieÅ”anas modulim. Pēc noklusējuma tas atrodas Apache Ignite izplatÄ«jumā libs/optional direktorijā un nav iekļauts klases ceļā. Varat vienkārÅ”i pārvietot direktoriju vienu lÄ«meni uz augÅ”u uz libs, un, palaižot to caur ignite.sh, tas tiks automātiski iespējots.
  • NoturÄ«bai ir jābÅ«t iespējotai (Iespējots, izmantojot DataRegionConfiguration.setPersistenceEnabled(true)).
  • SaspieÅ”anas režīms jāiestata, izmantojot metodi DataStorageConfiguration.setWalPageCompression(), saspieÅ”ana pēc noklusējuma ir atspējota (atspējots režīms).
  • Pēc izvēles varat iestatÄ«t saspieÅ”anas lÄ«meni, izmantojot metodi DataStorageConfiguration.setWalPageCompression(), skatiet javadoc metodi derÄ«gām vērtÄ«bām katram režīmam.

Secinājums

AplÅ«kotos datu saspieÅ”anas mehānismus programmā Apache Ignite var izmantot neatkarÄ«gi viens no otra, taču ir pieņemama arÄ« jebkura to kombinācija. Izpratne par to darbÄ«bu ļaus jums noteikt, cik tie ir piemēroti jÅ«su uzdevumiem jÅ«su vidē un kas jums bÅ«s jāupurē, tos izmantojot. Diska lapu saspieÅ”ana ir paredzēta galvenās atmiņas saspieÅ”anai, un tā var nodroÅ”ināt vidēju saspieÅ”anas pakāpi. WAL lapas momentuzņēmuma saspieÅ”ana nodroÅ”inās WAL failu vidējo saspieÅ”anas pakāpi un, visticamāk, pat uzlabos veiktspēju. WAL blÄ«vÄ“Å”anai nebÅ«s pozitÄ«vas ietekmes uz veiktspēju, taču tas pēc iespējas samazinās WAL failu izmērus, noņemot fiziskos ierakstus.

Avots: www.habr.com

Pievieno komentāru