Tarantool Data Grid arhitektuur ja vÔimalused

Tarantool Data Grid arhitektuur ja vÔimalused

2017. aastal vĂ”itsime konkursi investeerimisharu tehingu tuumajĂ”u vĂ€ljatöötamiseks Alfa-Banki jaoks ja alustasime tööd (HighLoad++ 2018 esitluses investeerimisharu tuumast esitles Vladimir Drynkin, investeerimisharu tehingu tuuma suuna juht). See sĂŒsteem pidi koguma tehinguandmeid erinevatest allikatest erinevates formaatides, ĂŒhtlustama andmed, talletama need ja vĂ”imaldama nendele juurdepÀÀsu.

Arenduse kĂ€igus arenes sĂŒsteem ja sai juurde funktsionaalsust ning mingil hetkel mĂ”istsime, et meil tekib midagi palju enamat kui lihtsalt rakendus, mis on loodud spetsiifiliste probleemide lahendamiseks: meil oli tekkinud jaotatud rakenduste ehitamise sĂŒsteem, millel on pĂŒsiv andmehoidla. Meie saadud kogemus andis aluse uuele tootusele — Tarantool Data Grid (TDG).

Soovin rÀÀkida TDG arhitektuurist ja nendest lahendustest, mille oleme arendamise kÀigus leidnud, tutvustada teile peamist funktsionaalsust ja nÀidata, kuidas meie toode vÔib olla alus tÀielike lahenduste loomiseks.

Arhitektuuriliselt oleme sĂŒsteemi jaganud eraldi rollide, millest igaĂŒhel on vastutus teatud ĂŒlesannete lahendamiseks. Üks kĂ€ivitatud rakenduse eksemplar rakendab ĂŒhte vĂ”i mitut tĂŒĂŒpi rolli. Klusteris vĂ”ib olla mitu sama tĂŒĂŒpi rolli:

Tarantool Data Grid arhitektuur ja vÔimalused

Connector

Connector vastutab ĂŒhenduse eest vĂ€lismaailmaga; tema ĂŒlesanne on vastu vĂ”tta pĂ€ring, see analĂŒĂŒsida ja kui see Ă”nnestub, saata andmed töötlemiseks sisendprotsessorile. Me toetame vormate HTTP, SOAP, Kafka, FIX. Arhitektuur vĂ”imaldab lihtsalt lisada uute formaatide tuge, peagi lisandub tugi IBM MQ-le. Kui pĂ€ringu analĂŒĂŒs lĂ”ppes veaga, tagastab connector vea; vastasel juhul vastab ta, et pĂ€ring töötati edukalt, isegi kui selle edasisel töötlemisel tekkis viga. See on tehtud spetsiaalselt selleks, et töötada sĂŒsteemidega, mis ei oska pĂ€ringut uuesti saata — vĂ”i vastupidi, teevad seda liiga jĂ€rjekindlalt. Andmete kaotamise vĂ€ltimiseks kasutatakse remondijĂ€rjekorda: objekt suunatakse esmalt sinna ja alles pĂ€rast edukat töötlemist eemaldatakse sealt. Administrator vĂ”ib saada teateid objektide kohta, mis on jÀÀnud remondijĂ€rjekorda, ja pĂ€rast tarkvaravea vĂ”i riistvararikke kĂ”rvaldamist teha uuesti katse.

Sisendprotsessor

Sisendprotsessor klassifitseerib saadud andmed iseloomulike omaduste jĂ€rgi ning kutsub vĂ€lja sobivad töötlejad. Töötlejad on kood keeles Lua, mis kĂ€ivitatakse liivakastis, seega ei saa nad sĂŒsteemi toimimist mĂ”jutada. Sel etapil saab andmeid viia nĂ”utud vormi ning vajadusel kĂ€ivitada ettearvamatult palju ĂŒlesandeid, mis vĂ”ivad rakendada vajalikku loogikat. NĂ€iteks tootes MDM (Master Data Management), mis on loodud Tarantool Data Grid'il, kĂ€ivitame uue kasutaja lisamisel, et mitte aeglustada pĂ€ringu töötlemist, kuldse kirje loomise eraldi ĂŒlesandena. Liivakast toetab lugemiseks, muutmiseks ja andmete lisamiseks mĂ”eldud pĂ€ringuid, vĂ”imaldab teatud funktsioone teostada kĂ”igi storage tĂŒĂŒpi rollide puhul ning tulemuse aggregeerimist (map/reduce).

Töötlejad vÔivad olla kirjeldatud failides:

sum.lua

local x, y = unpack(...)
return x + y

Ja seejÀrel kuulutatud konfiguratsioonis:

functions:
  sum: { __file: sum.lua }

Miks Lua? Lua on vĂ€ga lihtne keel. Meie kogemuse jĂ€rgi hakkavad inimesed vaid paar tundi pĂ€rast sellega tutvumist kirjutama koodi, mis lahendab nende probleeme. Ja see ei ole ainult professionaalsed arendajad, vaid nĂ€iteks ka analĂŒĂŒtikud. Lisaks töötab Lua jit-kompilaatori tĂ”ttu vĂ€ga kiiresti.

Salvestus

Storage salvestab pĂŒsivaid andmeid. Enne salvestamist tĂ”endatakse, et andmed vastavad andmeskeemile. Skeemide kirjeldamiseks kasutame laiendatud formaati. Apache Avro. NĂ€ide:

{
    "name": "Kasutaja",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

Selle kirjelduse pÔhjal genereeritakse automaatselt DDL (Data Definition Language) Tarantul DB jaoks ja GraphQL skeem andmete juurde pÀÀsemiseks.

Toetatakse asĂŒnkroonselt andmete replikatsiooni (plaanis on lisada sĂŒnkroonne).

VÀljundi töötleja

MÔnikord tuleb vÀliseid tarbijaid uute andmete saabumisest teavitada, selleks on olemas Output processori roll. PÀrast andmete salvestamist vÔivad need olla edastatud vastavale töötlejale (nÀiteks et viia need tarbija nÔutud vormi) - ja seejÀrel edastatakse need connectorile saatmiseks. Siin kasutatakse samuti parandusteenust: kui objekt ei ole kedagi aktsepteerinud, vÔib administraator proovida hiljem uuesti.

Mastaapimine

Connectori, input processori ja output processori rollidel ei ole seisundit, mis vĂ”imaldab meil sĂŒsteemi horisontaalselt skaleerida, lihtsalt lisades uusi rakenduse eksemplare vajaliku tĂŒĂŒbi rolliga. Horisontaalsete skaalade jaoks kasutatakse storage'i lĂ€henemist klastri korraldamiseks virtuaalsete konteinerite abil. Uue serveri lisamisel liigub osa konteinetest vanadelt serveritelt taustal uuele serverile; see toimub kasutajate jaoks sujuvalt ja ei mĂ”juta kogu sĂŒsteemi tööd.

Andmete omadused

Objektid vĂ”ivad olla vĂ€ga suured ja sisaldada teisi objekte. Me tagame andmete lisamise ja uuendamise aatomilisuse, sĂ€ilitades objekti koos kĂ”igi sĂ”ltuvustega ĂŒhes virtuaalses mahutis. Nii vĂ€listame objekti "laiali valgumise" mitmetesse fĂŒĂŒsilistesse serveritesse.

Toetatakse versioonimist: iga objekti uuendus loob uue versiooni, ja me saame alati teha ajas kĂ€rpe, et vaadata, milline maailm oli siis. Andmete puhul, mis ei vaja pikka ajalugu, saame piirata versioonide arvu vĂ”i hoida ainult ĂŒhte — viimast, mis tĂ€hendab, et saame tegelikult vĂ€lja lĂŒlitada versioonimise teatud tĂŒĂŒbi jaoks. Samuti saame piirata ajalugu ajaliselt: nĂ€iteks kustutada kĂ”ik teatud tĂŒĂŒpi objektid, mis on ĂŒle 1 aasta vanad. Toetatakse ka arhiveerimist: me saame eksportida objektid, mis on vanemad kui mÀÀratud aeg, vabastades ruumi klastris.

Ülesanded

Huvitavatest funktsioonidest tasub mĂ€rkida vĂ”imalust ĂŒlesannete kĂ€ivitamiseks ajakava jĂ€rgi, kasutaja pĂ€ringu alusel vĂ”i programmiliselt liivakastist:

Tarantool Data Grid arhitektuur ja vÔimalused

Siin nĂ€eme veel ĂŒhte rolli — runner. See roll ei oma olekut, ning vajadusel saab klastrisse lisada tĂ€iendavaid rakenduse eksemplare selle rolliga. Runneri ĂŒlesanne on ĂŒlesannete tĂ€itmine. Nagu on öeldud, on vĂ”imalik liivakastist genereerida uusi ĂŒlesandeid; need salvestatakse storage'i jĂ€rjekorda ja hiljem tĂ€idetakse runneris. Seda tĂŒĂŒpi ĂŒlesandeid nimetatakse Job'iks. Samuti on meil ĂŒlesandete tĂŒĂŒp, mida nimetatakse Task'iks — need on kasutaja mÀÀratud ĂŒlesanded, mis kĂ€ivitatakse kas ajakava jĂ€rgi (kasutatakse cron sĂŒntaksit) vĂ”i nĂ”udmisel. Nende ĂŒlesannete kĂ€ivitamiseks ja jĂ€lgimiseks on meil mugav ĂŒlesannete haldur. Selle funktsionaalsuse kasutamiseks peab olema sisse lĂŒlitatud scheduleri roll; see roll omab olekut, mistĂ”ttu see ei ole skaleeritav, kuigi see pole vajalik; samas vĂ”ib sellel olla replikatsioon, mis hakkab tööle, kui master peaks Ă€kki ebaĂ”nnestuma.

Logger

Teine roll kannab nime logger. See kogub logisid kÔigilt klastriliikmetelt ning pakub liidese nende vÀljundiks ja vaatamiseks lÀbi veebiliidese.

Teenused

VÀÀrib mainimist, et sĂŒsteem vĂ”imaldab hĂ”lpsasti teenuseid luua. Konfiguratsioonifailis saab mÀÀrata, millised pĂ€ringud suunatakse kasutaja kirjutatud töötlejale, mis töötab liivakastis. Selles töötlejas saab nĂ€iteks teostada mĂ”ne analĂŒĂŒtilise pĂ€ringu ja tagastada tulemuse.

Teenust kirjeldatakse konfiguratsioonifailis:

teenused:
   sum:
      doc: "liidab kaks numbrit"
      funktsioon: sum
      tagastustĂŒĂŒp: int
      argumendid:
         x: int
         y: int

GraphQL API genereeritakse automaatselt ja teenus muutub kÀttevÔtmiseks kÀttesaadavaks:

pÀring {
   sum(x: 1, y: 2) 
}

See kutsub vÀlja töötlejat sum, mis tagastab tulemuse:

3

PÀringute profiilimine ja mÔÔdikud

SĂŒsteemi töö ja pĂ€ringute profiilimise mĂ”istmiseks oleme rakendanud OpenTracing protokolli toe. SĂŒsteem vĂ”ib nĂ”udmisel saata teavet protokolli toetavatele tööriistadele, nĂ€iteks Zipkin, mis aitab mĂ”ista, kuidas pĂ€ring tehti:

Tarantool Data Grid arhitektuur ja vÔimalused

Muidugi pakub sĂŒsteem sisemisi mÔÔdikuid, mida saab koguda Prometheuse abil ja visualiseerida Grafana abil.

Juhtimistöö

Tarantool Data Grid saab juurutada RPM-pakettide vÔi arhiivi kaudu, kasutades tarnimiselt saadud utiliite vÔi Ansible'i, samuti on saadaval toetus Kubernetes'ele (Tarantool Kubernetes Operator).

Äpis, mis rakendab Ă€riloogikat (konfiguratsioon, töötlejate) laaditakse juurutatud Tarantool Data Grid klastrisse arhiivina lĂ€bi kasutajaliidese vĂ”i skripti abil, meie pakutava API kaudu.

Rakenduse nÀited

Milliseid rakendusi saab luua Tarantool Data Gridiga? Tegelikult on enamik Àriprobleeme mingil moel seotud andmevoogude töötlemise, nende salvestamise ja neile juurdepÀÀsuga. SeetÔttu, kui teil on suured andmevood, mida tuleb usaldusvÀÀrselt salvestada ja neile juurde pÀÀseda, siis meie toode vÔib sÀÀsta teile palju arendusaja, vÔimaldades keskenduda oma Àriloogikale.

NĂ€iteks soovime koguda teavet kinnisvaraturu kohta, et hiljem nĂ€iteks saada teavet kĂ”ige soodsamatest pakkumistest. Sel juhul eristame jĂ€rgmisi ĂŒlesandeid:

  1. Robotid, mis koguvad teavet avatud allikatest - need on meie andmeallikad. Selle ĂŒlesande saate lahendada, kasutades valmis lahendusi vĂ”i kirjutades koodi mis tahes keeles.
  2. Edasi vĂ”tab ja salvestab Tarantool Data Grid andmed. Kui andmeformaat erinevates allikates erineb, vĂ”ite kirjutada koodi Lua keeles, mis viib selle ĂŒhtsesse formaati. Eelprotsessimise etapis saate nĂ€iteks filtreerida korduvaid lauseid vĂ”i vĂ€rskendada andmebaasis agentide kohta olevat teavet, kes turul tegutsevad.
  3. NĂŒĂŒd on teil juba skaleeritav lahendus klastris, millega saab andmeid tĂ€ita ja andmeid vĂ€lja teha. Edasi saate rakendada uusi funktsioone, nĂ€iteks kirjutada teenuse, mis teeb pĂ€ringu andmetele ja esitab kĂ”ige kasumlikuma pakkumise ĂŒhe pĂ€eva jooksul — see nĂ”uab vaid paari rida konfiguratsioonifailis ja natuke koodi Lua keeles.

Mis edasi?

Meie prioriteet on arendamise mugavuse suurendamine Tarantool Data Grid. NÀiteks on see IDE, mis toetab profiilimist ja silumist, mis töötab liivakastis.

Me pöörame ka suurt tĂ€helepanu turvakĂŒsimustele. Praegu lĂ€bime Venemaa FSTEK sertifitseerimist, et kinnitada kĂ”rge turvalisuse tase ja vastata tarkvarade sertifitseerimise nĂ”uetele, mida kasutatakse isikuandmete ja riiklike teabe sĂŒsteemide infosĂŒsteemides.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster