26. veebruaril korraldasime Apache Ignite GreenSourcei kohtumise, kus esinesid avatud lĂ€htekoodiga projekti kontributsioonide autorid. Selle kogukonna elu tĂ€htsaks sĂŒndmuseks oli komponendi ĂŒmberkujundamine , mis vĂ”imaldab kasutajate mikroteenuseid otse Ignite'i klastris rakendada. Sellest keerulisest protsessist rÀÀkis kohtumisel , tarkvarainsener ja juba rohkem kui kahe aasta kontributsioonide autor Apache Ignite'is.

Alustame sellest, mis on Apache Ignite. See on andmebaas, mis esindab hajutatud vĂ”tme/vÀÀrtuse salvestust, millel on SQL, tehingute ja vahemĂ€lu toetus. Lisaks vĂ”imaldab Ignite kasutajate teenuseid otse Ignite'i klastris rakendada. Arendajatel on juurdepÀÀs kĂ”ikidele tööriistadele, mida Ignite pakub â hajutatud andmestruktuurid, vestlus, voog, arvutamine ja andmevĂ”rk. NĂ€iteks Data Grid'i kasutamisel kaob vajadus andmesalvestusele eraldi infrastruktuuri haldamiseks, mis omakorda vĂ€hendab sellega seotud kulusid.

Kasutades API Service Grid'i, saab teenuse rakendada lihtsalt, mÀÀrates konfigureerimises rakendamise skeemi ja vastava teenuse.
Tavaliselt on deploy skeem nĂ€itaja klastris sĂ”lmedes kasutatavate instantside arvu. On kaks tĂŒĂŒpilist deploy skeemi. Esimene on Cluster Singleton: igal ajahetkel on klastris garanteeritult saadaval ĂŒks kasutaja teenuse instants. Teine on Node Singleton: igas klastrisĂ”lmes on ĂŒks teenuse instants.

Kasutaja vÔib samuti mÀÀrata teenuse instantside arvu kogu klastris ja mÀÀratleda predikaadi sobivate sÔlmede filtreerimiseks. Sellisel juhul arvutab Service Grid automaatselt optimaalse jaotuse teenuste deploy jaoks.
Lisaks on olemas funktsioon nimega Affinity Service. Affinity on funktsioon, mis mÀÀratleb vÔtmete seose partitsioonidega ja partii seose sÔlmedega topoloogias. VÔtme kaudu saab mÀÀrata primaarse sÔlme, kus andmed asuvad. Seega saab siduda oma teenuse vÔtmega ja affinity-funktsiooni vahemÀluga. Kui affinity-funktsioon muutub, toimub automaatne redeploy. Nii asetatakse teenus alati andmete lÀhedale, millega ta peab töötama, vÀhendades seelÀbi juurdepÀÀsu kulusid teabele. Sellist skeemi vÔib nimetada omamoodi kolokatsiooniks.
NĂŒĂŒd, kui oleme arutanud Service Gridi eeliseid, rÀÀgime selle arengulugu.
Mis oli varem
Eelmise Service Gridi teostus pĂ”hines Ignite'i tehingute replikatsioonil pĂ”hineval sĂŒsteemi vahemĂ€lul. Ignite'i all peetakse silmas salvestusruumi. See ei ole midagi ajutist, nagu vĂ”iks arvata. Kuigi vahemĂ€lu on replikatsiooniga ja iga sĂ”lm sisaldab kogu andmekogumit, on vahemĂ€lu sees partitsioneeritud esitus. See on seotud salvestusruumide optimeerimisega.

Mis juhtus, kui kasutaja soovis teenust juurutada?
- Klastri kÔik sÔlmed registreerusid andmete uuenduste jaoks salvestuses, kasutades sisseehitatud Continuous Query mehhanismi.
- Algatava sÔlme read-committed tehingu all tehti andmebaasi kirje, mis sisaldas teenuse konfiguratsiooni, sealhulgas serialiseeritud instantsi.
- Uue kirje saamisel arvutas koordinaator jaotuse vÀlja konfiguratsiooni pÔhjal. Saadud objekt kirjutati tagasi andmebaasi.
- Kui sÔlm kuulus jaotusse, pidi koordinaator selle juurutama.
Mis meid ei rahuldanud
Mingil hetkel jÔudsime jÀreldusele: teenustega ei saa nii töötada. PÔhjuseid oli mitu.
Kui juurutamise ajal ilmnes mingi viga, sai sellest teada vaid selle sĂ”lme logidest, kus see aset leidis. Oli olemas ainult asĂŒnkroonne juurutamine, seega pĂ€rast juurutamismeetodist kasutaja juhtimise tagasiandmist vajas teenuse kĂ€ivitamine mĂ”ningast lisaaega â ja sel ajal ei saanud kasutaja millegagi operatiivset. Service Gridi edasiviimiseks, uute funktsioonide arendamiseks, uute kasutajate kaasamiseks ja elu kĂ”igile lihtsamaks tegemiseks on vajalik midagi muuta.
Uue Service Gridi kavandamisel soovisime eelkĂ”ige tagada sĂŒnkroonse juurutamise: niipea kui kasutaja sai API-lt juhtimise tagasi, sai ta kohe teenuseid kasutada. Samuti soovisime anda algatajale vĂ”imaluse juurutamisvigu töödelda.
Lisaks soovisime hĂ”lbustada teostust, nimelt eemalduda tehingutest ja ĂŒmberjaotamisest. Kuigi vahemĂ€lu on replitseeritud ja tasakaalustamist ei toimu, tekkisid suure juurutamise ajal, millel oli palju sĂ”lmi, probleemid. SĂ”lmed peavad teabe vahetamiseks suhtlema ning suure juurutamise korral vĂ”ivad need andmed olla vĂ€ga suured.
Kui topoloogia oli ebastabiilne, pidi koordinaator teenuste jaotust uuesti arvutama. Ăldiselt, kui tuleb töötada tehingutega ebastabiilses topoloogias, vĂ”ib see viia keeruliselt prognoositavate vigadeni.
Probleemid
Millised suured muutused tulevad ilma kaasnevate probleemideta? Esimene neist oli topoloogia muutmine. Tuleb mÔista, et igal hetkel, isegi teenuse juurutamise ajal, vÔib sÔlm liituda klastri vÔi sellest lahkuda. Veelgi enam, kui sÔlm liitub klastri ajal, tuleb kogu teenuste informatsioon jÀrjepidevalt edastada uuele sÔlmele. Ja jutt ei kÀi ainult sellest, mis on juba juurutatud, vaid ka praegustest ja tulevastest juurutustest.
See on vaid ĂŒks probleem, mille vĂ”ib koostada eraldi nimekirjaks:
- Kuidas juurutada staatiliselt konfigureeritud teenuseid sÔlme kÀivitamisel?
- SĂ”lme vĂ€ljumine klastrimisest â mida teha, kui sĂ”lm hostis teenuseid?
- Mida teha, kui koordinaator on vahetunud?
- Mida teha, kui klient on klastri juurde uuesti ĂŒhendunud?
- Kas oleks vaja töötleda aktiveerimise/deaktiveerimise pÀringuid ja kuidas?
- Ent mis siis, kui me kutsume ĂŒles andmete kustutamist, kuid meil on selle kĂŒlge seotud afiinsus-tegevused?
Ja see on alles kaugel.
Lahendus
SihtmĂ€rgiks valisime sĂŒndmuspĂ”hise lĂ€henemise, rakendades protsesside vahelist suhtlemist sĂ”numite kaudu. Ignite'is on juba rakendatud kaks komponenti, mis vĂ”imaldavad sĂ”lmedel omavahel sĂ”numeid edastada â communication-spi ja discovery-spi.

Communication-spi vÔimaldab sÔlmedel otse suhelda ja sÔnumeid edastada. See sobib suure hulga andmete edastamiseks. Discovery-spi vÔimaldab saata sÔnumi kÔigile sÔlmedele klastris. Standartse teostuse korral toimub see 'ring' topoloogia kaudu. Samuti on olemas integratsioon Zookeeperiga, juhul kasutatakse 'tÀht' topoloogiat. Oluline on mÀrkida, et discovery-spi annab garantiisid, et sÔnum toimetatakse kindlasti Ôiges jÀrjekorras kÔigile sÔlmedele.
Vaatame juurutamise protokolli. KÔik kasutaja taotlused juurutamiseks ja eemaldamiseks saadetakse discovery-spi kaudu. See annab jÀrgmised garantiid:
- PĂ€ringu saavad kĂ”ik klastris olevad sĂ”lmed. See vĂ”imaldab pĂ€ringu töötlemist koordinaatori vahetamisel. Samuti tĂ€hendab see, et iga sĂ”lme jaoks on ĂŒhe sĂ”numi korral kĂ”ik vajalikud metaandmed, nagu teenuse seadistus ja selle serialiseeritud instants.
- Range sÔnumite kohaletoimetamise jÀrjekord vÔimaldab lahendada seadistuste ja konkureerivate pÀringute konflikte.
- Kuna sÔlme sisenemine topoloogiasse töödeldakse ka discovery-spi kaudu, jÔuavad kÔik teenustega töötamiseks vajalikud andmed uuele sÔlmele.
PĂ€ringu saamisel valideerivad klastris olevad sĂ”lmed selle ja koostavad töötlemise ĂŒlesanded. Need ĂŒlesanded pannakse jĂ€rjekorda ning seejĂ€rel töödeldakse neid teises lĂ”imes eraldi töötaja poolt. See on ellu viidud just niimoodi, et juurutamine vĂ”ib vĂ”tta mĂ€rkimisvÀÀrset aega ja kallist discovery-voogu ei tohi viivitada.
Kogu jĂ€rjekonnast saadud pĂ€ringud töötleb juurutushaldur. Tal on eriline töötaja, kes vĂ”tab ĂŒlesande sellest jĂ€rjekorrast ja initsialiseerib selle, et alustada juurutamist. PĂ€rast seda toimuvad jĂ€rgmised toimingud:
- Iga sÔlm arvutab jaotuse iseseisvalt tÀnu uuele deterministlikule mÀÀramisfunktsioonile.
- SĂ”lmed koostavad teate deploĂŒri tulemustega ja saadavad selle koordinaatorile.
- Koordinaator kogub kĂ”ik teated ja koostab kogu deploĂŒri protsessi tulemuse, mis saadetakse discovery-spi kaudu kĂ”igile klastris asuvatele sĂ”lmedele.
- Kui tulemus on saadud, lĂ”peb deploĂŒri protsess ja ĂŒlesanne eemaldatakse jĂ€rjekorrast.

Uus ĂŒritustel pĂ”hinev disain: org.apache.ignite.internal.processors.service.IgniteServiceProcessor.java
Kui deployimise hetkel ilmneb viga, lisab sÔlm selle vea kohe teatesse, mille ta saadab koordinaatorile. PÀrast teate kogumist omab koordinaator teavet kÔigi deployimise ajal esinenud vigade kohta ja saadab teate discovery-spi kaudu. Teave vigade kohta on kergesti ligipÀÀsetav igas klastris asuvas sÔlmes.
Selle töö algoritmi alusel töödeldakse kĂ”iki olulisi sĂŒndmusi Teenuse Gridis. NĂ€iteks on ka topoloogia muutmine discovery-spi kaudu saadetud teade. Ja ĂŒldiselt, vĂ”rreldes varasema lĂ€henemisega, on protokoll piisavalt kergkaaluline ja usaldusvÀÀrne. SedavĂ”rd, et suudab kĂ€sitleda igasuguseid olukordi deployimise ajal.
Mis jÀrgmiseks?
NĂŒĂŒd plaanidest. Iga suur muudatus Ignite projektis tehakse kui algatus Ignite paremaks muutmiseks, nn IEP. Ka Service Grid'i ĂŒmberkujundamisel on IEP â naljakalt nimelt «Ăli vahetus Service Grid'is». Kuid tegelikult muutisime mitte ainult mootori Ă”li, vaid kogu mootori.
IEP ĂŒlesanded on jagatud kaheks faasiks. Esimene â suur faas, mis hĂ”lmab juurutamisprotokolli ĂŒmberehitust. See on juba masterisse lisatud, saate proovida uut Service Grid'i, mis ilmub versioonis 2.8. Teine faas sisaldab paljusid teisi ĂŒlesandeid:
- Kuum redemodeerimine
- Teenuste versioonimine
- Rikkes taluvuse suurendamine
- Ăhuke klient
- JÀlgimise ja erinevate mÔÔdikute arvestamise tööriistad
LĂ”petuseks vĂ”ime soovitada teile Service Grid'i kĂ”rge kĂ€ttesaadavuse ja rikketaluvate sĂŒsteemide loomiseks. Samuti kutsume teid liituma meiega ja jagama oma kogemusi. Teie kogemus on tĂ”eliselt oluline kogukonna jaoks, see aitab mĂ”ista, kuhu edasi liikuda ja kuidas arendada komponenti tulevikus.
Allikas: habr.com
