Tarantool Data Gridin arkkitehtuuri ja ominaisuudet

Tarantool Data Gridin arkkitehtuuri ja ominaisuudet

Vuonna 2017 voitimme kilpailun Alfa-Pankin sijoitustoiminnan transaktioytimen kehittämiseksi ja aloitimme työt (HighLoad++ 2018 -raportilla sijoitustoiminnan ytimestä suoritettu Vladimir Drynkin, Alfa Bankin sijoitustoiminnan transaktioytimen johtaja). Tämän järjestelmän oli tarkoitus koota tapahtumatiedot eri lähteistä eri muodoissa, tuoda tiedot yhtenäiseen muotoon, tallentaa ja tarjota pääsy siihen.

Kehitysprosessin aikana järjestelmä kehittyi ja sai toiminnallisuutta, ja jossain vaiheessa tajusimme, että olimme kiteyttämässä jotain paljon enemmän kuin vain sovellusohjelmistoja, jotka on luotu ratkaisemaan tiukasti määriteltyjä tehtäviä: onnistuimme järjestelmä hajautettujen sovellusten rakentamiseen jatkuvalla tallennustilalla. Saamamme kokemus loi pohjan uudelle tuotteelle - Tarantool Data Grid (TDG).

Haluan puhua TDG-arkkitehtuurista ja ratkaisuista, joihin päädyimme kehitysprosessin aikana, esitellä sinulle tärkeimmät toiminnallisuudet ja näyttää, kuinka tuotteestamme voi tulla pohja kokonaisratkaisujen rakentamiselle.

Arkkitehtonisesti jaoimme järjestelmän erillisiin rooli, joista jokainen on vastuussa tiettyjen ongelmien ratkaisemisesta. Yksi käynnissä oleva sovellusesiintymä toteuttaa yhden tai useamman roolityypin. Klusterissa voi olla useita samantyyppisiä rooleja:

Tarantool Data Gridin arkkitehtuuri ja ominaisuudet

liitin

Connector vastaa viestinnästä ulkomaailman kanssa; sen tehtävänä on hyväksyä pyyntö, jäsentää se, ja jos tämä onnistuu, lähettää tiedot käsittelyä varten syöttöprosessorille. Tuemme HTTP-, SOAP-, Kafka- ja FIX-muotoja. Arkkitehtuuri mahdollistaa yksinkertaisesti tuen lisäämisen uusille muodoille, ja IBM MQ:n tuki tulee pian. Jos pyynnön jäsentäminen epäonnistui, liitin palauttaa virheilmoituksen; muussa tapauksessa se vastaa, että pyyntö on käsitelty onnistuneesti, vaikka sen jatkokäsittelyssä tapahtuisi virhe. Tämä tehtiin erityisesti sellaisten järjestelmien kanssa, jotka eivät osaa toistaa pyyntöjä - tai päinvastoin, tekevät sen liian jatkuvasti. Jotta tietoja ei menetettäisi, käytetään korjausjonoa: objekti pääsee ensin siihen ja vasta onnistuneen käsittelyn jälkeen poistetaan siitä. Järjestelmänvalvoja voi vastaanottaa hälytyksiä korjausjonossa olevista kohteista ja yrittää uudelleen ohjelmisto- tai laitteistovian poistamisen jälkeen.

Tuloprosessori

Tuloprosessori luokittelee vastaanotetut tiedot ominaispiirteiden mukaan ja kutsuu sopivia prosessoreita. Käsittelijät ovat Lua-koodia, joka toimii hiekkalaatikossa, joten ne eivät voi vaikuttaa järjestelmän toimintaan. Tässä vaiheessa tiedot voidaan pienentää vaadittuun muotoon ja tarvittaessa käynnistää mielivaltainen määrä tehtäviä, joilla voidaan toteuttaa tarvittava logiikka. Esimerkiksi Tarantool Data Gridiin rakennetussa MDM (Master Data Management) -tuotteessa uutta käyttäjää lisättäessä käynnistämme kultaisen tietueen luomisen erillisenä tehtävänä, jotta pyynnön käsittely ei hidastuisi. Hiekkalaatikko tukee tietojen luku-, muutos- ja lisäyspyyntöjä, mahdollistaa jonkin toiminnon suorittamisen kaikissa tallennustyypin rooleissa ja tulosten yhdistämisessä (kartoittaa/vähentää).

Käsittelijät voidaan kuvata tiedostoissa:

sum.lua

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

Ja sitten konfiguraatiossa ilmoitettuna:

functions:
  sum: { __file: sum.lua }

Miksi Lua? Lua on hyvin yksinkertainen kieli. Kokemuksemme mukaan parin tunnin kuluttua siihen tutustumisen jälkeen ihmiset alkavat kirjoittaa koodia, joka ratkaisee heidän ongelmansa. Ja nämä eivät ole vain ammattimaisia ​​kehittäjiä, vaan esimerkiksi analyytikoita. Lisäksi jit-kääntäjän ansiosta Lua toimii erittäin nopeasti.

varastointi

Tallennus tallentaa pysyvää dataa. Ennen tallentamista tiedot tarkistetaan tietoskeemaa vastaan. Piirin kuvaamiseen käytämme laajennettua muotoa Apache Avro. Esimerkki:

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

Tämän kuvauksen perusteella DDL (Data Definition Language) luodaan automaattisesti Tarantula DBMS:lle ja GraphQL skeema tietojen käyttöä varten.

Asynkroninen tietojen replikointi on tuettu (synkronisen on tarkoitus lisätä).

Lähtöprosessori

Joskus on tarpeen ilmoittaa ulkopuolisille kuluttajille uuden tiedon saapumisesta, tätä tarkoitusta varten on Output prosessorin rooli. Tietojen tallentamisen jälkeen ne voidaan välittää vastaavalle käsittelijälle (esimerkiksi tuodakseen ne kuluttajan vaatimaan muotoon) - ja sitten välittää liittimeen lähetettäväksi. Tässä käytetään myös korjausjonoa: jos kukaan ei hyväksynyt objektia, järjestelmänvalvoja voi yrittää myöhemmin uudelleen.

Skaalaus

Liittimen, syöttöprosessorin ja tulostusprosessorin roolit ovat tilattomia, joten voimme skaalata järjestelmää vaakasuunnassa lisäämällä yksinkertaisesti uusia sovellusesiintymiä, joissa haluttu roolityyppi on käytössä. Tallennustilaa käytetään vaakasuuntaiseen skaalaan lähestymistapa klusterin järjestämiseen virtuaalisten kauhojen avulla. Kun uusi palvelin on lisätty, osa vanhojen palvelimien kauhoista siirretään uudelle palvelimelle taustalla; tämä tapahtuu läpinäkyvästi käyttäjille eikä vaikuta koko järjestelmän toimintaan.

Tietojen ominaisuudet

Objektit voivat olla hyvin suuria ja sisältää muita objekteja. Varmistamme tietojen lisäämisen ja päivittämisen atomiteetin tallentamalla objektin kaikkine riippuvuuksineen yhteen virtuaaliseen ämpäriin. Tämä estää objektia "levittämästä" useita fyysisiä palvelimia.

Versiointi on tuettu: jokainen objektin päivitys luo uuden version, ja voimme aina ottaa aikaviipaleen ja katsoa, ​​miltä maailma silloin näytti. Tiedoille, jotka eivät vaadi pitkää historiaa, voimme rajoittaa versioiden määrää tai jopa tallentaa vain yhden - uusimman - eli käytännössä poistaa versioinnin käytöstä tietyltä tyypiltä. Voit myös rajoittaa historiaa ajan mukaan: esimerkiksi poistaa kaikki tietyn tyyppiset yli vuoden vanhat objektit. Myös arkistointia tuetaan: voimme purkaa määritettyä aikaa vanhemmat kohteet, mikä vapauttaa tilaa klusterissa.

tehtävät

Mielenkiintoisista ominaisuuksista kannattaa huomioida mahdollisuus käynnistää tehtäviä aikataulussa, käyttäjän pyynnöstä tai ohjelmallisesti hiekkalaatikosta:

Tarantool Data Gridin arkkitehtuuri ja ominaisuudet

Tässä näemme toisen roolin - juoksijan. Tämä rooli on tilaton, ja klusteriin voidaan tarvittaessa lisätä muita sovellusesiintymiä, joilla on tämä rooli. Juoksijan vastuulla on suorittaa tehtävät. Kuten mainittiin, hiekkalaatikosta on mahdollista luoda uusia tehtäviä; ne tallennetaan jonoon tallennustilaan ja suoritetaan sitten juoksijassa. Tämän tyyppistä tehtävää kutsutaan työksi. Meillä on myös tehtävätyyppi nimeltä Task - nämä ovat käyttäjän määrittämiä tehtäviä, jotka suoritetaan aikataulun mukaan (käyttäen cron-syntaksia) tai pyynnöstä. Tällaisten tehtävien käynnistämiseksi ja seuraamiseksi meillä on kätevä tehtävähallinta. Jotta tämä toiminto olisi käytettävissä, sinun on otettava käyttöön ajoittajarooli. tällä roolilla on tila, joten se ei skaalaudu, mitä ei kuitenkaan vaadita; samalla, kuten kaikilla muillakin rooleilla, sillä voi olla kopio, joka alkaa toimia, jos mestari yhtäkkiä kieltäytyy.

metsuri

Toinen rooli on nimeltään logger. Se kerää lokit kaikilta klusterin jäseniltä ja tarjoaa käyttöliittymän niiden lataamiseen ja katseluun verkkokäyttöliittymän kautta.

Palvelut

On syytä mainita, että järjestelmän avulla palveluiden luominen on helppoa. Määritystiedostossa voit määrittää, mitkä pyynnöt lähetetään käyttäjän kirjoittamalle käsittelijälle, joka toimii hiekkalaatikossa. Tässä käsittelijässä voit esimerkiksi suorittaa jonkinlaisen analyyttisen kyselyn ja palauttaa tuloksen.

Palvelu on kuvattu asetustiedostossa:

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

GraphQL API luodaan automaattisesti ja palvelu tulee saataville soittamista varten:

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

Tämä soittaa ohjaajalle sumjoka palauttaa tuloksen:

3

Kyselyn profilointi ja mittarit

Ymmärtääksemme järjestelmän toimintaa ja profilointipyyntöjä otimme käyttöön tuen OpenTracing-protokollalle. Järjestelmä voi lähettää pyynnöstä tietoja tätä protokollaa tukeville työkaluille, kuten Zipkinille, jonka avulla voit ymmärtää, kuinka pyyntö suoritettiin:

Tarantool Data Gridin arkkitehtuuri ja ominaisuudet

Luonnollisesti järjestelmä tarjoaa sisäisiä mittareita, jotka voidaan kerätä Prometheuksen avulla ja visualisoida Grafanalla.

Ota käyttöön

Tarantool Data Grid voidaan ottaa käyttöön RPM-paketeista tai arkistosta jakelun tai Ansiblen apuohjelman avulla, myös Kubernetes (Tarantool Kubernetes -operaattori).

Liiketoimintalogiikkaa (konfiguraatiot, käsittelijät) toteuttava sovellus ladataan käyttöön otettuun Tarantool Data Grid -klusteriin arkiston muodossa käyttöliittymän kautta tai komentosarjan avulla tarjoamamme API:n kautta.

Filosofian alukkeet

Mitä sovelluksia voidaan luoda Tarantool Data Gridillä? Itse asiassa useimmat liiketoimintatehtävät liittyvät jotenkin tietovirran käsittelyyn, tallentamiseen ja käyttöön. Siksi, jos sinulla on suuria tietovirtoja, jotka on tallennettava ja käytettävä turvallisesti, tuotteemme voi säästää paljon kehitysaikaa ja keskittyä liiketoimintalogiikkaan.

Haluamme esimerkiksi kerätä tietoa kiinteistömarkkinoista, jotta meillä on jatkossa esimerkiksi tietoa parhaista tarjouksista. Tässä tapauksessa korostamme seuraavia tehtäviä:

  1. Tietolähteitämme ovat robotit, jotka keräävät tietoa avoimista lähteistä. Voit ratkaista tämän ongelman käyttämällä valmiita ratkaisuja tai kirjoittamalla koodia millä tahansa kielellä.
  2. Seuraavaksi Tarantool Data Grid hyväksyy ja tallentaa tiedot. Jos tietomuoto eri lähteistä on erilainen, voit kirjoittaa koodin Luaan, joka suorittaa muunnoksen yhteen muotoon. Esikäsittelyvaiheessa pystyt myös esimerkiksi suodattamaan päällekkäisiä tarjouksia tai lisäksi päivittämään tietokantaan tietoja markkinoilla työskentelevistä agenteista.
  3. Nyt sinulla on jo skaalautuva ratkaisu klusterissa, joka voidaan täyttää datalla ja tehdä datavalintoja. Sitten voit ottaa käyttöön uusia toimintoja, esimerkiksi kirjoittaa palvelun, joka tekee tietopyynnön ja antaa edullisimman tarjouksen päivässä - tämä vaatii muutaman rivin asetustiedostossa ja pienen Lua-koodin.

Mitä seuraavaksi?

Tavoitteenamme on parantaa käytön helppoutta Tarantool Data Grid. Tämä on esimerkiksi IDE, joka tukee hiekkalaatikossa toimivia profilointi- ja virheenkorjauskäsittelijöitä.

Kiinnitämme myös paljon huomiota turvallisuusasioihin. Meillä on parhaillaan käynnissä Venäjän FSTEC:n sertifiointi, joka vahvistaa korkean turvallisuustason ja täyttää henkilötietojen tietojärjestelmissä ja valtion tietojärjestelmissä käytettävien ohjelmistotuotteiden sertifiointivaatimukset.

Lähde: will.com

Lisää kommentti