Arhitektura i mogućnosti Tarantool Data Grid-a

Arhitektura i mogućnosti Tarantool Data Grid-a

U 2017. pobijedili smo na natječaju za razvoj transakcijske jezgre investicijskog poslovanja Alfa-Banke i započeli s radom (na HighLoad++ 2018. s izvješćem o srži investicijskog poslovanja izvedena Vladimir Drynkin, voditelj transakcijske jezgre investicijskog poslovanja Alfa banke). Ovaj sustav je trebao prikupljati podatke o transakcijama iz različitih izvora u različitim formatima, dovoditi podatke u unificirani oblik, pohranjivati ​​ih i omogućiti im pristup.

Tijekom procesa razvoja sustav je evoluirao i dobivao funkcionalnost te smo u jednom trenutku shvatili da kristaliziramo nešto puno više od aplikativnog softvera kreiranog za rješavanje strogo definiranog niza zadataka: uspjeli smo sustav za izgradnju distribuiranih aplikacija s trajnom pohranom. Iskustvo koje smo stekli je temelj novog proizvoda - Tarantool Data Grid (TDG).

Želim govoriti o TDG arhitekturi i rješenjima do kojih smo došli tijekom procesa razvoja, upoznati vas s glavnim funkcionalnostima i pokazati kako naš proizvod može postati temelj za izgradnju cjelovitih rješenja.

Arhitektonski smo sustav podijelili na zasebne roli, od kojih je svaki odgovoran za rješavanje određenog niza problema. Jedna pokrenuta instanca aplikacije implementira jednu ili više vrsta uloga. U klasteru može postojati nekoliko uloga iste vrste:

Arhitektura i mogućnosti Tarantool Data Grid-a

konektor

Connector je odgovoran za komunikaciju s vanjskim svijetom; njegov zadatak je prihvatiti zahtjev, raščlaniti ga i ako u tome uspije poslati podatke na obradu ulaznom procesoru. Podržavamo HTTP, SOAP, Kafka, FIX formate. Arhitektura vam omogućuje da jednostavno dodate podršku za nove formate, a podrška za IBM MQ dolazi uskoro. Ako analiziranje zahtjeva nije uspjelo, konektor će vratiti grešku; u suprotnom će odgovoriti da je zahtjev uspješno obrađen, čak i ako je došlo do pogreške tijekom njegove daljnje obrade. To je učinjeno posebno kako bi se radilo sa sustavima koji ne znaju ponavljati zahtjeve - ili, naprotiv, to rade previše uporno. Kako se podaci ne bi izgubili, koristi se red čekanja za popravak: objekt prvo ulazi u njega i tek nakon uspješne obrade uklanja se iz njega. Administrator može primati upozorenja o preostalim objektima u redu čekanja za popravak i nakon uklanjanja softverske pogreške ili kvara hardvera, pokušati ponovno.

Ulazni procesor

Ulazni procesor klasificira primljene podatke prema karakterističnim značajkama i poziva odgovarajuće procesore. Rukovatelji su Lua kod koji se izvodi u sandboxu, tako da ne mogu utjecati na funkcioniranje sustava. U ovoj fazi podaci se mogu svesti na traženi oblik, a po potrebi se može pokrenuti proizvoljan broj zadataka koji mogu implementirati potrebnu logiku. Na primjer, u MDM (Master Data Management) proizvodu izgrađenom na Tarantool Data Grid-u, prilikom dodavanja novog korisnika, kako ne bismo usporili obradu zahtjeva, pokrećemo izradu zlatnog zapisa kao zaseban zadatak. Pješčanik podržava zahtjeve za čitanje, promjenu i dodavanje podataka, omogućuje vam izvođenje nekih funkcija na svim ulogama vrste pohrane i agregacije rezultata (map/reduce).

Rukovatelji se mogu opisati u datotekama:

sum.lua

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

A zatim, deklarirano u konfiguraciji:

functions:
  sum: { __file: sum.lua }

Zašto Lua? Lua je vrlo jednostavan jezik. Prema našem iskustvu, nekoliko sati nakon upoznavanja ljudi počnu pisati kod koji im rješava problem. I to nisu samo profesionalni programeri, već, na primjer, analitičari. Osim toga, zahvaljujući jit kompajleru, Lua radi vrlo brzo.

skladištenje

Pohrana pohranjuje trajne podatke. Prije spremanja podaci se provjeravaju prema podatkovnoj shemi. Za opis kruga koristimo prošireni format Apache Avro, Primjer:

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

Na temelju ovog opisa automatski se generira DDL (Data Definition Language) za Tarantula DBMS i Graphql shema za pristup podacima.

Podržana je asinkrona replikacija podataka (u planu je dodavanje sinkrone).

Izlazni procesor

Ponekad je potrebno obavijestiti vanjske potrošače o pristizanju novih podataka, za što postoji uloga Izlaznog procesora. Nakon spremanja podataka, oni se mogu proslijediti odgovarajućem rukovatelju (na primjer, da ih dovede u oblik koji zahtijeva potrošač) - a zatim proslijediti konektoru za slanje. Ovdje se također koristi red čekanja za popravak: ako nitko nije prihvatio objekt, administrator može pokušati ponovno kasnije.

Skaliranje

Uloge konektora, ulaznog procesora i izlaznog procesora nemaju stanje, što nam omogućuje vodoravno skaliranje sustava jednostavnim dodavanjem novih instanci aplikacije s omogućenom željenom vrstom uloge. Pohrana se koristi za horizontalno skaliranje pristup do organiziranja klastera pomoću virtualnih spremnika. Nakon dodavanja novog poslužitelja, neki od spremnika sa starih poslužitelja premještaju se na novi poslužitelj u pozadini; to se događa transparentno za korisnike i ne utječe na rad cijelog sustava.

Svojstva podataka

Objekti mogu biti vrlo veliki i sadržavati druge objekte. Osiguravamo atomičnost dodavanja i ažuriranja podataka pohranjivanjem objekta sa svim ovisnostima u jednu virtualnu kantu. Ovo sprječava da se objekt "rasprostire" na nekoliko fizičkih poslužitelja.

Podržano je određivanje verzija: svako ažuriranje objekta stvara novu verziju, a uvijek možemo uzeti vremenski isječak i vidjeti kako je svijet tada izgledao. Za podatke koji ne trebaju dugu povijest, možemo ograničiti broj verzija ili čak pohraniti samo jednu - najnoviju - odnosno, u biti onemogućiti verziranje za određeni tip. Također možete ograničiti povijest prema vremenu: na primjer, izbrisati sve objekte određene vrste starije od 1 godine. Podržano je i arhiviranje: možemo istovariti objekte starije od navedenog vremena, oslobađajući prostor u klasteru.

zadaci

Među zanimljivim značajkama vrijedi istaknuti mogućnost pokretanja zadataka prema rasporedu, na zahtjev korisnika ili programski iz sandboxa:

Arhitektura i mogućnosti Tarantool Data Grid-a

Ovdje vidimo još jednu ulogu - trkača. Ova uloga je bez stanja, a dodatne instance aplikacije s ovom ulogom mogu se dodati u klaster prema potrebi. Odgovornost trkača je izvršavanje zadataka. Kao što je spomenuto, moguće je generirati nove zadatke iz sandboxa; spremaju se u red čekanja na pohranu i zatim se izvršavaju na pokretaču. Ova vrsta zadatka naziva se posao. Imamo i tip zadatka koji se zove Zadatak - to su korisnički definirani zadaci koji se izvode prema rasporedu (koristeći cron sintaksu) ili na zahtjev. Za pokretanje i praćenje takvih zadataka imamo prikladan upravitelj zadataka. Kako bi ova funkcionalnost bila dostupna, morate omogućiti ulogu planera; ova uloga ima stanje, pa se ne skalira, što međutim nije potrebno; u isto vrijeme, kao i sve druge uloge, može imati repliku koja počinje raditi ako majstor iznenada odbije.

Drvosječa

Druga uloga se zove logger. Prikuplja zapisnike od svih članova klastera i pruža sučelje za učitavanje i pregledavanje istih putem web sučelja.

Usluge

Vrijedno je spomenuti da sustav olakšava kreiranje usluga. U konfiguracijskoj datoteci možete odrediti koji se zahtjevi šalju rukovatelju koji je napisao korisnik koji se izvodi u sandboxu. U ovom rukovatelju možete, na primjer, pokrenuti neku vrstu analitičkog upita i vratiti rezultat.

Usluga je opisana u konfiguracijskoj datoteci:

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

GraphQL API generira se automatski i usluga postaje dostupna za pozivanje:

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

Ovo će pozvati rukovatelja sumkoji će vratiti rezultat:

3

Profiliranje upita i metrika

Kako bismo razumjeli rad sustava i zahtjeve za profiliranje, implementirali smo podršku za OpenTracing protokol. Sustav može poslati informacije na zahtjev alatima koji podržavaju ovaj protokol, kao što je Zipkin, što će vam omogućiti da razumijete kako je zahtjev izvršen:

Arhitektura i mogućnosti Tarantool Data Grid-a

Naravno, sustav nudi internu metriku koja se može prikupiti pomoću Prometheusa i vizualizirati pomoću Grafane.

Rasporedi

Tarantool Data Grid može se implementirati iz RPM paketa ili arhive, koristeći pomoćni program iz distribucije ili Ansible, također postoji podrška za Kubernetes (Tarantool Kubernetes operater).

Aplikacija koja implementira poslovnu logiku (konfiguracija, rukovatelji) učitava se u implementirani Tarantool Data Grid klaster u obliku arhive putem korisničkog sučelja ili korištenjem skripte putem API-ja koji mi pružamo.

Bukvari filozofije

Koje se aplikacije mogu izraditi pomoću Tarantool Data Grid-a? Zapravo, većina poslovnih zadataka na neki je način povezana s obradom, pohranjivanjem i pristupom protoku podataka. Stoga, ako imate velike tokove podataka koje je potrebno sigurno pohraniti i pristupiti im, tada vam naš proizvod može uštedjeti puno vremena razvoja i usredotočiti se na vašu poslovnu logiku.

Na primjer, želimo prikupiti informacije o tržištu nekretnina, kako bismo u budućnosti, na primjer, imali informacije o najboljim ponudama. U ovom slučaju istaknut ćemo sljedeće zadatke:

  1. Roboti koji prikupljaju informacije iz otvorenih izvora bit će naši izvori podataka. Ovaj problem možete riješiti pomoću gotovih rješenja ili pisanjem koda na bilo kojem jeziku.
  2. Zatim će Tarantool Data Grid prihvatiti i spremiti podatke. Ako je format podataka iz različitih izvora različit, tada možete napisati kod u Lua koji će izvršiti konverziju u jedan format. U fazi predobrade također ćete moći, na primjer, filtrirati dvostruke ponude ili dodatno ažurirati podatke o agentima koji rade na tržištu u bazi podataka.
  3. Sada već imate skalabilno rješenje u klasteru koji se može puniti podacima i vršiti odabir podataka. Tada možete implementirati novu funkcionalnost, na primjer, napisati uslugu koja će napraviti zahtjev za podatke i dati najpovoljniju ponudu po danu - to će zahtijevati nekoliko redaka u konfiguracijskoj datoteci i malo Lua koda.

Što je sljedeće?

Naš je prioritet poboljšati jednostavnost korištenja razvoja Tarantool Data Grid. Na primjer, ovo je IDE s podrškom za rukovatelje profilima i otklanjanjem pogrešaka koji se izvode u sandboxu.

Veliku pozornost posvećujemo i pitanjima sigurnosti. Upravo sada prolazimo certifikaciju od strane FSTEC-a Rusije kako bismo potvrdili visoku razinu sigurnosti i ispunili zahtjeve za certifikaciju softverskih proizvoda koji se koriste u informacijskim sustavima osobnih podataka i vladinim informacijskim sustavima.

Izvor: www.habr.com

Dodajte komentar