Arkitektura at mga kakayahan ng Tarantool Data Grid

Arkitektura at mga kakayahan ng Tarantool Data Grid

Noong 2017, nanalo kami sa isang kompetisyon para bumuo ng transactional core ng negosyo ng pamumuhunan ng Alfa-Bank at nagsimulang magtrabaho (sa HighLoad++ 2018 na may ulat sa core ng negosyo sa pamumuhunan nagsalita Vladimir Drynkin, pinuno ng transactional core ng investment business ng Alfa Bank). Ang system na ito ay dapat na pinagsama-samang data ng transaksyon mula sa iba't ibang mga mapagkukunan sa iba't ibang mga format, dalhin ang data sa isang pinag-isang form, iimbak ito at magbigay ng access dito.

Sa panahon ng proseso ng pag-develop, ang system ay umunlad at nakakuha ng functionality, at sa isang punto napagtanto namin na kami ay nag-kristal ng isang bagay na higit pa sa application software na nilikha upang malutas ang isang mahigpit na tinukoy na hanay ng mga gawain: nagtagumpay kami system para sa pagbuo ng mga distributed application na may patuloy na storage. Ang karanasang natamo namin ay naging batayan ng isang bagong produkto - Tarantool Data Grid (TDG).

Gusto kong pag-usapan ang tungkol sa arkitektura ng TDG at ang mga solusyong narating namin sa panahon ng proseso ng pagbuo, ipakilala sa iyo ang pangunahing pag-andar at ipakita kung paano maaaring maging batayan ang aming produkto para sa pagbuo ng mga kumpletong solusyon.

Sa arkitektura, hinati namin ang sistema sa magkahiwalay mga tungkulin, na ang bawat isa ay responsable para sa paglutas ng isang tiyak na hanay ng mga problema. Ang isang instance ng tumatakbong application ay nagpapatupad ng isa o higit pang mga uri ng tungkulin. Maaaring may ilang mga tungkulin ng parehong uri sa isang cluster:

Arkitektura at mga kakayahan ng Tarantool Data Grid

connector

Ang connector ay may pananagutan para sa komunikasyon sa labas ng mundo; ang gawain nito ay tanggapin ang kahilingan, i-parse ito, at kung magtagumpay ito, ipadala ang data para sa pagproseso sa input processor. Sinusuportahan namin ang mga format ng HTTP, SOAP, Kafka, FIX. Binibigyang-daan ka ng arkitektura na magdagdag lamang ng suporta para sa mga bagong format, na may paparating na suporta para sa IBM MQ. Kung nabigo ang pag-parse ng kahilingan, magbabalik ng error ang connector; kung hindi, tutugon ito na matagumpay na naproseso ang kahilingan, kahit na may naganap na error sa karagdagang pagproseso nito. Ito ay partikular na ginawa upang gumana sa mga system na hindi alam kung paano ulitin ang mga kahilingan - o, sa kabaligtaran, gawin ito nang paulit-ulit. Upang hindi mawalan ng data, ginagamit ang isang queue sa pag-aayos: ang bagay ay unang nakapasok dito at pagkatapos lamang na maalis ang matagumpay na pagproseso dito. Maaaring makatanggap ang administrator ng mga alerto tungkol sa mga bagay na natitira sa pila ng pag-aayos, at pagkatapos na alisin ang isang error sa software o pagkabigo ng hardware, subukang muli.

Input processor

Inuuri ng Input processor ang natanggap na data ayon sa mga katangiang tampok at tumatawag ng mga naaangkop na processor. Ang mga Handler ay Lua code na tumatakbo sa isang sandbox, kaya hindi sila makakaapekto sa paggana ng system. Sa yugtong ito, ang data ay maaaring bawasan sa kinakailangang form, at, kung kinakailangan, ang isang arbitrary na bilang ng mga gawain ay maaaring ilunsad na maaaring ipatupad ang kinakailangang lohika. Halimbawa, sa produktong MDM (Master Data Management) na binuo sa Tarantool Data Grid, kapag nagdadagdag ng bagong user, upang hindi mapabagal ang pagproseso ng kahilingan, inilulunsad namin ang paglikha ng isang gintong talaan bilang isang hiwalay na gawain. Sinusuportahan ng sandbox ang mga kahilingan para sa pagbabasa, pagbabago at pagdaragdag ng data, nagbibigay-daan sa iyong magsagawa ng ilang function sa lahat ng mga tungkulin ng uri ng storage at pagsasama-sama ng resulta (mapa/bawasan).

Ang mga humahawak ay maaaring ilarawan sa mga file:

sum.lua

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

At pagkatapos, ipinahayag sa pagsasaayos:

functions:
  sum: { __file: sum.lua }

Bakit Lua? Ang Lua ay isang napakasimpleng wika. Batay sa aming karanasan, ilang oras matapos itong malaman, ang mga tao ay nagsimulang magsulat ng code na lumulutas sa kanilang problema. At ito ay hindi lamang mga propesyonal na developer, ngunit, halimbawa, mga analyst. Bilang karagdagan, salamat sa jit compiler, mabilis na tumatakbo si Lua.

Imbakan

Ang storage ay nag-iimbak ng patuloy na data. Bago i-save, pinapatunayan ang data laban sa schema ng data. Upang ilarawan ang circuit gumagamit kami ng pinahabang format Apache Avro... Halimbawa:

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

Batay sa paglalarawang ito, ang DDL (Data Definition Language) ay awtomatikong nabuo para sa Tarantula DBMS at GraphQL schema para sa pag-access ng data.

Sinusuportahan ang asynchronous data replication (may mga planong magdagdag ng kasabay).

Output processor

Minsan kinakailangan na abisuhan ang mga panlabas na mamimili tungkol sa pagdating ng bagong data; para sa layuning ito, mayroong tungkulin ng Output processor. Pagkatapos i-save ang data, maaari itong maipasa sa kaukulang handler (halimbawa, upang dalhin ito sa form na kinakailangan ng consumer) - at pagkatapos ay ipasa sa connector para sa pagpapadala. Ginagamit din dito ang pila sa pag-aayos: kung walang tumanggap sa bagay, maaaring subukang muli ng administrator sa ibang pagkakataon.

Pagsusukat

Ang mga tungkulin ng connector, input processor, at output processor ay walang estado, na nagbibigay-daan sa amin na sukatin ang system nang pahalang sa pamamagitan lamang ng pagdaragdag ng mga bagong instance ng application na pinagana ang nais na uri ng tungkulin. Ginagamit ang imbakan para sa pahalang na pag-scale diskarte sa pag-aayos ng isang kumpol gamit ang mga virtual na bucket. Pagkatapos magdagdag ng bagong server, ang ilan sa mga bucket mula sa mga lumang server ay ililipat sa bagong server sa background; malinaw itong nangyayari sa mga user at hindi nakakaapekto sa pagpapatakbo ng buong system.

Mga Katangian ng Data

Ang mga bagay ay maaaring napakalaki at naglalaman ng iba pang mga bagay. Tinitiyak namin ang atomicity ng pagdaragdag at pag-update ng data sa pamamagitan ng pag-iimbak ng isang bagay na may lahat ng dependencies sa isang virtual na bucket. Pinipigilan nito ang object mula sa pagiging "pagkalat" sa ilang mga pisikal na server.

Sinusuportahan ang pag-bersyon: bawat pag-update ng isang bagay ay lumilikha ng bagong bersyon, at maaari tayong palaging maglaan ng oras at tingnan kung ano ang hitsura ng mundo noon. Para sa data na hindi nangangailangan ng mahabang kasaysayan, maaari naming limitahan ang bilang ng mga bersyon o kahit na mag-imbak lamang ng isa - ang pinakabago - iyon ay, mahalagang huwag paganahin ang bersyon para sa isang partikular na uri. Maaari mo ring limitahan ang kasaysayan ayon sa oras: halimbawa, tanggalin ang lahat ng mga bagay na may partikular na uri na mas matanda sa 1 taon. Sinusuportahan din ang pag-archive: maaari naming i-unload ang mga bagay na mas luma kaysa sa tinukoy na oras, na nagbibigay ng espasyo sa cluster.

gawain

Kabilang sa mga kagiliw-giliw na tampok, ito ay nagkakahalaga ng pagpuna sa kakayahang maglunsad ng mga gawain sa isang iskedyul, sa kahilingan ng gumagamit, o programmatically mula sa sandbox:

Arkitektura at mga kakayahan ng Tarantool Data Grid

Dito makikita natin ang isa pang tungkulin - runner. Ang tungkuling ito ay walang estado, at ang mga karagdagang instance ng aplikasyon na may ganitong tungkulin ay maaaring idagdag sa cluster kung kinakailangan. Ang responsibilidad ng mananakbo ay kumpletuhin ang mga gawain. Gaya ng nabanggit, posibleng makabuo ng mga bagong gawain mula sa sandbox; sila ay nai-save sa isang queue sa imbakan at pagkatapos ay naisakatuparan sa runner. Ang ganitong uri ng gawain ay tinatawag na Job. Mayroon din kaming uri ng gawain na tinatawag na Task - ito ay mga gawaing tinukoy ng user na tumatakbo sa isang iskedyul (gamit ang cron syntax) o on demand. Para ilunsad at subaybayan ang mga ganoong gawain, mayroon kaming maginhawang task manager. Upang maging available ang functionality na ito, dapat mong paganahin ang tungkulin ng scheduler; ang papel na ito ay may estado, kaya hindi ito sukat, na hindi kinakailangan; sa parehong oras, tulad ng lahat ng iba pang mga tungkulin, maaari itong magkaroon ng isang replika na magsisimulang gumana kung biglang tumanggi ang master.

Magtotroso

Ang isa pang tungkulin ay tinatawag na logger. Nangongolekta ito ng mga log mula sa lahat ng miyembro ng cluster at nagbibigay ng interface para sa pag-upload at pagtingin sa mga ito sa pamamagitan ng web interface.

Mga Serbisyo

Ito ay nagkakahalaga ng pagbanggit na ang sistema ay ginagawang madali upang lumikha ng mga serbisyo. Sa configuration file, maaari mong tukuyin kung aling mga kahilingan ang ipinadala sa isang handler na isinulat ng user na tumatakbo sa sandbox. Sa handler na ito, maaari mong, halimbawa, magpatakbo ng ilang uri ng analytical query at ibalik ang resulta.

Ang serbisyo ay inilarawan sa configuration file:

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

Ang GraphQL API ay awtomatikong nabuo at ang serbisyo ay magiging available para sa pagtawag:

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

Tatawagin nito ang handler sumna magbabalik ng resulta:

3

Query Profiling at Sukatan

Upang maunawaan ang pagpapatakbo ng system at mga kahilingan sa pag-profile, nagpatupad kami ng suporta para sa OpenTracing protocol. Ang system ay maaaring magpadala ng impormasyon on demand sa mga tool na sumusuporta sa protocol na ito, tulad ng Zipkin, na magbibigay-daan sa iyong maunawaan kung paano naisakatuparan ang kahilingan:

Arkitektura at mga kakayahan ng Tarantool Data Grid

Naturally, ang system ay nagbibigay ng mga panloob na sukatan na maaaring kolektahin gamit ang Prometheus at mailarawan gamit ang Grafana.

I-deploy

Maaaring i-deploy ang Tarantool Data Grid mula sa mga RPM packages o isang archive, gamit ang isang utility mula sa distribution o Ansible, mayroon ding suporta para sa Kubernetes (Operator ng Tarantool Kubernetes).

Ang application na nagpapatupad ng business logic (configuration, handler) ay nilo-load sa naka-deploy na Tarantool Data Grid cluster sa anyo ng archive sa pamamagitan ng UI o paggamit ng script sa pamamagitan ng API na ibinigay sa amin.

Mga Sample na Aplikasyon

Anong mga application ang maaaring gawin gamit ang Tarantool Data Grid? Sa katunayan, karamihan sa mga gawain sa negosyo ay kahit papaano ay nauugnay sa pagproseso, pag-iimbak at pag-access sa daloy ng data. Samakatuwid, kung mayroon kang malalaking stream ng data na kailangang ligtas na maimbak at ma-access, kung gayon ang aming produkto ay makakatipid sa iyo ng maraming oras ng pag-unlad at tumuon sa lohika ng iyong negosyo.

Halimbawa, gusto naming mangolekta ng impormasyon tungkol sa merkado ng real estate, upang sa hinaharap, halimbawa, magkakaroon kami ng impormasyon tungkol sa mga pinakamahusay na alok. Sa kasong ito, i-highlight namin ang mga sumusunod na gawain:

  1. Ang mga robot na nangongolekta ng impormasyon mula sa mga open source ay magiging aming data source. Maaari mong lutasin ang problemang ito gamit ang mga handa na solusyon o pagsulat ng code sa anumang wika.
  2. Susunod, tatanggapin at ise-save ng Tarantool Data Grid ang data. Kung iba ang format ng data mula sa iba't ibang pinagmulan, maaari kang magsulat ng code sa Lua na magsasagawa ng conversion sa iisang format. Sa yugto ng pre-processing, magagawa mo rin, halimbawa, na i-filter ang mga duplicate na alok o karagdagang i-update ang impormasyon tungkol sa mga ahente na nagtatrabaho sa merkado sa database.
  3. Ngayon ay mayroon ka nang nasusukat na solusyon sa isang kumpol na maaaring punan ng data at gumawa ng mga seleksyon ng data. Pagkatapos ay maaari kang magpatupad ng bagong pag-andar, halimbawa, magsulat ng isang serbisyo na gagawa ng isang kahilingan para sa data at magbibigay ng pinakakapaki-pakinabang na alok bawat araw - mangangailangan ito ng ilang linya sa configuration file at isang maliit na Lua code.

Ano ang susunod?

Ang aming priyoridad ay upang mapabuti ang kadalian ng pag-unlad gamit Tarantool Data Grid. Halimbawa, ito ay isang IDE na may suporta para sa pag-profile at pag-debug ng mga humahawak na tumatakbo sa isang sandbox.

Bigyang-pansin din namin ang mga isyu sa kaligtasan. Sa ngayon ay sumasailalim kami sa sertipikasyon ng FSTEC ng Russia upang kumpirmahin ang mataas na antas ng seguridad at matugunan ang mga kinakailangan para sa sertipikasyon ng mga produktong software na ginagamit sa mga sistema ng impormasyon ng personal na data at mga sistema ng impormasyon ng pamahalaan.

Pinagmulan: www.habr.com

Magdagdag ng komento