In Tarantool, pudete combine una basa di dati super-veloce è una applicazione per travaglià cun elli. Eccu quantu faciule hè di fà

Cinque anni fà aghju pruvatu à travaglià cù Tarantool, ma ùn hà micca travagliatu per mè. Ma recentemente aghju tenutu un webinar induve aghju parlatu di Hadoop è cumu funziona MapReduce. Ci anu fattu una dumanda: "Perchè ùn aduprà Tarantool per questu compitu?"

Per curiosità, decisu di vultà in questu, pruvà l'ultima versione - è sta volta mi piace assai u prugettu. Avà vi mustraraghju cumu scrive una applicazione simplice in Tarantool, caricala è verificate u so prestazione, è vi vede cumu tuttu hè faciule è cool.

In Tarantool, pudete combine una basa di dati super-veloce è una applicazione per travaglià cun elli. Eccu quantu faciule hè di fà

Cosa hè Tarantool

Tarantool si pone cum'è una basa di dati ultra-rapida. Pudete mette qualsiasi dati chì vulete quì. In più, replicali, shard - vale à dì, sparte una quantità enorme di dati in parechji servitori è combina i risultati da elli - facenu cunnessioni maestru-maestru toleranti à i difetti.

Siconda, questu hè un servitore di applicazioni. Pudete scrive e vostre applicazioni nantu à questu, travaglià cù dati, per esempiu, sguassate i vechji records in u fondu secondu certi reguli. Pudete scrive un servore Http direttamente in Tarantula chì hà da travaglià cù dati: dà a so quantità, scrivite novi dati è riduce tuttu à u maestru.

Aghju lettu un articulu nantu à cumu i picciotti anu fattu una fila di messagi di 300 linee, chì hè simplicemente sbuchjata è corsa - anu un rendimentu minimu di 20 000 messagi per seconda. Quì pudete veramente vultà è scrive una applicazione assai grande, è ùn serà micca almacenamiento, cum'è in PostgreS.

Pruvaraghju di discrive qualcosa cum'è stu servitore, solu simplice, in questu articulu.

rimarchevuli

Per a prova, aghju cuminciatu trè macchine virtuali standard - un discu duru 20 GB, Ubuntu 18.04. 2 CPU virtuali è 4 giga di memoria.

Installemu Tarantool - eseguite u script bash o aghjunghje un repository è fate apt install Tarantool. Link à u script - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Avemu cumandamenti cum'è:

tarantoolctl - u cumandamentu principale per a gestione di l'istanze di Tarantula.
/etc/tarantool - quì hè tutta a cunfigurazione.
var/log/tarantool - quì sò i logs.
var/lib/tarantool - i dati si trovanu quì, è dopu hè divisu in casi.

Ci sò cartulare instance-available è instance-enable - cuntene ciò chì serà lanciatu - un schedariu di cunfigurazione di istanza cù codice lua, chì descrive in quali porti ascolta, quale memoria hè dispunibule, paràmetri di u mutore di vinile, codice chì corre à l'iniziu servitori, sharding, file, eliminazione di dati obsoleti, etc.

L'istanze funzionanu cum'è in PostgreS. Per esempiu, vulete eseguisce parechje copie di una basa di dati chì pende in diversi porti. Risulta chì parechji casi di basa di dati sò lanciati nantu à un servitore, chì pende nantu à diversi porti. Puderanu avè paràmetri completamente differenti - un esempiu implementa una logica, u sicondu - un altru.

Gestione d'istanze

Avemu u cumandamentu tarantoolctl, chì permette di gestisce l'istanze di Tarantula. Per esempiu, l'esempiu di verificazione tarantoolctl verificarà u schedariu di cunfigurazione è dicenu - u schedariu hè ok s'ellu ùn ci sò micca errori di sintassi.

Pudete vede u statutu di l'istanza - esempiu di statu tarantoolctl. In u listessu modu, pudete fà principià, arrestà, riavvia.

Una volta chì l'istanza hè in esecuzione, pudete cunnette à questu in dui maneri.

1. Consola amministrativa

Per automaticamente, Tarantool apre un socket, u testu ASCII normale hè mandatu quì per cuntrullà Tarantool. A cunnessione à a cunsola si trova sempre sottu à l'usu admin, ùn ci hè micca autentificazione, per quessa, ùn ci hè bisognu di esternalizza u portu di a cunsola per gestisce Tarantula.

Per cunnette cù stu metudu, avete bisognu di inserisce Tarantoolctl entre u nome di l'istanza. U cumandimu lanciarà a cunsola è cunnette cum'è l'utilizatore amministratore. Ùn mai espone u portu di a cunsola à l'esternu - hè megliu lascià cum'è un socket di unità. Allora solu quelli chì anu accessu à scrive à u socket puderanu cunnette à Tarantula.

Stu metudu hè necessariu per e cose amministrative. Per travaglià cù dati, utilizate u sicondu metudu - u protocolu binariu.

2. Utilizendu un protocolu binariu per cunnette à un portu specificu

A cunfigurazione cuntene una direttiva d'ascolta, chì apre un portu per cumunicazioni esterne. Stu portu hè utilizatu cù u protocolu binariu è l'autentificazione hè attivata quì.

Per questa cunnessione, u tarantoolctl connect to port number hè utilizatu. Utilizendu, pudete cunnette à i servitori remoti, aduprà l'autentificazione è dà diversi diritti d'accessu.

Arregistramentu di Dati è Modulu Box

Siccomu Tarantool hè à tempu una basa di dati è un servitore d'applicazioni, hà diversi moduli. Semu interessate in u modulu di scatula - implementa u travagliu cù dati. Quandu scrivite qualcosa à a scatula, Tarantool scrive i dati à u discu, l'almacene in memoria, o face qualcosa d'altru cun ellu.

Arregistramentu

Per esempiu, andemu in u modulu di scatula è chjamate a funzione box.once. Questu furzà Tarantool à eseguisce u nostru codice quandu u servitore hè inizializatu. Creemu un spaziu in quale i nostri dati seranu guardati.

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

Dopu questu, creamu un indice primariu - primariu - da quale pudemu circà dati. Per automaticamente, se ùn specificate micca paràmetri, u primu campu in ogni record serà utilizatu per l'indici primariu.

Allora facemu una cuncessione à l'utilizatore invitatu, sottu à quale cunnettamu via u protocolu binariu. Permettemu di leghje, scrive è eseguisce in tutta l'istanza.

Comparatu à e basa di dati cunvinziunali, tuttu quì hè abbastanza simplice. Avemu spaziu - una zona in quale i nostri dati sò simpliciamente almacenati. Ogni registru hè chjamatu tupla. Hè imballatu in MessagePack. Questu hè un furmatu assai bellu - hè binariu è occupa menu spaziu - 18 bytes versus 27.

In Tarantool, pudete combine una basa di dati super-veloce è una applicazione per travaglià cun elli. Eccu quantu faciule hè di fà

Hè abbastanza còmuda di travaglià cun ellu. Quasi ogni linea, ogni record di dati pò avè colonne completamente diverse.

Pudemu vede tutti i spazii cù u cumandimu Box.space. Per selezziunà un esempiu specificu, scrivite box.space esempiu è uttene infurmazione cumpleta nantu à questu.

Tarantool hà dui mutori integrati: Memoria è Vinile. A memoria guarda tutti i dati in memoria. Per quessa, tuttu funziona simpliciamente è rapidamente. I dati sò scaricati à u discu, è ci hè ancu un mecanismu di scrittura in avanti, per quessa ùn perdemu nunda se u servitore falla.

Vinyl almacena dati nantu à u discu in una forma più cunnisciuta per noi - vale à dì, pudete almacenà più dati di quelli chì avemu memoria, è Tarantula leghje da u discu.

Per avà avemu aduprà a Memoria.

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>

Indice:

Un indice primariu deve esse creatu per ogni spaziu, perchè senza ellu nunda ùn funziona. Cum'è in ogni basa di dati, creamu u primu campu - record ID.

Pezzi:

Quì indichemu da quale hè u nostru indice. Hè custituitu da una parte - u primu campu chì useremu hè di tipu unsigned - un entero pusitivu. Quantu mi ricordu da a documentazione, u numeru massimu chì pò esse hè 18 quintilioni. Hè assai.

Allora pudemu inserisce dati cù u cumandamentu inseritu.

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>

U primu campu hè utilizatu cum'è a chjave primaria, cusì deve esse unicu. Ùn simu limitati da u numeru di culonni, cusì pudemu inserisce quant'è dati chì vulemu quì. Sò specificati in u formatu MessagePack, chì aghju descrittu sopra.

A pruduzzioni di dati

Allora pudemu vede i dati cù u cumandamentu di selezzione.

Box.example.select cù a chjave {1} mostrarà l'entrata desiderata. Se calemu a chjave, vedemu tutti i registri chì avemu. Tutti sò diffirenti in u numeru di culonni, ma quì, in principiu, ùn ci hè micca cuncettu di colonne - ci sò numeri di campu.

Ci pò esse assolutamente ogni quantità di dati. È per esempiu, avemu bisognu di circà per elli da u sicondu campu. Per fà questu, creamu un novu indice secundariu.


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

Avemu aduprà u cumandimu Create_index.
Chjamemu sicundariu.

Dopu questu, avete bisognu di specificà i paràmetri. U tipu d'indice hè TREE. Pò esse micca unicu, dunque entre Unique = false.

Allora indichemu da quali parti hè custituitu u nostru indice. U campu hè u numeru di u campu à quale avemu ligatu l'indici, è specificà u tipu di stringa. È cusì hè statu creatu.

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>

Avà questu hè cumu pudemu chjamà:

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

prisirvazioni

Se riavviamu l'istanza è pruvate à chjamà i dati di novu, videremu chì ùn ci hè micca - tuttu hè viotu. Stu succèri perchè Tarantool faci checkpoints è salva i dati à u discu, ma s'è no smettemu di travaglià finu à a prossima salvezza, perdemu tutte l'operazioni - perchè avemu da ricuperà da l'ultimu puntu di cuntrollu, chì era, per esempiu, duie ore fà.

Ùn funziona micca per salvà ogni siconda ancu, perchè dumping constantemente 20 GB nantu à u discu ùn hè micca una bona idea.

Per questu scopu, u cuncettu di scrive in anticipu hè statu inventatu è implementatu. Cù u so aiutu, per ogni cambiamentu in i dati, una entrata hè creata in un picculu schedariu di log di scrittura.

Ogni entrata finu à u puntu di cuntrollu hè almacenatu in elli. Per questi schedari avemu stabilitu a dimensione - per esempiu, 64 MB. Quandu hè pienu, a registrazione principia per andà in u sicondu schedariu. È dopu à u riavviu, Tarantool hè restauratu da l'ultimu puntu di cuntrollu è poi chjappà tutte e transazzione più tardi finu à chì ferma.

In Tarantool, pudete combine una basa di dati super-veloce è una applicazione per travaglià cun elli. Eccu quantu faciule hè di fà

Per fà sta registrazione, avete bisognu di specificà l'opzione in i paràmetri box.cfg (in u schedariu example.lua):

wal_mode = “write”;

usu di dati

Cù ciò chì avemu scrittu avà, pudete aduprà Tarantula per almacenà e dati è hà da travaglià assai rapidamente cum'è una basa di dati. È avà u cire nantu à a torta hè ciò chì pudete fà cù tuttu.

Scrive una applicazione

Per esempiu, scrivemu a seguente applicazione per Tarantula

Vede l'applicazione sottu u spoiler

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

Dichjaremu una tabella in lua chì definisce i caratteri. Questa piastra hè necessariu per generà una stringa aleatoria.

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

Dopu quì, dichjarà a funzione - randomString è dà u valore di lunghezza in parentesi.

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

Allora cunnettemu u router http è u servitore http à u nostru servitore Tarantula, JSON, chì manderemu à u cliente.

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

Dopu questu, cuminciamu à u portu 8080 nantu à tutte l'interfaccia di u servitore http, chì logarà tutte e dumande è l'errore.

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

In seguitu, dichjarà a ruta, perchè se una dumanda cù u metudu GET ghjunghje à u portu 8080 /count, allora chjamemu a funzione da una linea. Ritorna u statutu - 200, 404, 403 o qualsiasi altru chì avemu specificatu.

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

In u corpu vultemu json.encode, in ellu indichemu count è getcount, chì hè chjamatu è mostra u numeru di registri in a nostra basa di dati.

Second Métdum

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)

Induve in a linea router: route ({metudu = 'GET', path = '/token'}, funzione () chjamemu a funzione è generà un token.

Linea token locale = randomString (32) hè una stringa aleatoria di 32 caratteri.
In fila ultimu locale = box.space.example:len () cacciemu l'ultimu elementu.
È in a linea box.space.example: inserisci { last + 1, token } scrivimu i dati in a nostra basa di dati, vale à dì, simpricimenti aumentà l'ID da 1. Questu pò esse fattu, per via, micca solu in questu modu goffa. Ci sò sequenze per questu in Tarantula.

Scrivemu u token quì.

Cusì, avemu scrittu l'applicazione in un schedariu. Pudete manipulà direttamente i dati quì, è u modulu di scatula farà tuttu u travagliu bruttu per voi.

Ascolta http è travaglia cù dati, tuttu hè in una sola istanza - sia l'applicazione sia i dati. Dunque, tuttu succede abbastanza rapidamente.

Per inizià stallà u modulu http:

Cumu facemu questu, fighjate sottu à u spoiler

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

Avemu ancu bisognu di Prometheus per correre:

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

Lanciamu è pudemu accede à i moduli

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 ci dà u statutu 200.
/token emette un token è scrive stu token in a basa di dati.

Pruvate a velocità

Eseguimu un benchmark per 50 000 richieste. Ci saranu 500 richieste in competizione.

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

I tokens sò emessi. È avemu constantemente arregistramentu di dati. 99% di e dumande sò state trattate in 42 millisecondi. In cunsiquenza, avemu circa 3500 richieste per seconda in una piccula macchina cù 2 core è 4 gigabytes di memoria.

Pudete ancu selezziunà qualchì token 50000 è vede u so valore.

Pudete aduprà micca solu http, ma ancu eseguite funzioni di fondo chì processanu i vostri dati. In più, ci sò parechji triggers. Per esempiu, pudete chjamà funzioni nantu à l'aghjurnamenti, verificate qualcosa - cunflitti curretti.

Pudete scrive l'applicazioni di script direttamente in u servitore di basa di dati stessu, è ùn esse limitatu da nunda, cunnette qualsiasi moduli è implementà ogni logica.

U servitore di l'applicazione pò accede à i servitori esterni, ricuperà e dati è aghjunghje à a so basa di dati. I dati di sta basa di dati seranu utilizati da altre applicazioni.

Tarantula farà questu stessu, è ùn avete micca bisognu di scrive una applicazione separata.

In cunclusioni

Questu hè solu a prima parte di un grande travagliu. U sicondu serà publicatu prestu prestu nantu à u blog di u Gruppu Mail.ru, è sicuramente aghjunghje un ligame in questu materiale.

Sè site interessatu à assistisce à l'avvenimenti induve custruemu queste cose in linea è fà dumande in tempu reale, sintonizza canale DevOps da REBRAIN.

Sè avete bisognu di passà à u nuvulu o avete dumande nantu à a vostra infrastruttura, sentite liberu di lascià una dumanda.

PS Avemu 2 auditi gratuiti per mese, forsi u vostru prughjettu serà unu di elli.

Source: www.habr.com

Add a comment