V Tarantool môžete skombinovať super rýchlu databázu a aplikáciu na prácu s nimi. Takto je to jednoduché

Pred piatimi rokmi som skúšal pracovať s Tarantoolom, ale potom mi to nefungovalo. Ale nedávno som usporiadal webinár, kde som hovoril o Hadoop a ako funguje MapReduce. Tam mi položili otázku: „Prečo na túto úlohu nepoužiť Tarantool?

Zo zvedavosti som sa k nej rozhodol vrátiť, otestovať najnovšiu verziu – a tentoraz sa mi projekt veľmi páčil. Teraz vám ukážem, ako napísať jednoduchú aplikáciu v Tarantool, načítať ju a skontrolovať jej výkon a uvidíte, aké je všetko jednoduché a cool.

V Tarantool môžete skombinovať super rýchlu databázu a aplikáciu na prácu s nimi. Takto je to jednoduché

Čo je Tarantool

Tarantool sa stavia ako ultra rýchla databáza. Môžete tam vložiť akékoľvek údaje, ktoré chcete. Navyše ich replikujte, úlomky - to znamená, že rozdeľte obrovské množstvo údajov na niekoľko serverov a kombinujte výsledky z nich - vytvorte spojenia master-master odolné voči chybám.

Po druhé, toto je aplikačný server. Môžete na ňom písať svoje aplikácie, pracovať s dátami, napríklad mazať staré záznamy na pozadí podľa určitých pravidiel. Priamo v Tarantule si môžete napísať Http server, ktorý bude pracovať s dátami: rozdajte ich množstvo, napíšte tam nové dáta a všetko zredukujte na master.

Čítal som článok o tom, ako si chalani vytvorili front správ s 300 riadkami, ktorý je jednoducho prasknutý a uháňajúci - majú minimálny výkon 20 000 správ za sekundu. Tu sa naozaj môžete otočiť a napísať veľmi veľkú aplikáciu a nebude to úložisko, ako v PostgreS.

V tomto článku sa pokúsim opísať niečo ako tento server, len jednoducho.

Inštalácia

Na test som spustil tri štandardné virtuálne stroje – 20 GB pevný disk, Ubuntu 18.04. 2 virtuálne CPU a 4 GB pamäte.

Nainštalujeme Tarantool - spustite bash skript alebo pridajte úložisko a nainštalujte Tarantool. Odkaz na skript - (curl -L https://tarantool.io/installer.sh | VER = 2.4 sudo -E bash). Máme príkazy ako:

tarantoolctl — hlavný príkaz na správu inštancií Tarantula.
/etc/tarantool - tu je celá konfigurácia.
var/log/tarantool - tu sú záznamy.
var/lib/tarantool — dáta ležia tu a potom sú rozdelené do inštancií.

Sú tam priečinky instance-available a instance-enable – obsahuje to, čo sa spustí – konfiguračný súbor inštancie s lua kódom, ktorý popisuje, na ktorých portoch počúva, aká pamäť má k dispozícii, nastavenia Vinyl engine, kód, ktorý sa spúšťa pri štarte servery, sharding, fronty, mazanie zastaraných dát atď.

Inštancie fungujú ako v PostgreS. Napríklad chcete spustiť niekoľko kópií databázy, ktorá visí na rôznych portoch. Ukazuje sa, že na jednom serveri je spustených niekoľko inštancií databázy, ktoré visia na rôznych portoch. Môžu mať úplne odlišné nastavenia - jedna inštancia implementuje jednu logiku, druhá - inú.

Správa inštancií

Máme príkaz tarantoolctl, ktorý vám umožňuje spravovať inštancie Tarantule. Napríklad kontrolný príklad tarantoolctl skontroluje konfiguračný súbor a povie - súbor je v poriadku, ak v ňom nie sú žiadne syntaktické chyby.

Môžete vidieť stav inštancie - príklad stavu tarantoolctl. Rovnakým spôsobom môžete spustiť, zastaviť, reštartovať.

Keď je inštancia spustená, môžete sa k nej pripojiť dvoma spôsobmi.

1. Administratívna konzola

V predvolenom nastavení Tarantool otvára zásuvku, tam sa posiela normálny ASCII text na ovládanie Tarantool. Pripojenie ku konzole vždy prebieha pod užívateľom admin, neexistuje žiadna autentifikácia, takže nie je potrebné externalizovať port konzoly na správu Tarantuly.

Ak sa chcete pripojiť pomocou tejto metódy, musíte zadať názov inštancie Tarantoolctl. Príkaz spustí konzolu a pripojí sa ako administrátor. Nikdy nevystavujte port konzoly zvonku - je lepšie ho ponechať ako zásuvku jednotky. Potom sa k Tarantule budú môcť pripojiť iba tí, ktorí majú prístup k zápisu do zásuvky.

Tento spôsob je potrebný na administratívne veci. Na prácu s údajmi použite druhý spôsob - binárny protokol.

2. Použitie binárneho protokolu na pripojenie ku konkrétnemu portu

Konfigurácia obsahuje príkaz na počúvanie, ktorý otvára port pre externú komunikáciu. Tento port sa používa s binárnym protokolom a je tu povolená autentifikácia.

Pre toto pripojenie sa používa tarantoolctl connect to port number. Pomocou neho sa môžete pripojiť k vzdialeným serverom, používať autentifikáciu a udeľovať rôzne prístupové práva.

Modul záznamu údajov a schránok

Keďže Tarantool je databázový aj aplikačný server, má rôzne moduly. Zaujal nás modul box - implementuje prácu s dátami. Keď niečo zapíšete do schránky, Tarantool zapíše dáta na disk, uloží ich do pamäte alebo s nimi urobí niečo iné.

Záznam

Napríklad prejdeme do modulu box a zavoláme funkciu box.once. To prinúti Tarantool spustiť náš kód, keď je server inicializovaný. Vytvárame priestor, v ktorom budú uložené naše dáta.

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

Potom vytvoríme primárny index - primárny - pomocou ktorého môžeme vyhľadávať údaje. Ak nešpecifikujete žiadne parametre, prvé pole v každom zázname sa štandardne použije pre primárny index.

Potom vykonáme grant hosťovi, pod ktorým sa pripojíme cez binárny protokol. Umožňujeme čítanie, zápis a spúšťanie v celej inštancii.

V porovnaní s bežnými databázami je tu všetko celkom jednoduché. Máme priestor – oblasť, v ktorej sú jednoducho uložené naše dáta. Každý záznam sa nazýva n-tica. Je zabalený v MessagePack. Toto je veľmi skvelý formát – je binárny a zaberá menej miesta – 18 bajtov oproti 27.

V Tarantool môžete skombinovať super rýchlu databázu a aplikáciu na prácu s nimi. Takto je to jednoduché

Je celkom pohodlné s ním pracovať. Takmer každý riadok, každý údajový záznam môže mať úplne odlišné stĺpce.

Všetky priestory môžeme zobraziť pomocou príkazu Box.space. Ak chcete vybrať konkrétnu inštanciu, napíšte príklad box.space a získajte o nej úplné informácie.

Tarantool má dva vstavané motory: Memory a Vinyl. Pamäť ukladá všetky údaje do pamäte. Preto všetko funguje jednoducho a rýchlo. Údaje sa uložia na disk a existuje aj mechanizmus záznamu vopred, takže v prípade zlyhania servera nič nestratíme.

Vinyl ukladá dáta na disk v pre nás známejšej forme – to znamená, že môžete uložiť viac dát, ako máme v pamäti a Tarantula ich z disku načíta.

Zatiaľ budeme používať pamäť.

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>

index:

Primárny index musí byť vytvorený pre akýkoľvek priestor, pretože bez neho nebude nič fungovať. Ako v každej databáze vytvoríme prvé pole – ID záznamu.

Časti:

Tu uvádzame, z čoho pozostáva náš index. Skladá sa z jednej časti – prvé pole, ktoré použijeme, je typu unsigned – kladné celé číslo. Pokiaľ si pamätám z dokumentácie, maximálny počet, ktorý môže byť, je 18 kvintiliónov. To je veľa.

Potom môžeme vložiť dáta pomocou príkazu 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>

Prvé pole sa používa ako primárny kľúč, takže musí byť jedinečné. Nie sme limitovaní počtom stĺpcov, takže si tam môžeme vložiť toľko údajov, koľko chceme. Sú špecifikované vo formáte MessagePack, ktorý som opísal vyššie.

Dátový výstup

Potom môžeme údaje zobraziť pomocou príkazu select.

Box.example.select pomocou klávesu {1} zobrazí požadovaný záznam. Ak sklopíme kľúč, uvidíme všetky záznamy, ktoré máme. Všetky sa líšia počtom stĺpcov, ale tu v zásade neexistuje žiadna koncepcia stĺpcov - existujú čísla polí.

Dát môže byť absolútne ľubovoľné. A napríklad ich musíme hľadať podľa druhého poľa. Na tento účel vytvoríme nový sekundárny index.


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

Používame príkaz Create_index.
Nazvime to sekundárne.

Potom musíte zadať parametre. Typ indexu je STROM. Nemusí byť jedinečný, preto zadajte Unique = false.

Potom uvedieme, z ktorých častí sa náš index skladá. Pole je číslo poľa, na ktoré naviažeme index a špecifikujeme typ reťazca. A tak to vzniklo.

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>

Teraz to môžeme nazvať takto:

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

konzervácia

Ak reštartujeme inštanciu a pokúsime sa znova zavolať dáta, uvidíme, že tam nie sú - všetko je prázdne. Deje sa tak preto, že Tarantool robí kontrolné body a ukladá dáta na disk, no ak prestaneme pracovať až do ďalšieho uloženia, prídeme o všetky operácie – pretože sa zotavíme z posledného kontrolného bodu, ktorý bol napríklad pred dvomi hodinami.

Nebude fungovať ani ukladanie každej sekundy, pretože neustále ukladať 20 GB na disk nie je dobrý nápad.

Na tento účel bol vynájdený a implementovaný koncept zapisovacieho protokolu. S jeho pomocou sa pre každú zmenu v údajoch vytvorí záznam v malom protokolovom súbore pre zápis vopred.

Je v nich uložený každý vstup až po kontrolný bod. Pre tieto súbory nastavíme veľkosť – napríklad 64 MB. Keď je plný, nahrávanie sa spustí do druhého súboru. A po reštarte sa Tarantool obnoví od posledného kontrolného bodu a potom prejde všetky neskoršie transakcie, kým sa nezastaví.

V Tarantool môžete skombinovať super rýchlu databázu a aplikáciu na prácu s nimi. Takto je to jednoduché

Ak chcete vykonať takýto záznam, musíte zadať možnosť v nastaveniach box.cfg (v súbore example.lua):

wal_mode = “write”;

využitie dát

S tým, čo sme teraz napísali, môžete Tarantulu použiť na ukladanie údajov a ako databáza bude fungovať veľmi rýchlo. A teraz je čerešničkou na torte, čo s tým všetkým môžete robiť.

Písanie aplikácie

Napríklad napíšme nasledujúcu aplikáciu pre Tarantula

Pozrite si aplikáciu pod spojlerom

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()

Deklarujeme nejakú tabuľku v lua, ktorá definuje znaky. Táto platňa je potrebná na generovanie náhodného reťazca.

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

Potom deklarujeme funkciu - randomString a v zátvorkách uvedieme hodnotu dĺžky.

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

Potom pripojíme http router a http server k nášmu Tarantula serveru JSON, ktorý pošleme klientovi.

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

Potom začneme na porte 8080 na všetkých rozhraniach http servera, ktorý bude zaznamenávať všetky požiadavky a chyby.

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

Ďalej deklarujeme route, takže ak príde požiadavka s metódou GET na port 8080 /count, tak funkciu voláme z jedného riadku. Vráti stav - 200, 404, 403 alebo akýkoľvek iný, ktorý určíme.

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

V tele vrátime json.encode, v ňom uvedieme count a getcount, ktorý sa volá a ukazuje počet záznamov v našej databáze.

Druhá metóda

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)

Kde v rade router:route({method = 'GET', cesta = '/token'}, function() zavoláme funkciu a vygenerujeme token.

Riadok lokálny token = randomString(32) je náhodný reťazec 32 znakov.
V rade local last = box.space.example:len() vytiahneme posledný prvok.
A v rade box.space.example:insert{ posledné + 1, token } údaje zapíšeme do našej databázy, čiže jednoducho zväčšíme ID o 1. Dá sa to, mimochodom, nielen týmto nemotorným spôsobom. V Tarantule na to existujú sekvencie.

Napíšeme tam token.

Preto sme aplikáciu napísali do jedného súboru. Dá sa tam priamo manipulovať s údajmi a všetku špinavú prácu urobí za vás modul boxu.

Počúva http a pracuje s dátami, všetko je v jedinej inštancii – aplikácia aj dáta. Preto sa všetko deje pomerne rýchlo.

Na začiatok nainštalujeme modul http:

Ako to robíme, pozrite sa pod spojler

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:/#

Na spustenie potrebujeme aj prometheusa:

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:/#

Spustíme a môžeme pristupovať k modulom

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 nám dáva stav 200.
/token vydá token a zapíše tento token do databázy.

Testovanie rýchlosti

Spustite benchmark pre 50 000 žiadostí. Bude 500 súťažných žiadostí.

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:/#

Vydávajú sa tokeny. A neustále zaznamenávame údaje. 99 % žiadostí bolo spracovaných za 42 milisekúnd. V súlade s tým máme na malom počítači s 3500 jadrami a 2 gigabajtmi pamäte asi 4 požiadaviek za sekundu.

Môžete si tiež vybrať nejakých 50000 XNUMX tokenov a vidieť ich hodnotu.

Môžete použiť nielen http, ale aj spúšťať funkcie na pozadí, ktoré spracúvajú vaše údaje. Okrem toho existujú rôzne spúšťače. Môžete napríklad volať funkcie na aktualizácie, niečo skontrolovať - ​​opraviť konflikty.

Skriptové aplikácie môžete písať priamo v samotnom databázovom serveri a nenechať sa ničím obmedzovať, pripájať ľubovoľné moduly a implementovať ľubovoľnú logiku.

Aplikačný server môže pristupovať k externým serverom, získavať údaje a pridávať ich do svojej databázy. Údaje z tejto databázy využijú iné aplikácie.

Tarantula to urobí sama a nebudete musieť písať samostatnú aplikáciu.

na záver

Toto je len prvá časť veľkého diela. Druhý bude čoskoro zverejnený na blogu skupiny Mail.ru a určite naň pridáme odkaz v tomto materiáli.

Ak máte záujem zúčastniť sa podujatí, na ktorých staviame tieto veci online a klásť otázky v reálnom čase, nalaďte sa kanál DevOps od REBRAIN.

Ak potrebujete prejsť do cloudu alebo máte otázky týkajúce sa vašej infraštruktúry, pokojne zanechajte žiadosť.

PS Máme 2 bezplatné audity mesačne, možno aj váš projekt bude jedným z nich.

Zdroj: hab.com

Pridať komentár