Konpresyon done nan Apache Ignite. Eksperyans Sber a

Konpresyon done nan Apache Ignite. Eksperyans Sber aLè w ap travay ak gwo kantite done, pwoblèm nan nan mank espas ki gen kapasite ka pafwa leve. Youn nan fason yo rezoud pwoblèm sa a se konpresyon, gras a ki, sou menm ekipman an, ou ka peye ogmante komèsan depo. Nan atik sa a, nou pral gade ki jan konpresyon done travay nan Apache Ignite. Atik sa a pral dekri sèlman metòd konpresyon disk aplike nan pwodwi a. Lòt metòd konpresyon done (sou rezo a, nan memwa), si yo aplike oswa ou pa, yo pral rete deyò sijè ki abòde lan.

Se konsa, ak mòd pèsistans aktive, kòm yon rezilta nan chanjman nan done nan kachèt yo, Ignite kòmanse ekri sou disk:

  1. Sa ki nan kachèt
  2. Write Ahead Log (ki annapre tou senpleman WAL)

Gen yon mekanis pou konpresyon WAL pou kèk tan kounye a, ki rele konpaksyon WAL. Apache Ignite 2.8 ki te pibliye dènyèman te prezante de lòt mekanis ki pèmèt ou konpresyon done sou disk: konpresyon paj disk pou konpresyon sa ki nan kachèt ak konpresyon WAL paj snapshot pou konpresyon kèk antre WAL. Plis detay sou tout twa mekanis sa yo anba a.

Konpresyon paj disk

Kijan travay sa a

Premyèman, ann gade byen kout sou fason Ignite estoke done yo. Memwa paj yo itilize pou depo. Gwosè paj la fikse nan kòmansman ne la epi yo pa ka chanje nan etap pita; tou, gwosè paj la dwe yon pouvwa de ak yon miltip gwosè blòk sistèm dosye a. Paj yo chaje nan RAM soti nan disk jan sa nesesè; gwosè a nan done sou disk ka depase kantite RAM atribye ba yo. Si pa gen ase espas nan RAM pou chaje yon paj ki soti nan disk, paj fin vye granmoun, ki pa itilize ankò yo pral degèpi nan RAM.

Done yo estoke sou disk nan fòm sa a: yo kreye yon dosye separe pou chak patisyon nan chak gwoup kachèt; nan dosye sa a, paj parèt youn apre lòt nan lòd endèks monte. Idantifyan paj konplè a gen idantifyan gwoup kachèt la, nimewo patisyon, ak endèks paj nan dosye a. Kidonk, lè l sèvi avèk idantifyan paj konplè a, nou ka detèmine inikman fichye a ak konpanse nan fichye a pou chak paj. Ou ka li plis sou memwa paging nan atik Apache Ignite Wiki la: Ignite Persistent Store - anba kapo a.

Mekanis konpresyon paj disk la, jan ou ka devine nan non an, travay nan nivo paj la. Lè mekanis sa a aktive, done nan RAM yo trete jan yo ye, san okenn konpresyon, men lè paj yo sove nan RAM nan disk, yo konprese.

Men, konpresyon chak paj endividyèlman se pa yon solisyon a pwoblèm nan; ou bezwen yon jan kanmenm diminye gwosè a nan dosye done yo ki kapab lakòz. Si gwosè paj la pa fiks ankò, nou pa ka ekri paj nan dosye a youn apre lòt, paske sa ka kreye yon kantite pwoblèm:

  • Sèvi ak endèks paj la, nou pa pral kapab kalkile konpanse a pa ki li sitiye nan dosye a.
  • Li pa klè kisa pou fè ak paj ki pa nan fen dosye a epi chanje gwosè yo. Si gwosè paj la diminye, espas li libere a disparèt. Si gwosè paj la ogmante, ou bezwen chèche yon nouvo plas nan dosye a pou li.
  • Si yon paj deplase pa yon kantite bytes ki pa yon miltip gwosè blòk sistèm dosye a, Lè sa a, li oswa ekri li pral mande pou manyen yon lòt blòk sistèm dosye, ki ka mennen nan degradasyon pèfòmans.

Pou evite rezoud pwoblèm sa yo nan pwòp nivo li yo, konpresyon paj disk nan Apache Ignite sèvi ak yon mekanis sistèm fichye yo rele dosye sparse. Yon dosye rar se youn kote kèk rejyon ki ranpli zewo ka make kòm "twou". Nan ka sa a, pa gen okenn blòk sistèm fichye yo pral resevwa lajan pou estoke twou sa yo, sa ki lakòz ekonomi sou espas disk.

Li lojik pou libere yon blòk sistèm fichye, gwosè twou a dwe pi gran pase oswa egal ak blòk sistèm fichye a, ki enpoze yon limit adisyonèl sou gwosè paj la ak Apache Ignite: pou konpresyon gen okenn efè, gwosè paj la dwe estrikteman pi gwo pase gwosè blòk sistèm fichye a. Si gwosè paj la egal ak gwosè blòk la, Lè sa a, nou p'ap janm ka libere yon sèl blòk, paske yo nan lòd yo libere yon sèl blòk, paj konprese a dwe okipe 0 byte. Si gwosè paj la egal ak gwosè 2 oswa 4 blòk, nou pral deja kapab libere omwen yon blòk si paj nou an konprese nan omwen 50% oswa 75%, respektivman.

Kidonk, deskripsyon final la sou fason mekanis lan fonksyone: Lè w ap ekri yon paj sou disk, yo fè yon tantativ pou konprese paj la. Si gwosè paj konprese a pèmèt youn oswa plizyè blòk sistèm fichye yo dwe libere, Lè sa a, paj la ekri nan fòm konprese, epi yo fè yon "twou" nan plas blòk yo libere (yon apèl sistèm egzekite. fallocate() ak drapo twou kout pwen an). Si gwosè a nan paj la konprese pa pèmèt blòk yo dwe libere, paj la sove jan li se, dekonprese. Tout konpanse paj yo kalkile menm jan ak san konpresyon, lè yo miltipliye endèks paj la pa gwosè paj la. Pa gen okenn demenajman nan paj obligatwa pou kont ou. Offsets paj, menm jan ak san konpresyon, tonbe sou limit yo nan blòk sistèm dosye.

Konpresyon done nan Apache Ignite. Eksperyans Sber a

Nan aplikasyon aktyèl la, Ignite ka travay sèlman ak fichye ki pa fasil anba Linux OS; kòmsadwa, konpresyon paj disk ka sèlman aktive lè w ap itilize Ignite sou sistèm operasyon sa a.

Algoritm konpresyon ki ka itilize pou konpresyon paj disk: ZSTD, LZ4, Snappy. Anplis de sa, gen yon mòd opere (SKIP_GARBAGE), nan ki se sèlman espas ki pa itilize nan paj la jete san yo pa aplike konpresyon sou done ki rete yo, ki diminye chaj la sou CPU a konpare ak algorithm yo ki te deja nan lis.

Enpak pèfòmans

Malerezman, mwen pa t 'fè mezi pèfòmans aktyèl sou kanpe reyèl, paske nou pa planifye yo sèvi ak mekanis sa a nan pwodiksyon, men nou ka teyorikman espekile ki kote nou pral pèdi ak ki kote nou pral genyen.

Pou fè sa, nou bezwen sonje ki jan paj yo li ak ekri lè yo jwenn aksè:

  • Lè w ap fè yon operasyon lekti, li se premye fouye nan RAM; si rechèch la pa reyisi, paj la chaje nan RAM soti nan disk pa menm fil ki fè lekti a.
  • Lè yon operasyon ekri fèt, paj la nan RAM make kòm sal, men paj la pa fizikman sove sou disk imedyatman pa fil la fè ekri a. Tout paj sal yo sove sou disk pita nan pwosesis pòs la nan fil separe.

Se konsa, enpak la sou operasyon lekti se:

  • Pozitif (disk IO), akòz yon diminisyon nan kantite blòk sistèm fichye li.
  • Negatif (CPU), akòz chaj anplis ke sistèm operasyon an mande pou travay ak dosye ra. Li posib tou ke operasyon IO adisyonèl yo pral implicitement parèt isit la pou konsève pou yon estrikti dosye ki pi konplèks (malerezman, mwen pa abitye ak tout detay yo sou fason dosye yo travay).
  • Negatif (CPU), akòz bezwen an dekonprese paj.
  • Pa gen okenn enpak sou operasyon ekriti yo.
  • Enpak sou pwosesis pòs la (tout bagay isit la sanble ak operasyon lekti):
  • Pozitif (disk IO), akòz yon diminisyon nan kantite blòk sistèm dosye ekri.
  • Negatif (CPU, petèt disk IO), akòz travay ak dosye ra.
  • Negatif (CPU), akòz bezwen an pou konpresyon paj.

Ki bò echèl la ap fè balanse a? Sa a tout depann anpil sou anviwònman an, men mwen enkline kwè ke konpresyon paj disk pral gen plis chans mennen nan degradasyon pèfòmans sou pifò sistèm yo. Anplis, tès sou lòt DBMS ki sèvi ak yon apwòch menm jan an ak dosye ra montre yon gout nan pèfòmans lè konpresyon pèmèt.

Ki jan yo pèmèt ak konfigirasyon

Kòm mansyone pi wo a, vèsyon minimòm Apache Ignite ki sipòte konpresyon paj disk se 2.8 epi sèlman sistèm opere Linux sipòte. Pèmèt ak konfigirasyon jan sa a:

  • Dwe gen yon modil ignite-konpresyon nan chemen klas la. Pa default, li sitiye nan distribisyon Apache Ignite nan anyè lib/opsyonèl epi li pa enkli nan chemen klas la. Ou ka tou senpleman deplase anyè a moute yon nivo nan lib ak Lè sa a, lè ou kouri li nan ignite.sh li pral otomatikman pèmèt.
  • Pèsistans dwe aktive (pèmèt atravè DataRegionConfiguration.setPersistenceEnabled(true)).
  • Gwosè paj la dwe pi gwo pase gwosè blòk sistèm fichye a (ou ka mete li lè l sèvi avèk DataStorageConfiguration.setPageSize() ).
  • Pou chak kachèt ki gen done yo bezwen konprese, ou dwe configured metòd konpresyon an ak (opsyonèlman) nivo konpresyon an (metòd CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

WAL konpaksyon

Kijan travay sa a

Ki sa ki WAL e poukisa li nesesè? Trè yon ti tan: sa a se yon boutèy demi lit ki gen tout evènman ki finalman chanje depo paj la. Li nesesè prensipalman pou kapab refè nan ka ta gen yon tonbe. Nenpòt operasyon, anvan yo bay itilizatè a kontwòl, dwe premye anrejistre yon evènman nan WAL, pou ke nan ka echèk, li ka jwe tounen nan boutèy la ak restore tout operasyon pou ki itilizatè a te resevwa yon repons siksè, menm si operasyon sa yo. pa t 'gen tan yo dwe reflete nan depo nan paj sou disk (deja pi wo a Li te dekri ke se ekri aktyèl la nan magazen an paj fè nan yon pwosesis ki rele "checkpointing" ak kèk reta pa fil separe).

Antre nan WAL yo divize an lojik ak fizik. Boolean yo se kle yo ak valè tèt yo. Fizik - reflete chanjman nan paj nan magazen paj la. Pandan ke dosye lojik yo ka itil pou kèk lòt ka, dosye fizik yo bezwen sèlman pou rekiperasyon an ka ta gen yon aksidan ak dosye yo bezwen sèlman depi dènye pòs ki gen siksè. Isit la nou pa pral antre nan detay epi eksplike poukisa li travay nan fason sa a, men moun ki enterese ka refere a atik ki deja mansyone sou Apache Ignite Wiki la: Ignite Persistent Store - anba kapo a.

Gen souvan plizyè dosye fizik pou chak dosye lojik. Sa se, pou egzanp, yon sèl mete operasyon nan kachèt la afekte plizyè paj nan memwa paj (yon paj ki gen done nan tèt li, paj ak endèks, paj ak lis gratis). Nan kèk tès sentetik, mwen te jwenn ke dosye fizik okipe jiska 90% nan dosye WAL la. Sepandan, yo bezwen pou yon tan trè kout (pa default, entèval ki genyen ant pòs se 3 minit). Li ta lojik debarase m de done sa a apre pèdi enpòtans li yo. Sa a se egzakteman sa mekanis konpaksyon WAL la fè: li debarase m de dosye fizik ak konprese dosye lojik ki rete yo lè l sèvi avèk zip, pandan y ap gwosè a fichye redwi anpil anpil (pafwa pa dè dizèn de fwa).

Fizikman, WAL konsiste de plizyè segman (10 pa default) nan yon gwosè fiks (64MB pa default), ki ranplase nan yon fason sikilè. Le pli vit ke segman aktyèl la ranpli, segman kap vini an asiyen kòm aktyèl, epi segman ranpli a kopye nan achiv la pa yon fil separe. WAL konpaksyon deja travay ak segman achiv yo. Epitou, kòm yon fil separe, li kontwole ekzekisyon pòs la epi li kòmanse konpresyon nan segman achiv pou ki dosye fizik yo pa nesesè ankò.

Konpresyon done nan Apache Ignite. Eksperyans Sber a

Enpak pèfòmans

Depi konpaksyon WAL kouri kòm yon fil separe, pa ta dwe gen okenn enpak dirèk sou operasyon yo ap fèt. Men, li toujou mete chaj background adisyonèl sou CPU a (konpresyon) ak disk (li chak segman WAL nan achiv la epi ekri segman yo konprese), kidonk si sistèm lan ap kouri nan kapasite maksimòm li yo, li pral mennen tou nan degradasyon pèfòmans.

Ki jan yo pèmèt ak konfigirasyon

Ou ka pèmèt konpaksyon WAL lè l sèvi avèk pwopriyete a WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Epitou, lè l sèvi avèk DataStorageConfiguration.setWalCompactionLevel() metòd la, ou ka mete nivo konpresyon si ou pa satisfè ak valè default (BEST_SPEED).

WAL paj snapshot konpresyon

Kijan travay sa a

Nou te deja jwenn ke nan dosye WAL yo divize an lojik ak fizik. Pou chak chanjman nan chak paj, se yon dosye WAL fizik ki pwodui nan memwa paj. Dosye fizik, nan vire, yo tou divize an 2 subtip: dosye snapshot paj ak dosye delta. Chak fwa nou chanje yon bagay nan yon paj epi transfere li soti nan yon eta pwòp nan yon eta sal, yon kopi konplè paj sa a estoke nan WAL (dosye paj snapshot). Menm si nou chanje yon sèl byte nan WAL, dosye a pral yon ti kras pi gwo pase gwosè paj la. Si nou chanje yon bagay sou yon paj ki deja sal, yon dosye delta fòme nan WAL, ki reflete chanjman sèlman konpare ak eta anvan paj la, men se pa tout paj la. Depi reset eta a nan paj soti nan sal nan pwòp fèt pandan pwosesis pòs la, imedyatman apre kòmansman pòs la, prèske tout dosye fizik yo pral konpoze sèlman de snapshots nan paj (piske tout paj imedyatman apre kòmansman pòs la yo pwòp) , Lè sa a, pandan n ap pwoche pwochen pòs kontwòl la, fraksyon dosye delta a kòmanse grandi epi reset ankò nan kòmansman pwochen pòs kontwòl la. Mezi nan kèk tès sentetik te montre ke pati nan paj snapshots nan volim total dosye fizik rive nan 90%.

Lide konpresyon WAL paj snapshot se konpresyon paj snapshots lè l sèvi avèk yon zouti konpresyon paj pare (gade konpresyon paj disk). An menm tan an, nan WAL, dosye yo sove sekans nan mòd ajoute-sèlman epi pa gen okenn nesesite pou mare dosye yo nan limit yo nan blòk sistèm dosye, kidonk isit la, kontrèman ak mekanis konpresyon paj disk la, nou pa bezwen fichye ra nan. tout; kòmsadwa, mekanis sa a pral travay pa sèlman sou OS Linux la. Anplis de sa, li pa enpòtan ankò pou nou konbyen nou te kapab konprese paj la. Menm si nou libere 1 byte, sa a se deja yon rezilta pozitif epi nou ka sove done konprese nan WAL, kontrèman ak konpresyon paj disk, kote nou sove paj la konprese sèlman si nou libere plis pase 1 blòk sistèm dosye.

Paj yo trè konpresib done, pati yo nan volim total WAL la trè wo, kidonk san yo pa chanje fòma dosye WAL nou ka jwenn yon rediksyon enpòtan nan gwosè li. Konpresyon, ki gen ladan dosye lojik, ta mande yon chanjman nan fòma ak pèt konpatibilite, pou egzanp, pou konsomatè ekstèn ki ka enterese nan dosye lojik, men ki pa ta mennen nan yon rediksyon enpòtan nan gwosè dosye.

Menm jan ak konpresyon paj disk, konpresyon WAL paj snapshot ka itilize ZSTD, LZ4, algoritm konpresyon Snappy, osi byen ke mòd SKIP_GARBAGE.

Enpak pèfòmans

Li pa difisil pou remake ke dirèkteman pèmèt konpresyon WAL paj snapshot sèlman afekte fil ki ekri done nan memwa paj, se sa ki, fil sa yo ki chanje done nan kachèt. Lekti dosye fizik ki soti nan WAL fèt sèlman yon fwa, nan moman sa a se ne a leve apre yon tonbe (e sèlman si li tonbe pandan yon pòs).

Sa afekte fil ki chanje done yo nan fason sa a: nou jwenn yon efè negatif (CPU) akòz nesesite pou konprese paj la chak fwa anvan ou ekri sou disk, ak yon efè pozitif (disk IO) akòz yon rediksyon nan kantite lajan an. done ekri. An konsekans, tout bagay se senp isit la: si pèfòmans nan sistèm limite pa CPU a, nou jwenn yon degradasyon ti tay, si li limite pa I / O ki gen kapasite, nou jwenn yon ogmantasyon.

Endirèkteman, diminye gwosè WAL la afekte tou (pozitivman) kouran ki jete segman WAL nan achiv yo ak kouran WAL konpaksyon.

Tès pèfòmans reyèl nan anviwònman nou an lè l sèvi avèk done sentetik te montre yon ti ogmantasyon (debi ogmante pa 10% -15%, latansi diminye pa 10% -15%).

Ki jan yo pèmèt ak konfigirasyon

Minimòm Apache Ignite vèsyon: 2.8. Pèmèt ak konfigirasyon jan sa a:

  • Dwe gen yon modil ignite-konpresyon nan chemen klas la. Pa default, li sitiye nan distribisyon Apache Ignite nan anyè lib/opsyonèl epi li pa enkli nan chemen klas la. Ou ka tou senpleman deplase anyè a moute yon nivo nan lib ak Lè sa a, lè ou kouri li nan ignite.sh li pral otomatikman pèmèt.
  • Pèsistans dwe aktive (pèmèt atravè DataRegionConfiguration.setPersistenceEnabled(true)).
  • Mòd konpresyon an dwe mete lè l sèvi avèk metòd la DataStorageConfiguration.setWalPageCompression(), konpresyon se enfim pa default (MOD DISABLED).
  • Opsyonèlman, ou ka mete nivo konpresyon lè l sèvi avèk metòd la DataStorageConfiguration.setWalPageCompression(), gade javadoc la pou metòd la pou valè valab pou chak mòd.

Konklizyon

Mekanis konpresyon done yo konsidere nan Apache Ignite ka itilize poukont youn ak lòt, men nenpòt konbinezon yo akseptab tou. Konprann ki jan yo travay pral pèmèt ou detèmine ki jan yo apwopriye pou travay ou nan anviwònman ou ak sa w ap gen pou sakrifye lè w ap itilize yo. Konpresyon paj disk fèt pou konpresyon depo prensipal la epi li ka bay yon rapò konpresyon mwayen. WAL paj snapshot konpresyon pral bay yon degre mwayèn nan konpresyon pou dosye WAL, epi li pral gen plis chans menm amelyore pèfòmans. Compact WAL pa pral gen yon efè pozitif sou pèfòmans, men li pral diminye gwosè a nan dosye WAL otank posib lè yo retire dosye fizik yo.

Sous: www.habr.com

Add nouvo kòmantè