Ignite Service Grid — rikarikimi

Më 26 shkurt, organizuam mitap Apache Ignite GreenSource, ku folën kontribuuesit e projektit open source. Apache Ignite. Një ngjarje e rëndësishme në jetën e këtij komuniteti ishte rindërtimi i komponentit Ignite Service Grid, i cili lejon të vendosen mikroshërbime të përdoruesve direkt në klastern e Ignite. Rreth këtij procesi të vështirë në mitap foli Vyacheslav Daradur, inxhinier softueri dhe kontribues i Apache Ignite për më shumë se dy vjet.

Ignite Service Grid — rikarikimi

Le tĂ« fillojmĂ« me atĂ« se çfarĂ« Ă«shtĂ« nĂ« tĂ« vĂ«rtetĂ« Apache Ignite. Kjo Ă«shtĂ« njĂ« bazĂ« tĂ« dhĂ«nash qĂ« pĂ«rfaqĂ«son njĂ« ruajtĂ«s tĂ« shpĂ«rndarĂ« Key/Value me mbĂ«shtetje pĂ«r SQL, transaksionet dhe cache. PĂ«r mĂ« tepĂ«r, Ignite lejon vendosjen e shĂ«rbimeve tĂ« pĂ«rdoruesve direkt nĂ« klastern Ignite. Zhvilluesi ka nĂ« dispozicion tĂ« gjitha mjetet qĂ« ofron Ignite — struktura tĂ« dhĂ«nash tĂ« shpĂ«rndara, Messaging, Streaming, Compute dhe Data Grid. PĂ«r shembull, kur pĂ«rdoret Data Grid, problemi i administratĂ«s sĂ« njĂ« infrastrukture tĂ« veçantĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave zhduket dhe, si pasojĂ«, shpenzimet e lidhura qĂ« dalin nga kjo.

Ignite Service Grid — rikarikimi

Duke përdorur API Service Grid, mund të vendosni një shërbim, thjesht duke treguar në konfigurim skemën e vendosjes dhe, përkatësisht, shërbimin vetë.

NjĂ« skemĂ« e zakonshme vendosjeje Ă«shtĂ« pĂ«rcaktimi i numrit tĂ« instancave qĂ« duhet tĂ« vendosen nĂ« nyjet e klasterit. Ka dy skema tipike vendosjeje. E para – Ă«shtĂ« Cluster Singleton: nĂ« çdo moment, nĂ« klaster garanton qĂ« do tĂ« jetĂ« e disponueshme njĂ« instancĂ« e vetme e shĂ«rbimit tĂ« pĂ«rdoruesit. E dyta – Ă«shtĂ« Node Singleton: nĂ« çdo nyje tĂ« klasterit Ă«shtĂ« vendosur njĂ« instancĂ« e shĂ«rbimit.

Ignite Service Grid — rikarikimi

Përdoruesi gjithashtu mund të përcaktojë numrin e instancave të shërbimit në të gjithë klasterin dhe të vendosë një predikat për filtrimin e nyjeve përkatëse. Në këtë skenar, Service Grid do të llogarisë shpërndarjen optimale për vendosjen e shërbimeve.

Për më tepër, ekziston një veçori si Shërbimi i Afinitetit. Afiniteti është një funksion që përcakton lidhjen e çelësave me parti dhe lidhjen e partive me nyjat në topologji. Sipas çelësit, mund të përcaktohet nyja kryesore, ku ruhen të dhënat. Kështu, mund të asociohet shërbimi juaj me çelësin dhe me cache-in e funksionit të afinitetit. Në rast se ndodh një ndryshim në funksionin e afinitetit, do të ndodhë një ri-deployment automatik. Kështu, shërbimi do të vendoset gjithmonë pranë të dhënave me të cilat duhet të manipulojë, duke ulur për pasojë kostot e aksesit në informacion. Kjo skemë mund të quhet një lloj llogaritjesh të kolokuar.

Tani, kur e kemi analizuar se çfarë e bën Shërbimin e Gridës të veçantë, do të flasim për historinë e tij të zhvillimit.

ÇfarĂ« ndodhi mĂ« parĂ«

Implementimi i kaluar i Shërbimit të Gridës bazohej në një cache sistemik transaksional të replikuar, si Ignite. Nën termin "cache" në Ignite kuptohet një magazinë. Kështu, kjo nuk është diçka e përkohshme, siç mund të mendohet. Edhe pse cache-i është i replikuar dhe çdo nyje përmban të gjithë setin e të dhënave, brenda cache-it ka një pamje të ndarë në party. Kjo lidhet me optimizimin e magazinave.

Ignite Service Grid — rikarikimi

ÇfarĂ« ndodhte kur pĂ«rdoruesi donte tĂ« bĂ«jĂ« deploy tĂ« shĂ«rbimit?

  • TĂ« gjitha nyjat nĂ« klaster ishin tĂ« regjistruara pĂ«r tĂ« marrĂ« pĂ«rditĂ«simin e tĂ« dhĂ«nave nĂ« magazinĂ« pĂ«rmes mekanizmit tĂ« integruar Continuous Query.
  • Nyja inicizuese, nĂ«n njĂ« transaksion tĂ« leximit tĂ« miratuar, bĂ«nte njĂ« regjistrim nĂ« bazĂ«n e tĂ« dhĂ«nave, e cila pĂ«rmbante konfigurimin e shĂ«rbimit, pĂ«rfshirĂ« njĂ« instancĂ« tĂ« serializuar.
  • Kur merrte njĂ« njoftim pĂ«r njĂ« regjistrim tĂ« ri, koordinatorĂ«t llogaritnin shpĂ«rndarjen sipas konfigurimit. Objekti i marrĂ« regjistrohej pĂ«rsĂ«ri nĂ« bazĂ«.
  • NĂ«se nyja hynte nĂ« shpĂ«rndarje, koordinatorĂ«t duhej ta bĂ«nin atĂ« deploy.

ÇfarĂ« na shqetĂ«sonte

Në një moment, arritëm në përfundimin se kështu nuk mund të punonim me shërbimet. Arsyet ishin disa.

NĂ«se gjatĂ« deploy-it ndodhte njĂ« gabim, mund tĂ« merrej vesh vetĂ«m nga log-et e asaj nyje ku ndodhi gjithçka. Ekzistonte vetĂ«m njĂ« deploy asinkron, kĂ«shtu qĂ« pas kthimit tĂ« kontrollit te pĂ«rdoruesi nga metoda e deploy-it, kĂ«rkohej njĂ« kohĂ« shtesĂ« pĂ«r tĂ« nisur shĂ«rbimin — dhe gjatĂ« kĂ«saj kohe pĂ«rdoruesi nuk mund tĂ« menaxhonte asgjĂ«. PĂ«r tĂ« zhvilluar mĂ« tej ShĂ«rbimin e GridĂ«s, pĂ«r tĂ« zhvilluar veçori tĂ« reja, pĂ«r tĂ« tĂ«rhequr pĂ«rdorues tĂ« rinj dhe pĂ«r tĂ« bĂ«rĂ« jetĂ«n e tĂ« gjithĂ«ve mĂ« tĂ« lehtĂ«, duhej tĂ« ndryshonim diçka.

Kur dizajnimin e Service Grid të ri, ne në radhë të parë dëshironim të ofronim garancinë e një deploji të sinkronizuar: sa herë që përdoruesit iu rikthye kontrolli nga API, ata mund të fillonin menjëherë të përdorin shërbimet. Po ashtu, dëshironim t'i ofronim iniciatorit mundësinë për të trajtuar gabimet e deploit.

Përveç kësaj, dëshironim ta lehtësonim implementimin, dmth. të shmangnim transaksionet dhe ribalancimin. Megjithëse cache është replikues dhe nuk ka balancim, gjatë deplojeve të mëdha me shumë node janë shfaqur probleme. Kur ndryshon topologjia, node-t duhet të shkëmbejnë informacion, dhe gjatë një deploje të madhe, këto të dhëna mund të peshojnë shumë.

Kur topologjia ishte e paqëndrueshme, koordinatori kishte nevojë të ri-kalibronte shpërndarjen e shërbimeve. Po ashtu, kur punoni me transaksione në një topologji të paqëndrueshme, kjo mund të çojë në gabime të vështira për të parashikuar.

Problemet

Cilat janë ndryshimet globale pa probleme përkatëse? E para që u shfaq ishte ndryshimi i topologjisë. Duhet të kuptohet se në çdo moment, madje edhe në momentin e deploimit të shërbimit, një node mund të hyjë ose të dalë nga klasteri. Më shumë se kaq, nëse një node hyn në klaster gjatë deploimit, do të jetë e nevojshme të kalojë informacionin për shërbimet në node-n e ri në mënyrë koherente. Dhe flasim jo vetëm për ato që tashmë janë vendosur, por edhe për deploimet aktuale dhe të ardhshme.

Kjo është vetëm një nga problemet që mund të përmbledhin në një listë të veçantë:

  • Si tĂ« deplojmĂ« shĂ«rbimet e konfiguruara statikisht gjatĂ« nisjes sĂ« node-it?
  • Dalja e node-it nga klasteri – çfarĂ« duhet tĂ« bĂ«jmĂ« nĂ«se node-i kishte angazhuar shĂ«rbime?
  • ÇfarĂ« duhet tĂ« bĂ«jmĂ« nĂ«se ndryshoi koordinatori?
  • ÇfarĂ« duhet tĂ« bĂ«jmĂ« nĂ«se klienti u ri-lidh me klasterin?
  • A duhet tĂ« trajtojmĂ« kĂ«rkesat pĂ«r aktivizim / deaktivizim dhe si?
  • E çfarĂ« nĂ«se thirret shkatĂ«rrimi i cache-it, dhe ne kemi shĂ«rbime me afinitet qĂ« varen nga ai?

Dhe kjo nuk është aspak e gjitha.

Zgjidhja

Kemi zgjedhur si qasje qëllimore qasjen e drejtuar nga ngjarjet me implementimin e komunikimit të proceseve përmes mesazheve. Në Ignite tashmë janë implementuar dy komponente, të cilat lejojnë node-t të dërgojnë mesazhe mes tyre, - communication-spi dhe discovery-spi.

Ignite Service Grid — rikarikimi

Communication-spi lejon që nodet të komunikojnë drejtpërdrejt dhe të dërgojnë mesazhe. Ai është i përshtatshëm për dërgimin e një sasi të madhe të të dhënave. Discovery-spi lejon dërgimin e një mesazhi te të gjitha nodet në klaster. Në implementimin standard, kjo bëhet me topologjinë "unazë". Gjithashtu, ka integrim me Zookeeper, në këtë rast përdoret topologjia "yll". Një pikë tjetër e rëndësishme është se discovery-spi ofron garanci se mesazhi do të dorëzohet saktësisht në rendin e duhur te të gjitha nodet.

Të shqyrtojmë protokollin e deploy-it. Të gjitha kërkesat e përdoruesve për deploy dhe undeploy dërgohen përmes discovery-spi. Kjo ofron garancitë e mëposhtme garancitë:

  • KĂ«rkesa do tĂ« pranohen nga tĂ« gjithĂ« nodet nĂ« klaster. Kjo do tĂ« lejojĂ« vazhdimin e pĂ«rpunimit tĂ« kĂ«rkesĂ«s nĂ« rast se koordinatori ndryshon. Gjithashtu, kjo do tĂ« thotĂ« se pĂ«r njĂ« mesazh tĂ« vetĂ«m, çdo nod do tĂ« ketĂ« tĂ« gjitha metadatĂ«t e nevojshme, si konfigurimi i shĂ«rbimit dhe instanca e tij e serializuar.
  • Rendi i rreptĂ« i dorĂ«zimit tĂ« mesazheve lejon zgjidhjen e konflikteve tĂ« konfigurimeve dhe kĂ«rkesave konkurruese.
  • Duke qenĂ« se hyrja e nodit nĂ« topologji pĂ«rpunsohet gjithashtu pĂ«rmes discovery-spi, nodi i ri do tĂ« marrĂ« tĂ« gjitha tĂ« dhĂ«nat e nevojshme pĂ«r tĂ« punuar me shĂ«rbimet.

Me marrjen e kërkesës, nodet në klaster e validitojnë atë dhe formojnë detyra për përpunim. Këto detyra grumbullohen në një radhë dhe pastaj përpunohen në një tjetër thread nga një punëtor i veçantë. Kjo është realizuar në këtë mënyrë, sepse deploy mund të marrë një kohë të konsiderueshme dhe ndalimi i rrjedhës së shtrirjes është i papranueshëm.

Të gjitha kërkesat nga radha përpunohen nga menaxheri i deploy-it. Ai ka një punëtor të veçantë që nxjerr një detyrë nga kjo radhë dhe e inicializon për të filluar implementimin. Pas kësaj, ndodhin hapat e mëposhtëm:

  1. Çdo nod llogarit vetĂ« shpĂ«rndarjen pĂ«rmes njĂ« funksioni tĂ« assign-it tĂ« ri dhe tĂ« caktuar.
  2. Nodet formojnë një mesazh me rezultatet e deploy-it dhe e dërgojnë atë te koordinatori.
  3. Koordinatori agregon të gjitha mesazhet dhe formon rezultatin e gjithë procesit të deploy-it, i cili dërgohet përmes discovery-spi të gjitha nodet në klaster.
  4. Me marrjen e rezultatit, procesi i deploy-it përfundon, pas së cilës detyra fshihet nga radha.

Ignite Service Grid — rikarikimi
Dizajni i ri i bazuar në ngjarje: org.apache.ignite.internal.processors.service.IgniteServiceProcessor.java

Nëse ndodhi një gabim gjatë shpalosjes, ndihmësi menjëherë e përfshin këtë gabim në mesazhin që e dërgon te koordinatori. Pas agregimit të mesazheve, koordinatori do të ketë informacion mbi të gjitha gabimet gjatë shpërndarjes dhe do ta dërgojë këtë mesazh për discovery-spi. Informacioni mbi gabimet do të jetë i disponueshëm në çdo ndihmës në klaster.

Me këtë algoritëm, trajtohen të gjitha ngjarjet e rëndësishme në Service Grid. Për shembull, ndryshimi i topologjisë është gjithashtu një mesazh për discovery-spi. Dhe në përgjithësi, nëse e krahasojmë me atë që ishte, protokolli doli mjaft i lehtë dhe i besueshëm. Aq sa të trajtojë çdo situatë gjatë shpërndarjes.

ÇfarĂ« do tĂ« ndodhĂ« mĂ« pas

Tani pĂ«r planet. Çdo pĂ«rmirĂ«sim i madh nĂ« projektin Ignite realizohet si njĂ« iniciativĂ« pĂ«r pĂ«rmirĂ«simin e Ignite, e njohur si IEP. Redizajnimi i Service Grid gjithashtu ka njĂ« IEP — IEP nr. 17 me titullin humoristik "ZĂ«vendĂ«simi i vajit nĂ« Service Grid." Por nĂ« fakt, ne e kemi ndĂ«rruar jo vetĂ«m vajin nĂ« motor, por tĂ«rĂ« motorin.

Ne i kemi ndarĂ« detyrat nĂ« IEP nĂ« 2 faza. Faza e parĂ« — faza e madhe, qĂ« pĂ«rfshin rishikimin e protokollit tĂ« shpĂ«rndarjes. Ajo tashmĂ« Ă«shtĂ« pĂ«rfshirĂ« nĂ« master, mund tĂ« provoni Service Grid tĂ« ri, i cili do tĂ« dalĂ« nĂ« versionin 2.8. Faza e dytĂ« pĂ«rfshin shumĂ« detyra tĂ« tjera:

  • RishpĂ«rndarje e nxehtĂ«
  • Versionimi i shĂ«rbimeve
  • Rritja e qĂ«ndrueshmĂ«risĂ« ndaj dĂ«shtimit
  • Klienti i hollĂ«
  • Veglat e monitorimit dhe numĂ«rimit tĂ« metrikave tĂ« ndryshme

Mund të rekomandojmë Service Grid për ndërtimin e sistemeve të qëndrueshme me disponueshmëri të lartë. Po ashtu, ju ftojmë për në dev-list dhe user-list për të ndarë përvojën tuaj. Përvoja juaj është vërtet e rëndësishme për komunitetin, ajo do të ndihmojë në kuptimin e drejtimit të ardhshëm, si të zhvillojmë komponentin në të ardhmen.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster