U Tarantoolu možete kombinirati superbrzu bazu podataka i aplikaciju za rad s njima. Evo kako je to jednostavno učiniti

Prije pet godina pokušao sam raditi s Tarantoolom, ali tada mi nije išlo. Ali nedavno sam održao webinar na kojem sam govorio o Hadoopu i kako MapReduce radi. Tamo su mi postavili pitanje: "Zašto ne koristiti Tarantool za ovaj zadatak?"

Iz znatiželje sam se odlučio vratiti na njega, testirati najnoviju verziju - i ovaj put mi se jako svidio projekt. Sada ću vam pokazati kako napisati jednostavnu aplikaciju u Tarantoolu, učitati je i provjeriti njenu izvedbu, i vidjet ćete kako je sve jednostavno i cool.

U Tarantoolu možete kombinirati superbrzu bazu podataka i aplikaciju za rad s njima. Evo kako je to jednostavno učiniti

Što je Tarantool

Tarantool se pozicionira kao ultra brza baza podataka. Tamo možete unijeti podatke koje želite. Osim toga, replicirajte ih, razdvojite - to jest, podijelite ogromnu količinu podataka na nekoliko poslužitelja i kombinirajte rezultate s njih - napravite veze master-master otporne na pogreške.

Drugo, ovo je aplikacijski poslužitelj. Na njemu možete pisati svoje aplikacije, raditi s podacima, na primjer, brisati stare zapise u pozadini prema određenim pravilima. Možete napisati Http poslužitelj izravno u Tarantuli koji će raditi s podacima: dati njihovu količinu, tamo napisati nove podatke i sve to svesti na master.

Pročitao sam članak o tome kako su dečki napravili red poruka od 300 redaka, koji naprosto puca i juri - imaju minimalnu izvedbu od 20 000 poruka u sekundi. Ovdje se stvarno možete okrenuti i napisati vrlo veliku aplikaciju, a to neće biti pohrana, kao u PostgreS-u.

Pokušat ću opisati nešto poput ovog poslužitelja, samo jednostavno, u ovom članku.

Instalacija

Za test sam pokrenuo tri standardna virtualna računala - tvrdi disk od 20 GB, Ubuntu 18.04. 2 virtualna CPU-a i 4 GB memorije.

Instaliramo Tarantool - pokrenite bash skriptu ili dodajte repozitorij i instalirajte Tarantool. Link na skriptu - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Imamo naredbe poput:

tarantoolctl — glavna naredba za upravljanje instancama Tarantule.
/etc/tarantool - ovdje je cijela konfiguracija.
var/log/tarantool - evo cjepanica.
var/lib/tarantool — podaci leže ovdje, a zatim se dijele na instance.

Postoje mape instance-available i instance-enable - sadrže ono što će se pokrenuti - konfiguracijsku datoteku instance s lua kodom, koja opisuje na kojim portovima sluša, koja mu je memorija dostupna, Vinyl engine postavke, kod koji se pokreće pri pokretanju poslužitelji, dijeljenje, redovi čekanja, brisanje zastarjelih podataka i tako dalje.

Instance rade kao u PostgreS-u. Na primjer, želite pokrenuti nekoliko kopija baze podataka koja visi na različitim portovima. Ispada da se na jednom poslužitelju pokreće nekoliko instanci baze podataka, koje vise na različitim portovima. Mogu imati potpuno različite postavke - jedna instanca implementira jednu logiku, druga - drugu.

Upravljanje instancom

Imamo naredbu tarantoolctl koja vam omogućuje upravljanje instancama Tarantule. Na primjer, tarantoolctl check example će provjeriti konfiguracijsku datoteku i reći - datoteka je u redu ako tamo nema sintaktičkih pogrešaka.

Možete vidjeti status instance - tarantoolctl primjer statusa. Na isti način možete učiniti start, stop, restart.

Nakon što se instanca pokrene, možete se povezati s njom na dva načina.

1. Administrativna konzola

Prema zadanim postavkama, Tarantool otvara utičnicu, tamo se šalje normalni ASCII tekst za kontrolu Tarantoola. Povezivanje s konzolom uvijek se odvija pod admin korisnikom, nema autentifikacije, tako da nema potrebe eksternalizirati port konzole za upravljanje Tarantulom.

Da biste se povezali ovom metodom, trebate unijeti Tarantoolctl unesite naziv instance. Naredba će pokrenuti konzolu i spojiti se kao admin korisnik. Nikada ne izlažite priključak konzole vani - bolje ga ostavite kao utičnicu jedinice. Tada će se samo oni koji imaju pristup pisanju u utičnicu moći spojiti na Tarantulu.

Ova metoda je potrebna za administrativne stvari. Za rad s podacima koristite drugu metodu - binarni protokol.

2. Korištenje binarnog protokola za spajanje na određeni priključak

Konfiguracija sadrži direktivu slušanja, koja otvara priključak za vanjsku komunikaciju. Ovaj se priključak koristi s binarnim protokolom i ondje je omogućena provjera autentičnosti.

Za ovu vezu koristi se tarantoolctl povezivanje s brojem porta. Koristeći ga, možete se povezati s udaljenim poslužiteljima, koristiti autentifikaciju i dati različita prava pristupa.

Modul za snimanje podataka i kutiju

Budući da je Tarantool i baza podataka i aplikacijski poslužitelj, ima različite module. Zanima nas box modul - implementira rad s podacima. Kada nešto zapišete u kutiju, Tarantool zapisuje podatke na disk, pohranjuje ih u memoriju ili radi nešto drugo s njima.

Rekord

Na primjer, idemo u modul box i pozivamo funkciju box.once. Ovo će prisiliti Tarantool da pokrene naš kod kada se poslužitelj inicijalizira. Stvaramo prostor u kojem će biti pohranjeni naši podaci.

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')
    box.schema.user.grant('guest', 'read,write,execute', 'universe')

    -- Keep things safe by default
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

Nakon toga kreiramo primarni indeks - primarni - po kojem možemo pretraživati ​​podatke. Prema zadanim postavkama, ako ne navedete nijedan parametar, prvo polje u svakom zapisu koristit će se za primarni indeks.

Zatim dajemo grant korisniku gostu, pod kojim se povezujemo preko binarnog protokola. Dopuštamo čitanje, pisanje i izvršavanje preko cijele instance.

U usporedbi s konvencionalnim bazama podataka, ovdje je sve vrlo jednostavno. Imamo prostor – prostor u kojem su jednostavno pohranjeni naši podaci. Svaki zapis naziva se tuple. Zapakiran je u MessagePack. Ovo je vrlo cool format - binarni je i zauzima manje prostora - 18 bajtova naspram 27.

U Tarantoolu možete kombinirati superbrzu bazu podataka i aplikaciju za rad s njima. Evo kako je to jednostavno učiniti

Prilično je zgodno raditi s njim. Gotovo svaki redak, svaki zapis podataka može imati potpuno različite stupce.

Sve prostore možemo vidjeti pomoću naredbe Box.space. Da biste odabrali određenu instancu, napišite box.space example i dobijte potpune informacije o njoj.

Tarantool ima dva ugrađena motora: Memory i Vinyl. Memorija sprema sve podatke u memoriju. Stoga sve radi jednostavno i brzo. Podaci se izbacuju na disk, a postoji i mehanizam zapisnika za pisanje unaprijed, tako da nećemo ništa izgubiti ako se poslužitelj sruši.

Vinyl pohranjuje podatke na disk u nama poznatijem obliku - to jest, možete pohraniti više podataka nego što imamo memorije, a Tarantula će ih pročitati s diska.

Za sada ćemo koristiti Memory.

unix/:/var/run/tarantool/example.control> box.space.example
---
- engine: memtx
  before_replace: 'function: 0x41eb02c8'
  on_replace: 'function: 0x41eb0568'
  ck_constraint: []
  field_count: 0
  temporary: false
  index:
    0: &0
      unique: true
      parts:
      - type: unsigned
        is_nullable: false
        fieldno: 1
      id: 0
      space_id: 512
      type: TREE
      name: primary
    primary: *0
  is_local: false
  enabled: true
  name: example
  id: 512
...

unix/:/var/run/tarantool/example.control>

Indeks:

Primarni indeks mora biti kreiran za svaki prostor, jer bez njega ništa neće raditi. Kao u svakoj bazi podataka, kreiramo prvo polje – ID zapisa.

Dijelovi:

Ovdje navodimo od čega se sastoji naš indeks. Sastoji se od jednog dijela - prvo polje koje ćemo koristiti je tipa unsigned - pozitivni cijeli broj. Koliko se sjećam iz dokumentacije, maksimalan broj koji može biti je 18 kvintilijuna. To je puno.

Zatim možemo umetnuti podatke pomoću naredbe insert.

unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...

unix/:/var/run/tarantool/example.control>

Prvo polje se koristi kao primarni ključ, stoga mora biti jedinstveno. Nismo ograničeni brojem stupaca, tako da tamo možemo unijeti koliko god želimo podataka. Navedeni su u formatu MessagePack, koji sam gore opisao.

Izlaz podataka

Zatim možemo prikazati podatke pomoću naredbe select.

Box.example.select s tipkom {1} prikazat će željeni unos. Ako spustimo ključ, vidjet ćemo sve zapise koje imamo. Svi se razlikuju po broju stupaca, ali ovdje u načelu nema pojma stupaca - postoje brojevi polja.

Može postojati apsolutno bilo koja količina podataka. I na primjer, trebamo ih tražiti po drugom polju. Da bismo to učinili, stvaramo novi sekundarni indeks.


box.space.example:create_index( ‘secondary’, { type = ‘TREE’, unique = false, parts = {{field = 2, type =’string’} }}) 

Koristimo naredbu Create_index.
Nazovimo to sekundarno.

Nakon toga morate odrediti parametre. Vrsta indeksa je STABLO. Možda nije jedinstven, stoga unesite Unique = false.

Zatim označavamo od kojih se dijelova sastoji naš indeks. Field je broj polja za koje vežemo indeks, te specificiramo tip stringa. I tako je stvoreno.

unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unique: false
  parts:
  - type: string
    is_nullable: false
    fieldno: 2
  id: 1
  space_id: 512
  type: TREE
  name: secondary
...

unix/:/var/run/tarantool/example.control>

Sada to možemo nazvati ovako:

unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...

čuvanje

Ako ponovno pokrenemo instancu i ponovno pokušamo pozvati podatke, vidjet ćemo da ih nema - sve je prazno. To se događa jer Tarantool radi kontrolne točke i sprema podatke na disk, ali ako prestanemo raditi do sljedećeg spremanja, izgubit ćemo sve operacije – jer ćemo se oporaviti od zadnje kontrolne točke, koja je bila prije npr. dva sata.

Neće uspjeti niti spremati svake sekunde, jer stalno bacanje 20 GB na disk nije dobra ideja.

U tu svrhu osmišljen je i implementiran koncept zapisa unaprijed. Uz njegovu pomoć, za svaku promjenu podataka, kreira se unos u maloj datoteci zapisa unaprijed.

Svaki unos do kontrolne točke pohranjuje se u njima. Za ove datoteke postavljamo veličinu - na primjer, 64 MB. Kada je pun, snimanje počinje ići na drugu datoteku. I nakon ponovnog pokretanja, Tarantool se vraća sa zadnje kontrolne točke, a zatim prelazi preko svih kasnijih transakcija dok se ne zaustavi.

U Tarantoolu možete kombinirati superbrzu bazu podataka i aplikaciju za rad s njima. Evo kako je to jednostavno učiniti

Da biste izvršili takvo snimanje, morate navesti opciju u postavkama box.cfg (u datoteci example.lua):

wal_mode = “write”;

korištenje podataka

Uz ovo što smo sada napisali, možete koristiti Tarantulu za pohranjivanje podataka i vrlo brzo će raditi kao baza podataka. A sada je šlag na torti što sve možete učiniti.

Pisanje molbe

Na primjer, napišimo sljedeću aplikaciju za Tarantulu

Prijavu pogledajte ispod spojlera

box.cfg {
    listen = '0.0.0.0:3301';
    io_collect_interval = nil;
    readahead = 16320;
    memtx_memory = 128 * 1024 * 1024; -- 128Mb
    memtx_min_tuple_size = 16;
    memtx_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_memory = 128 * 1024 * 1024; -- 128Mb
    vinyl_cache = 128 * 1024 * 1024; -- 128Mb
    vinyl_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_write_threads = 2;
    wal_mode = "write";
    wal_max_size = 256 * 1024 * 1024;
    checkpoint_interval = 60 * 60; -- one hour
    checkpoint_count = 6;
    force_recovery = true;
    log_level = 5;
    log_nonblock = false;
    too_long_threshold = 0.5;
    read_only   = false
}

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')

    box.schema.user.create('example', { password = 'secret' })
    box.schema.user.grant('example', 'read,write,execute', 'space', 'example')

    box.schema.user.create('repl', { password = 'replication' })
    box.schema.user.grant('repl', 'replication')
end

-- for first run create a space and add set up grants
box.once('replica', bootstrap)

-- enabling console access
console = require('console')
console.listen('127.0.0.1:3302')

-- http config
local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

local router = http_router.new()

local function get_count()
 local cnt = box.space.example:len()
 return cnt
end

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

router:route({method = 'GET', path = '/token'}, function()
    local token = randomString(32)
    local last = box.space.example:len()
    box.space.example:insert{ last + 1, token }
    return {status = 200, body = json.encode({token = token})}
end)

prometheus = require('prometheus')

fiber = require('fiber')
tokens_count = prometheus.gauge("tarantool_tokens_count",
                              "API Tokens Count")

function monitor_tokens_count()
  while true do
    tokens_count:set(get_count())
    fiber.sleep(5)
  end
end
fiber.create(monitor_tokens_count)

router:route( { method = 'GET', path = '/metrics' }, prometheus.collect_http)

httpd:set_router(router)
httpd:start()

Deklariramo neku tablicu u lua koja definira znakove. Ova ploča je potrebna za generiranje slučajnog niza.

local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

Nakon toga deklariramo funkciju - randomString i u zagradi dajemo vrijednost duljine.

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

Zatim povezujemo http router i http server na naš Tarantula server, JSON, koji ćemo poslati klijentu.

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

Nakon toga počinjemo na portu 8080 na svim sučeljima http poslužitelja, koji će bilježiti sve zahtjeve i pogreške.

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

Zatim deklariramo route, tako da ako zahtjev s GET metodom stigne na port 8080 /count, tada pozivamo funkciju iz jedne linije. Vraća status - 200, 404, 403 ili bilo koji drugi koji navedemo.

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

U tijelu vraćamo json.encode, u njemu označavamo count i getcount, koji se poziva i pokazuje broj zapisa u našoj bazi.

Druga metoda

router:route({method = 'GET', path = '/token'}, function() 
    local token = randomString(32) 
    local last = box.space.example:len() 
    box.space.example:insert{ last + 1, token } 
    return {status = 200, body = json.encode({token = token})}
end)

Gdje u redu router:route({method = 'GET', path = '/token'}, function() pozivamo funkciju i generiramo token.

red lokalni token = randomString(32) je nasumični niz od 32 znaka.
U redu lokalni zadnji = box.space.example:len() izvadimo posljednji element.
I u redu box.space.example:insert{ last + 1, token } upišemo podatke u našu bazu, odnosno jednostavno povećamo ID za 1. To se, inače, može učiniti ne samo na ovaj nespretan način. Postoje sekvence za to u Tarantuli.

Tamo upisujemo token.

Dakle, napisali smo prijavu u jednoj datoteci. Možete odmah manipulirati podacima, a box modul će obaviti sav prljavi posao umjesto vas.

Sluša http i radi s podacima, sve je u jednoj instanci - i aplikacija i podaci. Stoga se sve događa prilično brzo.

Za početak instaliramo http modul:

Kako to radimo, pogledajte ispod spojlera

root@test2:/# tarantoolctl rocks install http
Installing http://rocks.tarantool.org/http-scm-1.src.rock
Missing dependencies for http scm-1:
   checks >= 3.0.1 (not installed)

http scm-1 depends on checks >= 3.0.1 (not installed)
Installing http://rocks.tarantool.org/checks-3.0.1-1.rockspec

Cloning into 'checks'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 28 (delta 1), reused 16 (delta 1), pack-reused 0
Receiving objects: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Note: checking out '580388773ef11085015b5a06fe52d61acf16b201'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

No existing manifest. Attempting to rebuild...
checks 3.0.1-1 is now installed in /.rocks (license: BSD)

-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found TARANTOOL: /usr/include (found version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR is /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR is /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    version


-- Build files have been written to: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Scanning dependencies of target httpd
[ 50%] Building C object http/CMakeFiles/httpd.dir/lib.c.o
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: In function ‘tpl_term’:
/usr/include/tarantool/lauxlib.h:144:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
    (*(B)->p++ = (char)(c)))
    ~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: note: in expansion of macro ‘luaL_addchar’
       luaL_addchar(b, '\');
       ^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: note: here
      default:
      ^~~~~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: In function ‘tpe_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
    type = TPE_TEXT;
    ~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: note: here
   case TPE_LINECODE:
   ^~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: In function ‘httpfast_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 code = 0;
                 ~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: note: here
             case status:
             ^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 state = message;
                 ~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: note: here
             case message:
             ^~~~
[100%] Linking C shared library lib.so
[100%] Built target httpd
[100%] Built target httpd
Install the project...
-- Install configuration: "Debug"
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

Također nam je potreban prometej za trčanje:

root@test2:/# tarantoolctl rocks install prometheus
Installing http://rocks.tarantool.org/prometheus-scm-1.rockspec

Cloning into 'prometheus'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 2), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (19/19), 10.73 KiB | 10.73 MiB/s, done.
Resolving deltas: 100% (2/2), done.
prometheus scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

Pokrećemo i možemo pristupiti modulima

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Content-length: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"count":2}root@test2:/#

/count nam daje status 200.
/token izdaje token i zapisuje ga u bazu podataka.

Testiranje brzine

Pokrenimo referentnu vrijednost za 50 000 zahtjeva. Bit će 500 natjecateljskih zahtjeva.

root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Tarantool
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /token
Document Length:        44 bytes

Concurrency Level:      500
Time taken for tests:   14.578 seconds
Complete requests:      50000
Failed requests:        0
Total transferred:      7950000 bytes
HTML transferred:       2200000 bytes
Requests per second:    3429.87 [#/sec] (mean)
Time per request:       145.778 [ms] (mean)
Time per request:       0.292 [ms] (mean, across all concurrent requests)
Transfer rate:          532.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   10 103.2      0    3048
Processing:    12   69 685.1     15   13538
Waiting:       12   69 685.1     15   13538
Total:         12   78 768.2     15   14573

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     15
  75%     16
  80%     16
  90%     16
  95%     16
  98%     21
  99%     42
 100%  14573 (longest request)
root@test2:/#

Izdaju se žetoni. I stalno bilježimo podatke. 99% zahtjeva obrađeno je za 42 milisekunde. Sukladno tome, imamo oko 3500 zahtjeva u sekundi na malom stroju s 2 jezgre i 4 gigabajta memorije.

Također možete odabrati nekih 50000 tokena i vidjeti njegovu vrijednost.

Možete koristiti ne samo http, već i pokrenuti pozadinske funkcije koje obrađuju vaše podatke. Osim toga, postoje razni okidači. Na primjer, možete pozvati funkcije na ažuriranjima, provjeriti nešto - ispraviti sukobe.

Možete pisati skriptne aplikacije izravno u samom poslužitelju baze podataka, a ne biti ograničeni ničim, povezivati ​​bilo koje module i implementirati bilo koju logiku.

Aplikacijski poslužitelj može pristupiti vanjskim poslužiteljima, dohvatiti podatke i dodati ih u svoju bazu podataka. Podatke iz ove baze podataka koristit će druge aplikacije.

Tarantula će to učiniti sama, a vi nećete morati pisati posebnu prijavu.

U zaključku

Ovo je tek prvi dio velikog posla. Drugi će biti objavljen vrlo brzo na blogu Mail.ru Group, a mi ćemo svakako dodati vezu na njega u ovom materijalu.

Ako ste zainteresirani za prisustvovanje događajima na kojima gradimo te stvari online i postavljanje pitanja u stvarnom vremenu, uključite se kanal DevOps by REBRAIN.

Ako se trebate preseliti u oblak ili imate pitanja o svojoj infrastrukturi, slobodno ostavite zahtjev.

PS Imamo 2 besplatne revizije mjesečno, možda će vaš projekt biti jedna od njih.

Izvor: www.habr.com

Dodajte komentar