Tarantool Data Gridi arhitektuur ja võimalused

Tarantool Data Gridi arhitektuur ja võimalused

2017. aastal võitsime konkursi Alfa-Banki investeerimisäri tehingutuumiku arendamiseks ja alustasime tööd (HighLoad++ 2018 aruandega investeerimisäri tuuma kohta rääkis Vladimir Drynkin, Alfa panga investeerimisäri tehingutuumiku juht). See süsteem pidi koondama erinevatest allikatest pärit tehinguandmeid erinevates vormingutes, viima andmed ühtsesse vormi, salvestama ja võimaldama neile juurdepääsu.

Arendusprotsessi käigus süsteem arenes ja omandas funktsionaalsuse ning ühel hetkel mõistsime, et kristalliseerime midagi palju enamat kui lihtsalt rakendustarkvara, mis on loodud rangelt määratletud ülesannete lahendamiseks: see õnnestus. süsteem püsiva salvestusruumiga hajutatud rakenduste loomiseks. Saadud kogemused pani aluse uuele tootele - Tarantooli andmevõrk (TDG).

Tahan rääkida TDG arhitektuurist ja lahendustest, milleni arendusprotsessi käigus jõudsime, tutvustada peamisi funktsionaalsusi ning näidata, kuidas meie tootest saab terviklik lahenduste ehitamise alus.

Arhitektuuriliselt jagasime süsteemi eraldi roll, millest igaüks vastutab teatud probleemide lahendamise eest. Üks töötav rakenduse eksemplar rakendab ühte või mitut rollitüüpi. Klastris võib olla mitu sama tüüpi rolli:

Tarantool Data Gridi arhitektuur ja võimalused

Connector

Connector vastutab suhtlemise eest välismaailmaga; tema ülesanne on päring vastu võtta, sõeluda ja kui see õnnestub, siis saata andmed töötlemiseks sisendprotsessorile. Toetame HTTP, SOAP, Kafka, FIX vorminguid. Arhitektuur võimaldab teil lihtsalt lisada tuge uutele vormingutele ning IBM MQ tugi on peagi saadaval. Kui päringu sõelumine ebaõnnestus, tagastab konnektor veateate; vastasel juhul vastab ta, et päringu töötlemine õnnestus, isegi kui selle edasise töötlemise käigus ilmnes tõrge. Seda tehti spetsiaalselt selleks, et töötada süsteemidega, mis ei tea, kuidas taotlusi korrata - või vastupidi, teevad seda liiga visalt. Et andmeid mitte kaotada, kasutatakse remondijärjekorda: esmalt satub objekt sinna ja alles pärast edukat töötlemist eemaldatakse sealt. Administraator saab teateid remondijärjekorda jäänud objektide kohta ja pärast tarkvaravea või riistvararikke kõrvaldamist proovige uuesti.

Sisendprotsessor

Sisendprotsessor liigitab vastuvõetud andmed iseloomulike tunnuste järgi ja kutsub välja vastavad protsessorid. Käsitlejad on Lua kood, mis töötab liivakastis, seega ei saa need mõjutada süsteemi toimimist. Selles etapis saab andmeid taandada vajalikule kujule ning vajadusel käivitada suvalise hulga ülesandeid, mis suudavad vajaliku loogika realiseerida. Näiteks Tarantool Data Gridile üles ehitatud MDM (Master Data Management) tootes käivitame uue kasutaja lisamisel, et päringu töötlemist mitte aeglustada, eraldi ülesandena kuldse rekordi loomise. Liivakast toetab andmete lugemise, muutmise ja lisamise taotlusi, võimaldab täita mõnda funktsiooni kõigis salvestustüübi rollides ja tulemuste koondamises (map/reduce).

Käsitlejaid saab kirjeldada failides:

sum.lua

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

Ja siis konfiguratsioonis deklareeritud:

functions:
  sum: { __file: sum.lua }

Miks Lua? Lua keel on väga lihtne keel. Meie kogemuse põhjal hakkavad inimesed paar tundi pärast selle tundmaõppimist kirjutama koodi, mis nende probleemi lahendab. Ja need pole ainult professionaalsed arendajad, vaid näiteks analüütikud. Lisaks töötab Lua tänu jit-kompilaatorile väga kiiresti.

Säilitamine

Salvestusruum salvestab püsivaid andmeid. Enne salvestamist kontrollitakse andmeid andmeskeemi alusel. Skeemi kirjeldamiseks kasutame laiendatud vormingut Apache Avro... Näide:

{
    "name": "User",
    "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 Tarantula DBMS-i jaoks automaatselt DDL (Data Definition Language). GraphQL andmetele juurdepääsu skeem.

Toetatud on andmete asünkroonne replikatsioon (plaanis on lisada sünkroonne).

Väljundprotsessor

Mõnikord on vaja välistarbijaid uute andmete saabumisest teavitada, selleks on Output processor roll. Pärast andmete salvestamist saab need edastada vastavale töötlejale (näiteks viia need tarbija poolt nõutavale vormile) – ja seejärel edastada konnektorisse saatmiseks. Siin kasutatakse ka remondijärjekorda: kui keegi objekti vastu ei võtnud, saab administraator hiljem uuesti proovida.

Skaleerimine

Konnektori, sisendprotsessori ja väljundprotsessori rollid on olekuta, võimaldades meil süsteemi horisontaalselt skaleerida, lisades lihtsalt uued soovitud rollitüübiga rakenduse eksemplarid. Salvestusruumi kasutatakse horisontaalseks skaleerimiseks lähenemine klastri korraldamiseks virtuaalsete ämbrite abil. Pärast uue serveri lisamist teisaldatakse osa vanade serverite ämbritest taustal uude serverisse; see toimub kasutajatele läbipaistvalt ega mõjuta kogu süsteemi tööd.

Andmete atribuudid

Objektid võivad olla väga suured ja sisaldada muid objekte. Tagame andmete lisamise ja uuendamise aatomilisuse, salvestades objekti koos kõigi sõltuvustega ühte virtuaalsesse ämbrisse. See takistab objekti "laialivalgumist" mitme füüsilise serveri vahel.

Toetatakse versioonide loomist: iga objekti värskendus loob uue versiooni ja me saame alati võtta ajalõike ja vaadata, kuidas maailm siis välja nägi. Andmete puhul, mis ei vaja pikka ajalugu, saame piirata versioonide arvu või isegi salvestada ainult ühe – uusima – ehk sisuliselt keelata teatud tüüpi versioonide loomise. Ajalugu saab piirata ka ajaliselt: näiteks kustutada kõik teatud tüüpi objektid, mis on vanemad kui 1 aasta. Toetatud on ka arhiveerimine: saame maha laadida määratud ajast vanemad objektid, vabastades klastris ruumi.

ülesanded

Huvitavate funktsioonide hulgas väärib märkimist võimalus käivitada ülesandeid ajakava järgi, kasutaja soovil või programmiliselt liivakastist:

Tarantool Data Gridi arhitektuur ja võimalused

Siin näeme teist rolli – jooksjat. See roll on olekuta ja selle rolliga rakenduse eksemplare saab vajaduse korral klastrisse lisada. Jooksja kohustus on ülesannete täitmine. Nagu mainitud, on liivakastist võimalik genereerida uusi ülesandeid; need salvestatakse salvestusruumi järjekorda ja seejärel käivitatakse jooksjas. Seda tüüpi ülesandeid nimetatakse tööks. Meil on ka ülesande tüüp nimega Task – need on kasutaja määratud ülesanded, mis töötavad ajakava alusel (kasutades cron süntaksit) või nõudmisel. Selliste ülesannete käivitamiseks ja jälgimiseks on meil mugav tegumihaldur. Selle funktsiooni kasutamiseks peate lubama planeerija rolli; sellel rollil on olek, seega see ei skaleeru, mis aga pole nõutav; samas, nagu ka kõigil teistel rollidel, võib sellel olla koopia, mis hakkab tööle, kui kapten ootamatult keeldub.

Logger

Teist rolli nimetatakse logijaks. See kogub logisid kõigilt klastri liikmetelt ning pakub liidest nende veebiliidese kaudu üleslaadimiseks ja vaatamiseks.

Teenused

Tasub mainida, et süsteem teeb teenuste loomise lihtsaks. Konfiguratsioonifailis saate määrata, millised päringud saadetakse kasutaja kirjutatud töötlejale, mis töötab liivakastis. Selles töötlejas saate näiteks käivitada mingi analüütilise päringu 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 helistamiseks kättesaadavaks:

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

See helistab käitlejale summis tagastab tulemuse:

3

Päringu profileerimine ja mõõdikud

Süsteemi toimimise ja profiilitaotluste mõistmiseks rakendasime OpenTracingi protokolli toe. Süsteem saab nõudmisel saata teavet seda protokolli toetavatele tööriistadele (nt Zipkin), mis võimaldab teil mõista, kuidas päring täideti:

Tarantool Data Gridi arhitektuur ja võimalused

Loomulikult pakub süsteem sisemisi mõõdikuid, mida saab Prometheuse abil koguda ja Grafana abil visualiseerida.

Kasutusele võtta

Tarantool Data Gridi saab juurutada RPM-pakettidest või arhiivist, kasutades distributsiooni või Ansible utiliiti, olemas on ka Kubernetese tugi (Tarantool Kubernetes Operaator).

Äriloogikat (konfiguratsioon, töötlejad) rakendav rakendus laaditakse juurutatud Tarantool Data Grid klastrisse arhiivina läbi kasutajaliidese või kasutades skripti meie poolt pakutava API kaudu.

Filosoofia aabitsad

Milliseid rakendusi saab Tarantool Data Gridi abil luua? Tegelikult on enamik äriülesandeid kuidagi seotud andmevoo töötlemise, salvestamise ja juurdepääsuga. Seega, kui teil on suured andmevood, mida on vaja turvaliselt salvestada ja millele on vaja juurde pääseda, siis meie toode võib säästa palju arendusaega ja keskenduda teie äriloogikale.

Näiteks soovime koguda infot kinnisvaraturu kohta, et saaksime tulevikus näiteks infot parimate pakkumiste kohta. Sel juhul tõstame esile järgmised ülesanded:

  1. Meie andmeallikateks on robotid, mis koguvad teavet avatud allikatest. Selle probleemi saate lahendada valmislahenduste või mis tahes keeles koodi kirjutamise abil.
  2. Järgmisena aktsepteerib ja salvestab Tarantool Data Grid andmed. Kui erinevatest allikatest pärit andmevorming on erinev, saate Lua keeles kirjutada koodi, mis teisendab ühte vormingusse. Eeltöötluse etapis saate ka näiteks filtreerida dubleerivaid pakkumisi või täiendavalt värskendada andmebaasis teavet turul töötavate agentide kohta.
  3. Nüüd on teil klastris juba skaleeritav lahendus, mida saab andmetega täita ja andmevalikuid teha. Seejärel saate rakendada uut funktsionaalsust, näiteks kirjutada teenus, mis teeb andmete päringu ja teeb kõige soodsama pakkumise päevas - selleks on vaja mõnda rida konfiguratsioonifailis ja natuke Lua koodi.

Mis edasi?

Meie prioriteediks on täiustada kasutamise lihtsust Tarantooli andmevõrk. Näiteks on see IDE, mis toetab liivakastis töötavaid profileerimis- ja silumiskäsitlejaid.

Samuti pöörame suurt tähelepanu ohutusküsimustele. Praegu on meil käimas Venemaa FSTEC sertifikaat, mis kinnitab isikuandmete infosüsteemides ja valitsuse infosüsteemides kasutatavate tarkvaratoodete kõrget turbetaset ja sertifitseerimise nõudeid.

Allikas: www.habr.com

Lisa kommentaar