Tarantool Data Grid'i arhitektuur ja vÔimalused

Tarantool Data Grid'i arhitektuur ja vÔimalused

Aastal 2017 vĂ”itsime konkursi Alfa-Bank'i investeerimisĂ€ri tehingu tuuma arendamiseks ning alustasime tööd (HighLoad++ 2018 esitasime ettekande investeerimisĂ€ri tuumast esines Vladimir Drynkin, Alfa-Bank'i investeerimisĂ€ri tehingu tuuma juht). See sĂŒsteem pidi koguma tehinguandmeid erinevatest allikatest erinevates formaatides, viima andmed ĂŒhtsesse vormi, salvestama need ning tagama neile juurdepÀÀsu.

Arenduse kĂ€igus evolveeris sĂŒsteem ja sai ĂŒha rohkem funktsionaalsust, ning mingil hetkel mĂ”istsime, et meie kĂ€es on midagi palju enamat kui lihtsalt rakendus, mis on loodud kindlate ĂŒlesannete tĂ€itmiseks: meil tekkis jaotatud rakenduste sĂŒsteem pĂŒsiva salvestusega. Saadud kogemus muutus uue toote aluseks — Tarantool Data Grid (TDG).

Soovin rÀÀkida TDG arhitektuurist ja nendest lahendustest, mille oleme arendamise kÀigus leidnud, tutvustada teile pÔhifunktsiooni ning nÀidata, kuidas meie toode vÔib olla aluseks lÔpetatud lahenduste loomisel.

Arhitektuurselt oleme sĂŒsteemi jaganud eraldi rollideks, millest igaĂŒhel on oma kindlad ĂŒlesanded. Üks kĂ€ivitatud rakenduse eksemplar realiseerib ĂŒhe vĂ”i mitu tĂŒĂŒpi rolle. Klibris vĂ”ib olla mitu sama tĂŒĂŒbi rolli:

Tarantool Data Grid'i arhitektuur ja vÔimalused

Connector

Connector vastutab side eest vĂ€lismaailmaga; selle ĂŒlesanne on vastu vĂ”tta pĂ€ring, selle analĂŒĂŒsida ja kui see Ă”nnestub, edastada andmed töötlemiseks input processorile. Me toetame formaate HTTP, SOAP, Kafka, FIX. Arhitektuur vĂ”imaldab lihtsalt lisada toetust uusutele formaatidele, peagi lisandub ka IBM MQ tugi. Kui pĂ€ringu analĂŒĂŒs ebaĂ”nnestub, siis connector tagastab vea; vastasel juhul vastab ta, et pĂ€ring on edukalt töödeldud, isegi kui edasise töötlemise kĂ€igus tekkis viga. See on ette nĂ€htud töötamiseks sĂŒsteemidega, mis ei oska pĂ€ringuid uuesti esitada — vĂ”i vastupidi, teevad seda liiga jĂ€rjekindlalt. Andmete kaotsimineku vĂ€ltimiseks kasutatakse remontjĂ€rjekorda: objekt satub esmalt sinna ja ainult pĂ€rast eduka töötlemise lĂ”petamist eemaldatakse see sealt. Administraator vĂ”ib saada teateid remontjĂ€rjekorras olevate objektide kohta ning pĂ€rast programmiviga vĂ”i riistvara rikke kĂ”rvaldamist proovida uuesti.

Input processor

Input processor klassifitseerib saadud andmed iseloomulike tunnuste jĂ€rgi ja kutsub vĂ€lja sobivad töötlejjad. Töötlejateks on Lua keeles kirjutatud kood, mis kĂ€ivitub liivakastis, seega ei saa nad sĂŒsteemi toimimist mĂ”jutada. Sellel etapil saab andmeid vajaduse korral vormindada ning kĂ€ivitada suvalise arvu ĂŒlesandeid, mis vĂ”ivad ellu viia vajaliku loogika. NĂ€iteks MDM (Master Data Management) tootes, mis on ehitatud Tarantool Data Grid'i peale, uue kasutaja lisamisel, et mitte pĂ€ringu töötlust aeglustada, kĂ€ivitame kuldse kirje loomise eraldi ĂŒlesandena. Liivakast toetab lugemis-, muutmis- ja andmete lisamisjalooge ning vĂ”imaldab teatud funktsiooni teostada kĂ”igis storage tĂŒĂŒpi rollides ja koondada tulemus (map/reduce).

Töötlejad vÔivad olla kirja pandud failides:

sum.lua

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

Ja seejÀrel mÀÀratud konfiguratsioonis:

functions:
  sum: { __file: sum.lua }

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

Salvestus

Salvestus sĂ€ilitab pĂŒsivaid andmeid. Enne salvestamist lĂ€bib andmed valideerimise, et need vastaksid andmeskeemile. Skeemi kirjeldamiseks kasutame tĂ€iustatud formaati Apache Avro. NĂ€idis:

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

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

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

VĂ€ljundiprotsessor

MÔnikord tuleb uute andmete saabumise kohta teavitada vÀliseid tarbijaid, selleks on olemas VÀljundiprotsessori roll. PÀrast andmete salvestamist vÔivad need olla edastatud neile vastavale töötlejale (nÀiteks nende vormi kohandamiseks, nagu tarbija nÔuab) - ja seejÀrel edastatud konnektorile saatmiseks. Siin kasutatakse samuti remondijÀrjekorda: kui objekti keegi ei vÔtnud, saab administraator hiljem proovida uuesti.

Mastaabis

Konnektori, sisendiprotsessori ja vĂ€ljundiprotsessori rollidel ei ole olekut, mis vĂ”imaldab meil sĂŒsteemi horisontaalselt skaleerida, lihtsalt lisades uusi rakenduse instantsi vajaliku tĂŒĂŒbi rolliga. Horisontaalse skaleerimise jaoks kasutatakse salvestuses lĂ€henemist klastri korraldamiseks virtuaalsete anumate kasutamisega. PĂ€rast uue serveri lisamist kantakse osa anumatest vanadelt serveritelt taustal uuele serverile; see toimub kasutajate jaoks lĂ€bipaistvalt ja ei mĂ”juta kogu sĂŒsteemi toimimist.

Andmete omadused

Objektid vĂ”ivad olla vĂ€ga suured ja sisaldada teisi objekte. Tagame andmete lisamise ja vĂ€rskendamise aatomilisuse, sĂ€ilitades objekti koos kĂ”igi sĂ”ltuvustega ĂŒhes virtuaalses anum, vĂ€ltides objekti „laiali jooksma” mitmele fĂŒĂŒsilisele serverile.

Toetatakse versiooni haldust: iga objekti uuendus loob uue versiooni ning me saame alati teha ajas tagasi vaatamise ja nĂ€ha, millisena maailm siis oli. Andmete puhul, mis ei vaja pikka ajalugu, saame piirata versioonide arvu vĂ”i hoida ainult ĂŒhte — viimast, mis on sisuliselt versiooni halduse vĂ€ljajĂ€tmine teatud tĂŒĂŒbi puhul. Samuti saab ajaloolist teavet ajas piirata: nĂ€iteks eemaldada kĂ”ik teatud tĂŒĂŒpi objektid, mis on vanemad kui 1 aasta. Arhiveerimist toetatakse samuti: saame eksportida objekte, mis on vanemad kui mÀÀratud aeg, vabastades seelĂ€bi ruumi klastris.

Ülesanded

Huvi pĂ”nevate funktsioonide hulgas tasub vĂ€lja tuua vĂ”imalus kĂ€ivitada ĂŒlesandeid ajakava alusel, kasutaja soovil vĂ”i programmiliselt liivakasti kaudu:

Tarantool Data Grid'i arhitektuur ja vÔimalused

Siin nĂ€eme veel ĂŒhte rolli — runner. See roll ei oma seisundit ning klastrisse on vajadusel vĂ”imalik lisada tĂ€iendavaid rakenduse eksemplare selle rolliga. Runneri vastutus on ĂŒlesannete tĂ€itmine. Nagu mainitud, on liivakastist vĂ”imalik genereerida uusi ĂŒlesandeid; need salvestatakse jĂ€rjekorda storage'i ja seejĂ€rel tĂ€idetakse runneris. Selle tĂŒĂŒpi ĂŒlesandeid nimetatakse Job. Samuti on meil ĂŒlesande tĂŒĂŒp, mida nimetatakse Task — need on kasutaja mÀÀratletud ĂŒlesanded, mis kĂ€ivitatakse ajakava alusel (kasutatakse cron sĂŒntaksit) vĂ”i nĂ”udmisel. Selliste ĂŒlesannete kĂ€ivitamiseks ja jĂ€lgimiseks on meil mugav ĂŒlesande haldur. Selle funktsiooniga tutvumiseks on vajalik lubada scheduler roll; see roll omab seisundit ja seetĂ”ttu ei skaleeru, kuigi see pole vajalik; samas vĂ”ib see, nagu kĂ”ik teised rollid, omada koopiat, mis hakkab toimima, kui peamine (master) peaks ebaĂ”nnestuma.

Logger

Veel ĂŒks roll on logger. See kogub logisid kĂ”ikidelt klastri liikmetelt ning pakub liidese nende eksportimiseks ja vaatamiseks lĂ€bi veebiliidese.

Teenused

Tuleb mainida, et sĂŒsteem vĂ”imaldab lihtsalt teenuste loomist. Konfiguratsioonifailis saab mÀÀrata, milliseid pĂ€ringuid suunata kasutaja kirjutatud töötlejale, mis töötab liivakastis. Selles töötlejas saab nĂ€iteks teostada mingit analĂŒĂŒtilist pĂ€ringut ja tagastada tulemuse.

Teenust kirjeldatakse konfiguratsioonifailis:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

GraphQL API genereeritakse automaatselt ja teenus muutub kutsumiseks kÀttesaadavaks:

query {
   sum(x: 1, y: 2) 
}

See viib töötleja kutsumiseni sum, mis tagastab tulemuse:

3

KĂŒsimuste profiilimine ja metoodikad

SĂŒsteemi töötamise ja pĂ€ringute profiilimise mĂ”istmiseks oleme rakendanud OpenTracing protokolli toe. SĂŒsteem saab vajadusel edastada teavet sellele protokollile toetavatele tööriistadele, nĂ€iteks Zipkin, mis aitab vĂ€lja selgitada, kuidas pĂ€ring toimus:

Tarantool Data Grid'i arhitektuur ja vÔimalused

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

KĂ€ivitamine

Tarantool Data Grid saab paigaldada RPM-pakettide vÔi arhiivi kaudu, kasutades tarnitud utiliiti vÔi Ansible'i, samuti on olemas Kubernetes'e tugi (Tarantool Kubernetes Operator).

Äriloogikat (konfiguratsioon, töötlejad) rakendavad rakendused laaditakse paigaldatud Tarantool Data Grid klastrisse arhiivina UI kaudu vĂ”i skripti abil, kasutades meie pakutud API-d.

Rakenduste nÀited

Milliseid rakendusi saab luua Tarantool Data Grid abil? Tegelikult on enamik Àritegevusest 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 juurdepÀÀsu saada, vÔib meie toode sÀÀsta teile palju aega arenduses ja keskenduda oma Àri loogikale.

NĂ€iteks soovime koguda teavet kinnisvaraturust, et hiljem omada teavet kĂ”ige kasulikumate pakkumiste kohta. Sel juhul mÀÀratleme jĂ€rgmised ĂŒlesanded:

  1. Robotid, mis koguvad teavet avatud allikatest – need saavad olema meie andmeallikad. Selle ĂŒlesande saate lahendada, kasutades valmis lahendusi vĂ”i kirjutades koodi mis tahes keeles.
  2. PĂ€rast seda Tarantool Data Grid vĂ”tab vastu ja salvestab andmed. Kui andmeformaat erinevatest allikatest erineb, saate kirjutada koodi Lua keeles, mis viib need ĂŒhtsesse vormingusse. Eelprotsessimise etapil saate nĂ€iteks filtreerida korduvad pakkumised vĂ”i tĂ€iendavalt vĂ€rskendada andmebaasis teavet turul tegutsevate agentide kohta.
  3. NĂŒĂŒd on teil juba olemas skaleeritav lahendus klastris, kuhu saab andmeid lisada ja andmeid pĂ€rida. Edasi saate rakendada uut funktsionaalsust, nĂ€iteks kirjutada teenuse, mis teeb pĂ€ringu andmetele ja esitab kĂ”ige kasulikuma pakkumise pĂ€eva jooksul — see nĂ”uab mĂ”ningaid rea konfiguratsioonifailis ja natuke koodi ilk Lua.

Mis edasi?

Meie prioriteet on arendamise mugavuse suurendamine lÀbi Tarantool Data Grid. NÀiteks on see IDE, mis toetab profiligeerimist ja silumist liideseid, mis töötavad liivakastis.

Samuti pöörame suurt tĂ€helepanu turvakĂŒsimustele. Just praegu lĂ€bite FSTEK Venemaa sertifitseerimist, et kinnitada kĂ”rget turvalisuse taset ja vastata nĂ”uetele, mis on seotud sertifitseeritud tarkvaratoodete kasutamisega isikuandmete teabe sĂŒsteemides ja riiklike teabe sĂŒsteemides.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster