Arsjitektuer en mooglikheden fan Tarantool Data Grid

Arsjitektuer en mooglikheden fan Tarantool Data Grid

Yn 2017 wûnen wy in kompetysje om de transaksjekearn fan 'e ynvestearringsbedriuw fan Alfa-Bank te ûntwikkeljen en begon te wurkjen (by HighLoad ++ 2018 mei in rapport oer de kearn fan it ynvestearringsbedriuw útfierd Vladimir Drynkin, haad fan 'e transaksjekearn fan 'e ynvestearringsbedriuw fan Alfa Bank). Dit systeem soe transaksjegegevens fan ferskate boarnen yn ferskate formaten aggregearje, de gegevens yn in unifoarme foarm bringe, it opslaan en tagong ta it jaan.

Tidens it ûntwikkelingsproses evoluearre it systeem en krige funksjonaliteit, en op in stuit realisearren wy dat wy wat folle mear kristallisearje as allinich applikaasjesoftware makke om in strikt definieare oanbod fan taken op te lossen: wy binne slagge: systeem foar it bouwen fan ferdielde applikaasjes mei persistente opslach. De ûnderfining dy't wy opdien foarmen de basis fan in nij produkt - Tarantool Data Grid (TDG).

Ik wol prate oer de TDG-arsjitektuer en de oplossingen dy't wy kamen ta tidens it ûntwikkelingsproses, jo yntrodusearje oan 'e haadfunksjonaliteit en sjen litte hoe't ús produkt de basis kin wurde foar it bouwen fan folsleine oplossingen.

Architecturally, wy ferdield it systeem yn aparte rollen, elk fan dat is ferantwurdlik foar it oplossen fan in bepaald oanbod fan problemen. In inkele rinnende applikaasje-eksimplaar ymplementearret ien of mear roltypen. D'r kinne ferskate rollen fan itselde type wêze yn in kluster:

Arsjitektuer en mooglikheden fan Tarantool Data Grid

ferbiner

Connector is ferantwurdlik foar kommunikaasje mei de bûtenwrâld; syn taak is om it fersyk te akseptearjen, it te parsearjen, en as dit slagget, stjoer dan de gegevens foar ferwurking nei de ynfierprosessor. Wy stypje HTTP, SOAP, Kafka, FIX formaten. De arsjitektuer lit jo gewoan stipe tafoegje foar nije formaten, mei stipe foar IBM MQ dy't gau komt. As it parsearjen fan it fersyk mislearre, sil de ferbiner in flater weromjaan; oars, it sil reagearje dat it fersyk waard ferwurke mei súkses, sels as der in flater barde ûnder syn fierdere ferwurking. Dit waard spesifyk dien om te wurkjen mei systemen dy't net witte hoe't jo fersiken moatte werhelje - of, krekt oarsom, it te oanhâldend dogge. Om gjin gegevens te ferliezen, wurdt in reparaasjewachtrige brûkt: it objekt komt der earst yn en pas nei suksesfolle ferwurking wurdt it fuorthelle. De behearder kin warskôgings krije oer objekten dy't yn 'e reparaasjewachtrige bliuwe, en nei it eliminearjen fan in softwareflater of hardwarefout, besykje it nochris.

Ynput prosessor

De ynfierprosessor klassifiseart de ûntfongen gegevens neffens karakteristike skaaimerken en ropt passende processors op. Handlers binne Lua koade dy't rint yn in sânbak, sadat se kinne net beynfloedzje it funksjonearjen fan it systeem. Op dit poadium kinne de gegevens wurde fermindere nei de fereaske foarm, en, as it nedich is, kin in willekeurige oantal taken wurde lansearre dy't de nedige logika kinne útfiere. Bygelyks, yn it produkt MDM (Master Data Management) boud op Tarantool Data Grid, by it tafoegjen fan in nije brûker, om de ferwurking fan 'e oanfraach net te fertrage, starte wy it meitsjen fan in gouden rekord as in aparte taak. De sânbak stipet oanfragen foar it lêzen, wizigjen en tafoegjen fan gegevens, kinne jo wat funksje útfiere op alle rollen fan it opslachtype en aggregaasje fan it resultaat (kaart / ferminderje).

Handlers kinne wurde beskreaun yn bestannen:

sum.lua

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

En dan, ferklearre yn 'e konfiguraasje:

functions:
  sum: { __file: sum.lua }

Wêrom Lua? Lua is in heul ienfâldige taal. Op grûn fan ús ûnderfining, in pear oeren nei't se it kennen, begjinne minsken koade te skriuwen dy't har probleem oplost. En dit binne net allinnich profesjonele ûntwikkelders, mar, bygelyks, analisten. Derneist, troch de jit-kompiler, rint Lua heul fluch.

Opslach

Opslach bewarret persistente gegevens. Foar it opslaan wurde gegevens falidearre tsjin it gegevensskema. Om it circuit te beskriuwen brûke wy in útwreide opmaak Apache Avro... Foarbyld:

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

Op grûn fan dizze beskriuwing wurdt DDL (Data Definition Language) automatysk oanmakke foar de Tarantula DBMS en GraphQL skema foar gegevens tagong.

Asynchrone gegevensreplikaasje wurdt stipe (d'r binne plannen om syngroane ien ta te foegjen).

Utfier prosessor

Soms is it nedich om eksterne konsuminten te ynformearjen oer de komst fan nije gegevens; foar dit doel is d'r de rol fan 'e útfierferwurker. Nei it bewarjen fan de gegevens kinne se trochjûn wurde oan de korrespondearjende handler (bygelyks om it te bringen nei it formulier dat de konsumint fereasket) - en dan trochjûn oan de ferbiner foar ferstjoeren. In reparaasjewachtrige wurdt hjir ek brûkt: as nimmen it objekt akseptearre, kin de behearder it letter nochris besykje.

Skaalfergrutting

De rollen fan ferbining, ynfierprosessor en útfierprosessor binne steatleas, wêrtroch't wy it systeem horizontaal kinne skaalje troch gewoan nije applikaasje-eksimplaren ta te foegjen mei it winske roltype ynskeakele. Opslach wurdt brûkt foar horizontale skaalfergrutting oanpak om in kluster te organisearjen mei firtuele emmers. Nei it tafoegjen fan in nije tsjinner, wurde guon fan 'e bakken fan' e âlde tsjinners ferpleatst nei de nije tsjinner op 'e eftergrûn; dit bart transparant foar brûkers en hat gjin ynfloed op de wurking fan it hiele systeem.

Data Eigenskippen

Objekten kinne tige grut wêze en oare objekten befetsje. Wy soargje foar atomiteit fan it tafoegjen en aktualisearjen fan gegevens troch it bewarjen fan in objekt mei alle ôfhinklikens yn ien firtuele bak. Dit foarkomt dat it objekt "ferspraat" wurdt oer ferskate fysike tsjinners.

Ferzjebewurking wurdt stipe: elke fernijing fan in objekt makket in nije ferzje, en wy kinne altyd in tiidstik nimme en sjen hoe't de wrâld der doe útseach. Foar gegevens dy't gjin lange skiednis nedich binne, kinne wy ​​​​it oantal ferzjes beheine of sels mar ien opslaan - de lêste - dat is, yn wêzen útskeakelje ferzjeferzje foar in bepaald type. Jo kinne de skiednis ek troch tiid beheine: wiskje bygelyks alle objekten fan in bepaald type âlder dan 1 jier. Argivearjen wurdt ek stipe: wy kinne objekten ûntladen dy't âlder binne dan de opjûne tiid, wêrtroch romte yn it kluster frijmakket.

taken

Under de nijsgjirrige funksjes is it de muoite wurdich op te merken de mooglikheid om taken op in skema te starten, op fersyk fan de brûker, of programmatysk út 'e sânbak:

Arsjitektuer en mooglikheden fan Tarantool Data Grid

Hjir sjogge wy in oare rol - runner. Dizze rol is steatleas, en ekstra applikaasje-eksimplaren mei dizze rol kinne wurde tafoege oan it kluster as nedich. De ferantwurdlikens fan 'e runner is om taken te foltôgjen. Lykas sein, is it mooglik om te generearjen nije taken út de sânbak; se wurde bewarre yn in wachtrige op opslach en dan útfierd op de runner. Dit soarte fan taak hjit Job. Wy hawwe ek in taaktype neamd Task - dit binne brûker-definieare taken dy't rinne op in skema (mei help fan cron-syntaksis) as op oanfraach. Om sokke taken te starten en te folgjen, hawwe wy in handige taakbehearder. Om dizze funksjonaliteit beskikber te wêzen, moatte jo de plannerrol ynskeakelje; dizze rol hat in steat, sadat it net skaal, dat is net fereaske; tagelyk kin it, lykas alle oare rollen, in replika hawwe dy't begjint te wurkjen as de master ynienen wegeret.

houthakkers

In oare rol wurdt logger neamd. It sammelt logs fan alle leden fan it kluster en biedt in ynterface foar it uploaden en besjen fan se fia de webynterface.

Tsjinsten

It is it neamen wurdich dat it systeem it maklik makket om tsjinsten te meitsjen. Yn it konfiguraasjetriem kinne jo oanjaan hokker fersiken wurde stjoerd nei in troch de brûker skreaune handler dy't rint yn 'e sânbak. Yn dizze handler kinne jo bygelyks in soarte fan analytyske query útfiere en it resultaat weromjaan.

De tsjinst wurdt beskreaun yn it konfiguraasjetriem:

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

De GraphQL API wurdt automatysk oanmakke en de tsjinst wurdt beskikber foar skiljen:

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

Dit sil de handler neame sumdat sil it resultaat werombringe:

3

Query Profiling en Metrics

Om de wurking fan it systeem en profilearjen fan fersiken te begripen, hawwe wy stipe ymplementearre foar it OpenTracing-protokol. It systeem kin ynformaasje stjoere op fraach nei ark dy't dit protokol stypje, lykas Zipkin, wêrtroch jo kinne begripe hoe't it fersyk is útfierd:

Arsjitektuer en mooglikheden fan Tarantool Data Grid

Natuerlik leveret it systeem ynterne metriken dy't kinne wurde sammele mei Prometheus en visualisearre mei Grafana.

Ynsette

Tarantool Data Grid kin wurde ynset fan RPM-pakketten as in argyf, mei help fan in nut fan 'e distribúsje of Ansible, d'r is ek stipe foar Kubernetes (Tarantool Kubernetes Operator).

De applikaasje dy't de saaklike logika ymplementearret (konfiguraasje, handlers) wurdt laden yn it ynset Tarantool Data Grid-kluster yn 'e foarm fan in argyf fia de UI of mei in skript fia de troch ús levere API.

Sample applikaasjes

Hokker applikaasjes kinne wurde makke mei Tarantool Data Grid? Yn feite binne de measte saaklike taken op ien of oare manier relatearre oan it ferwurkjen, opslaan en tagong ta gegevensstream. Dêrom, as jo grutte streamen fan gegevens hawwe dy't feilich moatte wurde opslein en tagong, dan kin ús produkt jo in protte ûntwikkelingstiid besparje en fokusje op jo bedriuwslogika.

Wy wolle bygelyks ynformaasje sammelje oer de ûnreplik guodmerk, sadat wy yn 'e takomst bygelyks ynformaasje hawwe oer de bêste oanbiedingen. Yn dit gefal sille wy de folgjende taken markearje:

  1. Robots dy't ynformaasje sammelje fan iepen boarnen sille ús gegevensboarnen wêze. Jo kinne dit probleem oplosse mei help fan klearmakke oplossingen of it skriuwen fan koade yn elke taal.
  2. Folgjende, Tarantool Data Grid sil akseptearje en bewarje de gegevens. As it gegevensformaat fan ferskate boarnen oars is, dan kinne jo koade skriuwe yn Lua dy't de konverzje sil útfiere nei ien opmaak. Yn it foarferwurkingsstadium kinne jo bygelyks dûbele oanbiedingen filterje of ekstra ynformaasje bywurkje oer aginten dy't wurkje op 'e merk yn' e database.
  3. No hawwe jo al in skalbere oplossing yn in kluster dat kin wurde fol mei gegevens en meitsje gegevens seleksjes. Dan kinne jo nije funksjonaliteit ymplementearje, bygelyks in tsjinst skriuwe dy't in fersyk foar gegevens sil meitsje en it meast foardielige oanbod per dei jouwe - dit sil in pear rigels yn 'e konfiguraasjetriem en in bytsje Lua-koade nedich wêze.

Wat is folgjende?

Us prioriteit is it ferbetterjen fan it gemak fan gebrûk fan ûntwikkeling Tarantool Data Grid. Dit is bygelyks in IDE mei stipe foar profilearjen en debuggen fan handlers dy't rinne yn in sânbak.

Wy jouwe ek grutte oandacht foar feiligensproblemen. Op it stuit ûndergeane wy ​​sertifisearring troch FSTEC fan Ruslân om it hege nivo fan feiligens te befêstigjen en te foldwaan oan de easken foar sertifisearring fan softwareprodukten dy't brûkt wurde yn ynformaasjesystemen foar persoanlike gegevens en ynformaasjesystemen foar oerheid.

Boarne: www.habr.com

Add a comment