Komkirina daneyê di Apache Ignite de. Serpêhatiya Sber

Komkirina daneyê di Apache Ignite de. Serpêhatiya SberDema ku bi hêjmarên mezin ên daneyê re dixebitin, carinan dibe ku pirsgirêka kêmbûna cîhê dîskê çêbibe. Yek rê ji bo çareserkirina vê pirsgirêkê komkirin e, ku bi saya wê, li ser heman amûrê, hûn dikarin hejmûnên hilanînê zêde bikin. Di vê gotarê de, em ê binihêrin ka berhevkirina daneyê li Apache Ignite çawa dixebite. Ev gotar dê tenê rêbazên komkirina dîskê yên ku di hundurê hilberê de têne bicîh kirin diyar bike. Rêbazên din ên berhevkirina daneyê (li ser torê, di bîranînê de), gelo bêne bicîh kirin an na, dê li derveyî çarçovê bimînin.

Ji ber vê yekê, dema ku moda domdariyê hatî çalak kirin, ji ber guheztina daneyan di kaş de, Ignite dest bi nivîsandina dîskê dike:

  1. Naveroka cache
  2. Têketina Pêşî Binivîsin (li vir bi tenê WAL)

Ji bo demek dirêj ve mekanîzmayek ji bo komkirina WAL-ê heye, ku jê re tê gotin berhevkirina WAL. Apache Ignite 2.8-a nû hatî berdan du mekanîzmayên din destnîşan kir ku destûrê dide te ku hûn daneyan li ser dîskê berhev bikin: berhevkirina rûpela dîskê ji bo berhevkirina naverokên cache û berhevkirina wêneya rûpela WAL-ê ji bo berhevkirina hin navnîşên WAL. Agahiyên bêtir li ser van her sê mekanîzmayên jêrîn.

Kompresyona rûpela dîskê

Çawa ev karê

Pêşîn, em nihêrînek pir kurt li ser çawa Ignite daneyan hilîne. Bîra rûpel ji bo hilanînê tê bikaranîn. Mezinahiya rûpelê di destpêka nodê de tête danîn û di qonaxên paşîn de nayê guheztin; di heman demê de, mezinahiya rûpelê divê hêzek du û pirjimarek mezinahiya bloka pergala pelan be. Rûpel li gorî hewcedariyê ji dîskê di RAM-ê de têne barkirin; mezinahiya daneyên li ser dîskê dibe ku ji mêjera RAM-a veqetandî derbas bibe. Ger di RAM-ê de cîh têr nebe ku rûpelek ji dîskê bar bike, dê rûpelên kevn, yên ku êdî nayên bikar anîn ji RAM-ê werin derxistin.

Daneyên bi vî rengî li ser dîskê têne hilanîn: Ji bo her dabeşkirina her komek cache pelek veqetandî tê afirandin; di vê pelê de, rûpel li pey hev bi rêza nîşana hilkişînê têne xuyang kirin. Nasnameya rûpelê ya tevahî di pelê de nasnavê koma cache, jimareya dabeşkirinê û navnîşa rûpelê dihewîne. Bi vî rengî, bi karanîna nasnameya rûpelê ya tevahî, em dikarin ji bo her rûpelê pelê bi rengek yekane diyar bikin û di pelê de veqetandinê diyar bikin. Hûn dikarin di gotara Apache Ignite Wiki de di derbarê bîranîna rûpelkirinê de bêtir bixwînin: Ignite Persistent Store - di bin kapê de.

Mekanîzmaya berhevkirina rûpela dîskê, wekî ku hûn ji navê xwe texmîn dikin, di asta rûpelê de dixebite. Dema ku ev mekanîzma were çalak kirin, daneyên di RAM-ê de wekî ku ye, bêyî ku tê kirin têne hilberandin, lê gava ku rûpel ji RAM-ê ber bi dîskê ve têne hilanîn, ew têne kom kirin.

Lê berhevkirina her rûpelê bi ferdî ne çareseriyek pirsgirêkê ye; hûn hewce ne ku bi rengekî mezinahiya pelên daneya encam kêm bikin. Ger mezinahiya rûpelê êdî rast nebe, êdî em nikanin rûpelan li pelê li pey hev binivîsin, ji ber ku ev dikare çend pirsgirêkan biafirîne:

  • Bi karanîna pêveka rûpelê, em ê nikaribin guheztina ku ew di pelê de cih digire hesab bikin.
  • Ne diyar e ku meriv bi rûpelên ku di dawiya pelê de ne û mezinahiya wan biguhezîne çi bike. Ger mezinahiya rûpelê kêm bibe, cîhê ku ew azad kiriye winda dibe. Ger mezinahiya rûpelê zêde bibe, hûn hewce ne ku ji bo wê di pelê de cîhek nû bigerin.
  • Ger rûpelek bi jimareyek baytên ku ne pirjimarek mezinahiya bloka pergala pelê ye dimeşe, wê hingê xwendin an nivîsandina wê hewce dike ku meriv bloka pergala pelê ya din jî bi dest bixe, ku dikare bibe sedema xirabûna performansê.

Ji bo ku van pirsgirêkan di asta xwe de çareser neke, berhevkirina rûpela dîskê di Apache Ignite de mekanîzmayek pergala pelan a bi navê pelên sparse bikar tîne. Pela sparse ew e ku tê de hin herêmên tije sifir dikarin wekî "çal" werin nîşankirin. Di vê rewşê de, dê blokên pergala pelan neyê veqetandin ku van qulan hilîne, ku di encamê de li cîhê dîskê tê teserûf kirin.

Ev mentiqî ye ku ji bo azadkirina bloka pergala pelan, mezinahiya qulikê divê ji bloka pergala pelan mezintir an wekhev be, ku li ser mezinahiya rûpelê û Apache Ignite sînorkirinek zêde ferz dike: ji bo ku komkirin bandorek hebe, mezinahiya rûpelê divê ji mezinahiya bloka pergala pelan bi tundî mezintir be. Ger mezinahiya rûpelê bi mezinahiya blokê re wekhev be, wê hingê em ê çu carî nikaribin yek blokek azad bikin, ji ber ku ji bo azadkirina yek blokek, divê rûpela pêçandî 0 byte dagir bike. Ger mezinahiya rûpelê bi mezinahiya 2 an 4 blokan re wekhev be, heke rûpela me bi rêzê ve bi kêmî ve ji% 50 an jî 75% were qut kirin, em ê jixwe karibin bi kêmî ve yek blokek azad bikin.

Bi vî rengî, danasîna paşîn a ka mekanîzma çawa dixebite: Dema ku rûpelek li ser dîskê dinivîse, hewl tê dayîn ku rûpelê were pelixandin. Ger mezinahiya rûpela pelçiqandî dihêle ku yek an çend blokên pergala pelan werin azad kirin, wê hingê rûpel bi forma pêçandî tê nivîsandin, û li şûna blokên azadkirî "holek" tê çêkirin (bangek pergalê tê kirin fallocate() bi ala qulikê pêçayî). Ger mezinahiya rûpela pelçiqandî rê nede ku blokan werin azad kirin, rûpel wekî ku ye, bêkompere tête tomar kirin. Hemî guheztinên rûpelan bi heman rengî wekî bê çewisandin têne hesibandin, bi zêdekirina pêveka rûpelê bi mezinahiya rûpelê. Veguheztina rûpelan bi serê xwe ne hewce ye. Veguheztinên rûpelan, mîna bêyî pêgirtinê, dikeve ser sînorên blokên pergala pelan.

Komkirina daneyê di Apache Ignite de. Serpêhatiya Sber

Di pêkanîna heyî de, Ignite tenê dikare di bin OS-a Linux-ê de bi pelên hindik re bixebite; Li gorî vê yekê, dema ku Ignite li ser vê pergala xebitandinê bikar tîne, komkirina rûpela dîskê tenê dikare were çalak kirin.

Algorîtmayên berhevkirinê yên ku dikarin ji bo berhevkirina rûpela dîskê werin bikar anîn: ZSTD, LZ4, Snappy. Wekî din, modek xebitandinê (SKIP_GARBAGE) heye, ku tê de tenê cîhê nekarandî di rûpelê de tê avêtin bêyî ku li ser daneya mayî were sepandin, ku li gorî algorîtmayên berê yên navnîşkirî barkirina li ser CPU kêm dike.

Bandora Performansê

Mixabin, min pîvandinên performansa rastîn li ser stendeyên rastîn pêk neanî, ji ber ku em plan nakin ku vê mekanîzmayê di hilberînê de bikar bînin, lê em bi teorîkî dikarin texmîn bikin ku em ê li ku winda bikin û li ku derê bi ser bikevin.

Ji bo vê yekê, pêdivî ye ku em ji bîr mekin ka rûpel çawa têne xwendin û nivîsandin dema ku têne gihîştin:

  • Dema ku xebatek xwendinê tête kirin, ew yekem di RAM-ê de tê gerîn; heke lêgerîn neserketî be, rûpel ji hêla heman têra ku xwendinê pêk tîne di RAM-ê de ji dîskê tê barkirin.
  • Dema ku xebatek nivîsandinê tê kirin, rûpela di RAM-ê de wekî qirêj tê nîşankirin, lê rûpel bi fizîkî tavilê li ser dîskê nayê tomarkirin ji hêla tîra ku nivîsandinê pêk tîne. Hemî rûpelên qirêj paşê di pêvajoya nuqteya kontrolê de di mijarên cihê de li dîskê têne hilanîn.

Ji ber vê yekê bandor li ser operasyonên xwendinê ev e:

  • Erênî (dîska IO), ji ber kêmbûna hejmara blokên pergala pelê ya xwendinê.
  • Neyînî (CPU), ji ber barkirina zêde ya ku ji hêla pergala xebitandinê ve tê xwestin ku bi pelên piçûk re bixebite. Di heman demê de mimkun e ku operasyonên IO-yê yên din bi eşkereyî li vir xuya bibin da ku strukturek pelê sparse ya tevlihevtir hilînin (mixabin, ez bi hemî hûrguliyên ka pelên sparse çawa dixebitin nizanin).
  • Neyînî (CPU), ji ber hewcedariya dakêşandina rûpelan.
  • Ti bandorek li ser operasyonên nivîsandinê tune.
  • Bandora li ser pêvajoya nuqteya kontrolê (her tişt li vir mîna operasyonên xwendinê ye):
  • Erênî (dîska IO), ji ber kêmbûna hejmara blokên pergala pelan a nivîskî.
  • Neyînî (CPU, dibe ku dîskê IO), ji ber xebata bi pelên kêm.
  • Neyînî (CPU), ji ber hewcedariya pelçiqandina rûpelê.

Kîjan aliyê terazûyê wê terazûyê hilde? Ev hemî pir bi hawîrdorê ve girêdayî ye, lê ez meyldar im ku bawer bikim ku komkirina rûpela dîskê dê bi îhtîmalek mezin bibe sedema xirabkirina performansê li ser pir pergalan. Digel vê yekê, ceribandinên li ser DBMS-yên din ên ku bi pelên sparse re nêzîkatiyek wusa bikar tînin dema ku komkirin tê çalak kirin daketina performansê destnîşan dikin.

Meriv çawa çalak bike û mîheng bike

Wekî ku li jor behs kir, guhertoya herî kêm a Apache Ignite ya ku berhevkirina rûpela dîskê piştgirî dike 2.8 e û tenê pergala xebitandina Linux-ê piştgirî ye. Bi vî rengî çalak bikin û mîheng bikin:

  • Pêdivî ye ku di rêça sinifê de modulek şewitandin-kompresyonê hebe. Ji hêla xwerû, ew di belavkirina Apache Ignite de di pelrêça libs / vebijarkî de cih digire û di rêça sinifê de tune. Hûn dikarin bi tenê pelrêça yek astê berbi libsê vebikin û dûv re gava ku hûn wê bi ignite.sh bimeşînin ew ê bixweber were çalak kirin.
  • Pêdivî ye ku domdar were çalak kirin (Bi rêya çalak kirin DataRegionConfiguration.setPersistenceEnabled(true)).
  • Mezinahiya rûpelê divê ji mezinahiya bloka pergala pelan mezintir be (hûn dikarin wê bi kar bînin DataStorageConfiguration.setPageSize() ).
  • Ji bo her cacheya ku daneya wê pêdivî ye ku were berhev kirin, divê hûn rêbaza berhevkirinê û (bi bijartî) asta berhevkirinê (rêbaz) mîheng bikin. CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

berhevkirina WAL

Çawa ev karê

WAL çi ye û çima hewce ye? Pir bi kurtî: ev têketinek e ku hemî bûyerên ku di dawiyê de hilanîna rûpelê diguhezîne vedihewîne. Di serî de pêdivî ye ku meriv di rewşek hilweşînê de xwe baş bike. Her karek, berî ku kontrolê bide bikarhêner, divê pêşî bûyerek di WAL-ê de tomar bike, da ku di rewşek têkçûyî de, ew di têketinê de were lîstin û hemî operasyonên ku bikarhêner ji bo wan bersivek serketî stendine, werin vegerandin, tevî ku van kiryaran. Wext tunebû ku di hilanîna rûpelê ya li ser dîskê de were xuyang kirin (jixwe li jor hatîye rave kirin ku nivîsandina rastîn a li dikana rûpelê di pêvajoyek bi navê "kontrolkirina" de bi hindek dereng ji hêla mijarên cûda ve tête kirin).

Têketinên di WAL de li ser mentiqî û fizîkî têne dabeş kirin. Yên Boolean bi xwe mift û nirx in. Fîzîkî - guhertinên li ser rûpelên di firotgeha rûpelê de nîşan dide. Digel ku tomarên mentiqî dikarin ji bo hin rewşên din bikêr bin, tomarên laşî tenê ji bo başbûnê di bûyera qezayê de hewce ne û tomar tenê ji xala kontrolê ya paşîn a serketî hewce ne. Li vir em ê bi hûrgulî neçin û rave bikin ka çima ew bi vî rengî dixebite, lê yên eleqedar dikarin li gotara ku berê hatî destnîşan kirin li ser Apache Ignite Wiki binihêrin: Ignite Persistent Store - di bin kapê de.

Bi gelemperî di her tomarek mentiqî de çend tomarên laşî hene. Ango, mînakî, yek operasiyonek di cache de bandorê li çend rûpelan di bîranîna rûpelê de dike (rûpelek bi daneyê bixwe, rûpelên bi navnîşan, rûpelên bi navnîşên belaş). Di hin ceribandinên sentetîk de, min dît ku tomarên laşî heya 90% ji pelê WAL-ê digire. Lêbelê, ew ji bo demek pir kurt hewce ne (ji hêla xwerû, navber di navbera xalên kontrolê de 3 hûrdem e). Dê mentiqî be ku meriv ji vê daneyê xilas bibe piştî ku têkiliya wê winda bike. Tiştê ku mekanîzmaya berhevkirina WAL dike ev e: ew ji tomarên laşî xilas dibe û tomarên mantiqî yên mayî bi karanîna zip-ê berhev dike, di heman demê de mezinahiya pelê pir girîng kêm dibe (carinan bi dehan carî).

Ji hêla fizîkî ve, WAL ji çend beşan pêk tê (10 ji hêla xwerû) bi pîvanek sabît (bi xwerû 64 MB), ku bi rengek dorhêl têne nivîsandin. Hema ku beşa heyî tê dagirtin, beşa paşîn wekî niha tê destnîşankirin, û beşa dagirtî ji hêla mijarek cûda ve li arşîvê tê kopî kirin. Berhevkirina WAL jixwe bi beşên arşîvê re dixebite. Di heman demê de, wekî mijarek veqetandî, ew cîbicîkirina nuqteya kontrolê dişopîne û di beşên arşîvê de ku ji bo wan êdî tomarên laşî ne hewce ne dest bi berhevkirinê dike.

Komkirina daneyê di Apache Ignite de. Serpêhatiya Sber

Bandora Performansê

Ji ber ku berhevkirina WAL wekî mijarek veqetandî dimeşe, divê bandorek rasterast li ser operasyonên ku têne kirin tune be. Lê dîsa jî ew barkirina paşîn a zêde li CPU (kompresyon) û dîskê dixe (xwendina her beşê WAL ji arşîvê û nivîsandina beşên pêçandî), ji ber vê yekê ger pergal bi kapasîteya xwe ya herî zêde bixebite, ew ê di heman demê de bibe sedema xerabûna performansê.

Meriv çawa çalak bike û mîheng bike

Hûn dikarin bi karanîna taybetmendiyê berhevkirina WAL-ê çalak bikin WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Di heman demê de, bi karanîna rêbaza DataStorageConfiguration.setWalCompactionLevel(), hûn dikarin asta berhevkirinê saz bikin ger hûn ji nirxa xwerû (BEST_SPEED) ne razî bin.

Kompresyona wêneya rûpela WAL

Çawa ev karê

Me berê fêr kir ku di WAL-ê de tomar di nav mentiqî û fizîkî de têne dabeş kirin. Ji bo her guhertina her rûpelê, tomarek WAL-a laşî di bîranîna rûpelê de tê çêkirin. Qeydên fizîkî, di encamê de, di heman demê de li 2 binkûreyan têne dabeş kirin: tomarkirina wêneya rûpelê û tomara delta. Her gava ku em li ser rûpelek tiştek diguhezînin û ji rewşek paqij vediguhezînin rewşek qirêj, kopiyek tam a vê rûpelê di WAL (qeyda wêneya rûpelê) de tê hilanîn. Her çend me di WAL-ê de tenê yek byte biguhezîne jî, tomar dê hinekî ji mezinahiya rûpelê mezintir be. Ger em li ser rûpelek jixwe qirêj tiştek biguhezînin, di WAL-ê de tomarek delta çê dibe, ku li gorî rewşa berê ya rûpelê, lê ne tevahiya rûpelê, tenê guhertinan nîşan dide. Ji ber ku di pêvajoya nuqteya kontrolê de vegerandina rewşa rûpelan ji qirêj ber bi paqijiyê ve tê kirin, tavilê piştî destpêkirina nuqteya kontrolê, hema hema hemî tomarên laşî dê tenê ji dîmenên rûpelan pêk werin (ji ber ku hemî rûpel tavilê piştî destpêkirina nuqteya kontrolê paqij in) , wê gavê her ku em nêzikî nuqteya kontrolê ya din dibin, beşa tomara deltayê dest pê dike mezin dibe û di destpêka nuqteya kontrolê ya din de dîsa vedigere. Pîvandinên di hin ceribandinên sentetîk de destnîşan kirin ku para dîmenên rûpelê di hêjmara giştî ya tomarên laşî de digihîje 90%.

Fikra berhevkirina wêneya rûpela WAL-ê ev e ku meriv dîmenên rûpelê bi karanîna amûrek berhevkirina rûpela amade berhev bike (li berhevkirina rûpela dîskê binêre). Di heman demê de, di WAL-ê de, tomar di moda tenê-tenê pêvekê de bi rêz têne tomar kirin û ne hewce ye ku tomaran bi sînorên blokên pergala pelan ve girêbidin, ji ber vê yekê li vir, berevajî mekanîzmaya berhevkirina rûpela dîskê, em ne hewceyî pelên kêm in. hemî; li gorî vê yekê, ev mekanîzma dê ne tenê li ser OS Linux-ê bixebite. Wekî din, êdî ji me re ne girîng e ku me çiqasî karîbû rûpelê bitewîne. Her çend me 1 byte azad bike jî, ev jixwe encamek erênî ye û em dikarin daneya pêçandî di WAL-ê de hilînin, berevajî komkirina rûpela dîskê, ku em rûpela berhevkirî hilînin tenê heke me ji 1 bloka pergala pelan bêtir azad bike.

Rûpel daneya pir biqewimin in, para wan di hêjmara giştî ya WAL de pir zêde ye, ji ber vê yekê bêyî guheztina formata pelê WAL em dikarin di mezinahiya wê de kêmbûnek girîng bistînin. Tevlihevkirin, tevî tomarên mentiqî, dê hewceyê guherînek di format û windakirina lihevhatinê de bike, mînakî, ji bo xerîdarên derveyî ku dibe ku bi tomarên mantiqî re eleqedar bibin, lê dê bibe sedema kêmbûnek girîng a mezinahiya pelê.

Wekî ku bi berhevkirina rûpela dîskê re, berhevkirina wêneya rûpela WAL-ê dikare algorîtmayên berhevkirina ZSTD, LZ4, Snappy, û hem jî moda SKIP_GARBAGE bikar bîne.

Bandora Performansê

Ne zehmet e ku meriv bala xwe bide ku rasterast çalakkirina berhevkirina wêneya rûpela WAL-ê tenê bandorê li ser mijarên ku daneyan li bîranîna rûpelê dinivîse, ango, wan mijarên ku daneyan di cache de diguherînin bandor dike. Xwendina tomarên laşî ji WAL tenê carekê çêdibe, di wê gavê de ku girêk piştî hilweşînê tê bilind kirin (û tenê heke ew di dema xalek kontrolê de bikeve).

Ev bandorê li ser mijarên ku daneyan bi awayê jêrîn diguhezîne dike: ji ber ku pêdivî ye ku her carê berî ku li ser dîskê binivîsin, em bandorek neyînî (CPU) digirin, û bandorek erênî (dîskê IO) ji ber kêmbûna mîqdara dane nivîsandin. Li gorî vê yekê, her tişt li vir hêsan e: heke performansa pergalê ji hêla CPU ve were sînorkirin, em kêmbûnek sivik digirin, heke ew ji hêla I/O-ya dîskê ve were sînorkirin, em zêde dibin.

Nerasterast, kêmkirina mezinahiya WAL-ê jî bandorê (erênî) dike li ser çemên ku beşên WAL diavêjin nav arşîv û çemên berhevkirina WAL-ê.

Testên performansa rastîn ên di hawîrdora me de ku daneyên sentetîk bikar tînin zêdebûnek sivik nîşan dan (karûbar ji 10% -15% zêde bû, dereng ji% 10% -15 kêm bû).

Meriv çawa çalak bike û mîheng bike

Guhertoya Kêmtirîn Apache Ignite: 2.8. Bi vî rengî çalak bikin û mîheng bikin:

  • Pêdivî ye ku di rêça sinifê de modulek şewitandin-kompresyonê hebe. Ji hêla xwerû, ew di belavkirina Apache Ignite de di pelrêça libs / vebijarkî de cih digire û di rêça sinifê de tune. Hûn dikarin bi tenê pelrêça yek astê berbi libsê vebikin û dûv re gava ku hûn wê bi ignite.sh bimeşînin ew ê bixweber were çalak kirin.
  • Pêdivî ye ku domdar were çalak kirin (Bi rêya çalak kirin DataRegionConfiguration.setPersistenceEnabled(true)).
  • Pêdivî ye ku moda komkirinê bi karanîna rêbazê were saz kirin DataStorageConfiguration.setWalPageCompression(), kompresyon ji hêla xwerû ve neçalak e (moda DISABLED).
  • Bi vebijarkî, hûn dikarin bi karanîna rêbazê asta berhevkirinê saz bikin DataStorageConfiguration.setWalPageCompression(), javadoc ji bo rêbazê ji bo nirxên derbasdar ji bo her modê bibînin.

encamê

Mekanîzmayên berhevkirina daneyê yên di Apache Ignite de têne hesibandin dikarin ji hev serbixwe werin bikar anîn, lê her tevliheviyek wan jî tê pejirandin. Fêmkirina ka ew çawa dixebitin dê bihêle ku hûn destnîşan bikin ka ew ji bo karên we yên li hawîrdora we çiqas guncan in û hûn ê di dema karanîna wan de çi feda bikin. Tevlihevkirina rûpela dîskê ji bo berhevkirina hilanîna sereke hatî sêwirandin û dikare rêjeyek berhevkirina navîn bide. Tevlihevkirina wêneya rûpela WAL-ê ji bo pelên WAL-ê astek navînî ya berhevkirinê dide, û bi îhtîmalek mezin dê performansê jî baştir bike. Tevlihevkirina WAL-ê dê bandorek erênî li ser performansê neke, lê dê bi rakirina tomarên laşî bi qasî ku pêkan mezinahiya pelên WAL kêm bike.

Source: www.habr.com

Add a comment