Arkitektur och funktioner hos Tarantool Data Grid

Arkitektur och funktioner hos Tarantool Data Grid

År 2017 vann vi upphandlingen för att utveckla det transaktionella kĂ€rnet för Alphabanks investeringsverksamhet och pĂ„började arbetet (vid HighLoad++ 2018 med en presentation om kĂ€rnan för investeringsverksamheten talade Vladimir Drynkin, chef för det transaktionella kĂ€rnet för investeringsverksamheten pĂ„ Alphabank). Detta system skulle samla data om affĂ€rer frĂ„n olika kĂ€llor i olika format, standardisera data, lagra dem och ge Ă„tkomst till dem.

Under utvecklingsprocessen utvecklades systemet och fick mer funktionalitet, och vid nĂ„got tillfĂ€lle insĂ„g vi att vi formas nĂ„got mycket större Ă€n bara en applikation som skapades för att lösa ett strikt definierat utbud av uppgifter: vi fick ett system för att bygga distribuerade applikationer med bestĂ€ndig lagring. Den erfarenhet vi fĂ„tt lĂ„g till grund för en ny produkt — Tarantool Data Grid (TDG).

Jag vill berÀtta om arkitekturen för TDG och de beslut vi fattade under utvecklingen, introducera er för den grundlÀggande funktionaliteten och visa hur vÄr produkt kan bli grunden för att bygga kompletta lösningar.

Arkitektoniskt har vi delat systemet i separata roller, dÀr varje roll Àr ansvarig för att lösa ett visst antal uppgifter. En enskild körning av applikationen implementerar en eller flera typer av roller. I klustret kan det finnas flera roller av samma typ:

Arkitektur och funktioner hos Tarantool Data Grid

Connector

Connector ansvarar för kommunikationen med omvĂ€rlden; dess uppgift Ă€r att ta emot en begĂ€ran, analysera den, och om det lyckas, skicka data för bearbetning till input processor. Vi stöder format som HTTP, SOAP, Kafka, FIX. Arkitekturen gör det enkelt att lĂ€gga till stöd för nya format, snart kommer vi att stödja IBM MQ. Om analysen av begĂ€ran misslyckas kommer connector att returnera ett fel; annars kommer den att svara att begĂ€ran har behandlats framgĂ„ngsrikt, Ă€ven om det uppstod ett fel vid vidare bearbetning. Detta Ă€r gjort för att kunna arbeta med system som inte kan upprepa begĂ€rningar — eller tvĂ€rtom, gör det alltför insisterande. För att inte förlora data anvĂ€nds en reparationskö: objektet hamnar först dĂ€r och tas bara bort frĂ„n den efter lyckad behandling. Administratören kan fĂ„ aviseringar om objekt som kvarstĂ„r i reparationskön, och efter att ha Ă„tgĂ€rdat en programvarufel eller hĂ„rdvarufel kan försöka igen.

Input processor

Input processor klassificerar de mottagna uppgifterna efter karakteristiska kÀnnetecken och anropar lÀmpliga hanterare. Hanterarna Àr kod pÄ Lua-sprÄket, som körs i en sandbox, sÄ de kan inte pÄverka systemets funktionalitet. PÄ detta stadium kan data konverteras till önskat format, och vid behov kan ett valfritt antal uppgifter startas, som kan implementera den logik som behövs. Till exempel, i produkten MDM (Master Data Management), byggd pÄ Tarantool Data Grid, nÀr en ny anvÀndare lÀggs till, för att inte fördröja behandlingen av begÀran, startar vi skapandet av guldposten som en separat uppgift. SandlÄdan stöder lÀs-, Àndrings- och tillÀggsfrÄgor, och möjliggör att utföra viss funktionalitet pÄ alla roller av typ storage och aggregera resultatet (map/reduce).

Hanterare kan beskrivas i filer:

sum.lua

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

Och sedan deklareras i konfigurationen:

functions:
  sum: { __file: sum.lua }

Varför Lua? Lua Àr ett mycket enkelt sprÄk. Baserat pÄ vÄr erfarenhet, efter ett par timmar med att lÀra sig det, börjar mÀnniskor skriva kod som löser deras problem. Och det Àr inte bara professionella utvecklare, utan Àven till exempel analytiker. Dessutom, tack vare just-in-time kompilatorn, fungerar Lua mycket snabbt.

Storage

Lagring lagrar bestÀndiga data. Innan de sparas valideras data i förhÄllande till dataskeman. För att beskriva schemat anvÀnder vi ett utökat format. Apache Avro. Exempel:

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

UtifrÄn denna beskrivning genereras automatiskt DDL (Data Definition Language) för databashanteraren Tarantool och GraphQL schema för dataÄtkomst.

Asynkron datareplication stöds (det planeras att lÀgga till synkron).

Output processor

Ibland behöver externa konsumenter meddelas om att nya data har anlÀnt, för detta finns rollen Output processor. Efter att data har sparats kan de överföras till motsvarande bearbetare (till exempel för att anpassa dem till vad konsumenten krÀver) - och efter detta skickas de till connector för utskick. HÀr anvÀnds Àven en reparationskö: om objektet inte har accepterats av nÄgon kan administratören försöka igen senare.

Skalning

Rollerna connector, input processor och output processor har ingen status, vilket gör att vi kan skala systemet horisontellt genom att helt enkelt lÀgga till nya instanser av applikationen med den önskade rolletypen aktiverad. För horisontell skalning anvÀnds lagring metoden för att organisera kluster med hjÀlp av virtuella behÄllare. Efter att en ny server har lagts till flyttas en del av behÄllarna frÄn de gamla servrarna i bakgrunden till den nya servern; detta sker transparent för anvÀndarna och pÄverkar inte hela systemets funktion.

Dataegenskaper

Objekt kan vara mycket stora och innehÄlla andra objekt. Vi sÀkerstÀller atomicitet vid tillÀgg och uppdatering av data genom att spara objektet med alla dess beroenden i en virtuell behÄllare. PÄ sÄ sÀtt undviks "utstrÀckning" av objektet över flera fysiska servrar.

Versionshantering stöds: varje objektuppdatering skapar en ny version, och vi kan alltid ta en tidsavskurning och se hur vĂ€rlden sĂ„g ut dĂ„. För data som inte behöver en lĂ„ng historia kan vi begrĂ€nsa antalet versioner eller till och med bara lagra en — den sista, vilket i praktiken innebĂ€r att vi stĂ€nger av versionshantering för en viss typ. Vi kan ocksĂ„ begrĂ€nsa historiken i tid: till exempel, ta bort alla objekt av en viss typ som Ă€r Ă€ldre Ă€n 1 Ă„r. Arkivering stöds ocksĂ„: vi kan exportera objekt som Ă€r Ă€ldre Ă€n angiven tid, vilket frigör utrymme i klustret.

Uppgifter

Bland de intressanta funktionerna finns möjligheten att köra uppgifter enligt schema, pÄ begÀran av anvÀndaren eller programmÀssigt frÄn sandlÄdan:

Arkitektur och funktioner hos Tarantool Data Grid

HĂ€r ser vi en annan roll — runner. Denna roll har inget tillstĂ„nd och vid behov kan ytterligare instanser av applikationen med den hĂ€r rollen lĂ€ggas till i klustret. Ansvarig för runner Ă€r att utföra uppgifter. Som nĂ€mnts kan nya uppgifter skapas frĂ„n sandlĂ„dan; de sparas i kön pĂ„ lagringen och utförs sedan pĂ„ runner. Denna typ av uppgift kallas Jobb. Vi har ocksĂ„ en typ av uppgift kallad Task — detta Ă€r anvĂ€ndardefinierade uppgifter som körs enligt schema (cron-syntax anvĂ€nds) eller pĂ„ begĂ€ran. För att starta och övervaka sĂ„dana uppgifter har vi en anvĂ€ndarvĂ€nlig uppgiftsförvaltare. För att denna funktionalitet ska vara tillgĂ€nglig mĂ„ste rollen scheduler aktiveras; denna roll har tillstĂ„nd, sĂ„ den kan inte skalas, vilket i och för sig inte krĂ€vs; samtidigt kan den, precis som alla andra roller, ha en replik som börjar fungera om master plötsligt misslyckas.

Logger

En annan roll kallas logger. Den samlar loggar frÄn alla medlemmar i klustret och tillhandahÄller ett grÀnssnitt för att exportera och visa dem via webgrÀnssnittet.

TjÀnster

Det Àr vÀrt att nÀmna att systemet gör det enkelt att skapa tjÀnster. I konfigurationsfilen kan du ange vilka begÀrningar som ska riktas till den anvÀndardefinierade hanteraren som körs i sandlÄdan. I denna hanterare kan du till exempel utföra en analytisk begÀran och returnera resultatet.

TjÀnsten beskrivs i konfigurationsfilen:

services:
   sum:
      doc: "adderar tvÄ siffror"
      function: sum
      return_type: int
      args:
         x: int
         y: int

GraphQL API genereras automatiskt och tjÀnsten blir tillgÀnglig för anrop:

frÄga {
   sum(x: 1, y: 2) 
}

Detta kommer att leda till att hanteraren anropas sum, som kommer att returnera resultatet:

3

Profilering av förfrÄgningar och metrik

För att förstÄ systemets funktion och profilera förfrÄgningar har vi implementerat stöd för OpenTracing-protokollet. Systemet kan vid begÀran skicka information till verktyg som stöder detta protokoll, som Zipkin, vilket gör det möjligt att analysera hur förfrÄgan utfördes:

Arkitektur och funktioner hos Tarantool Data Grid

Naturligtvis erbjuder systemet interna metrik som kan samlas in med hjÀlp av Prometheus och visualiseras med Grafana.

Utveckla

Tarantool Data Grid kan distribueras frÄn RPM-paket eller arkiv, med hjÀlp av levererade verktyg eller Ansible, och stöd för Kubernetes finns ocksÄ (Tarantool Kubernetes Operator).

Applikationen som implementerar affÀrslogik (konfiguration, hanterare) laddas upp till den distribuerade Tarantool Data Grid-klustret i form av ett arkiv via UI eller med hjÀlp av ett skript, genom det API vi tillhandahÄller.

Exempel pÄ applikationer

Vilka applikationer kan skapas med hjÀlp av Tarantool Data Grid? Egentligen Àr de flesta affÀrsuppgifter pÄ ett eller annat sÀtt relaterade till hantering av dataflöden, lagring och tillgÄng till dem. SÄ om du har stora datamÀngder som behöver lagras sÀkert och vara tillgÀngliga, kan vÄr produkt spara dig mycket tid pÄ utvecklingen och lÄta dig fokusera pÄ din affÀrslogik.

Till exempel vill vi samla information om fastighetsmarknaden för att i framtiden kunna ha information om de mest förmÄnliga erbjudandena. I detta fall identifierar vi följande uppgifter:

  1. Roboter som samlar information frÄn öppna kÀllor kommer att utgöra vÄra datakÀllor. Detta problem kan du lösa genom att anvÀnda fÀrdiga lösningar eller genom att skriva kod pÄ valfritt sprÄk.
  2. DÀrefter kommer Tarantool Data Grid att ta emot och lagra data. Om dataformatet frÄn olika kÀllor skiljer sig, kan du skriva kod i Lua som kommer att standardisera formatet. Under förbehandlingssteget kan du Àven filtrera bort dubbletter eller uppdatera informationen om agenter som arbetar pÄ marknaden i databasen.
  3. Nu har du redan en skalbar lösning i ett kluster som kan fyllas med data och anvĂ€ndas för dataval. NĂ€sta steg kan vara att implementera nya funktioner, till exempel skriva en tjĂ€nst som gör en förfrĂ„gan till datan och ger det mest fördelaktiga erbjudandet pĂ„ en dag — detta krĂ€ver nĂ„gra rader i konfigurationsfilen och lite kod i Lua.

Vad hÀnder hÀrnÀst?

VÄrt fokus ligger pÄ att förbÀttra utvecklingsbekvÀmligheten med hjÀlp av Tarantool Data Grid. Till exempel, det hÀr Àr en IDE med stöd för profilering och felsökning av hanterare som körs i en sandlÄda.

Vi lÀgger ocksÄ stor vikt vid sÀkerhetsfrÄgor. Just nu genomgÄr vi certifiering av FSTEK i Ryssland för att bekrÀfta hög sÀkerhetsnivÄ och uppfylla krav pÄ certifiering av programvaruprodukter som anvÀnds i informationssystem för personuppgifter och statliga informationssystem.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster