Am Tarantool kënnt Dir eng super-schnell Datebank an eng Applikatioun kombinéieren fir mat hinnen ze schaffen. Hei ass wéi einfach et ass ze maachen

Viru fënnef Joer hunn ech probéiert mat Tarantool ze schaffen, awer dunn huet et net fir mech geschafft. Awer viru kuerzem hunn ech e Webinar ofgehalen wou ech iwwer Hadoop geschwat hunn a wéi MapReduce funktionnéiert. Do hunn se mech eng Fro gestallt: "Firwat benotzt Tarantool net fir dës Aufgab?"

Aus Virwëtz hunn ech beschloss drop zréckzekommen, déi lescht Versioun ze testen - an dës Kéier hunn ech de Projet wierklech gär. Elo weisen ech Iech wéi Dir eng einfach Applikatioun an Tarantool schreift, lued se a kontrolléiert seng Leeschtung, an Dir wäert gesinn wéi einfach a cool alles ass.

Am Tarantool kënnt Dir eng super-schnell Datebank an eng Applikatioun kombinéieren fir mat hinnen ze schaffen. Hei ass wéi einfach et ass ze maachen

Wat ass Tarantool

Tarantool positionéiert sech als eng ultra-schnell Datebank. Dir kënnt all Donnéeën déi Dir wëllt do setzen. Plus, replizéiert se, shard - dat ass, eng rieseg Quantitéit un Daten iwwer verschidde Serveren opzedeelen an d'Resultater vun hinnen kombinéieren - maacht Feeler-tolerant Master-Master Verbindungen.

Zweetens ass dëst en Applikatiounsserver. Dir kënnt Är Uwendungen drop schreiwen, mat Daten schaffen, zum Beispill alen Opzeechnungen am Hannergrond no bestëmmte Regelen läschen. Dir kënnt en Http-Server direkt an Tarantula schreiwen, deen mat Daten funktionnéiert: gitt hir Quantitéit, schreift nei Donnéeën do a reduzéiert alles op de Meeschter.

Ech liesen en Artikel iwwer wéi d'Kärelen eng Messageschlaang vun 300 Zeilen gemaach hunn, déi einfach platzt a rennt - si hunn e Minimum Leeschtung vun 20 Messagen pro Sekonn. Hei kënnt Dir wierklech ëmdréinen an eng ganz grouss Applikatioun schreiwen, an et wäert keng Späichere sinn, wéi an PostgreS.

Ech probéieren eppes wéi dësen Server ze beschreiwen, nëmmen einfach, an dësem Artikel.

Kader

Fir den Test hunn ech dräi Standard virtuelle Maschinnen ugefaang - eng 20 GB Festplack, Ubuntu 18.04. 2 virtuell CPUs a 4 Optrëtter vun Erënnerung.

Mir installéieren Tarantool - lafen de Bash Skript oder füügt e Repository un a gitt apt Tarantool installéieren. Link zum Skript - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Mir hunn Kommandoen wéi:

tarantoolctl - den Haaptbefehl fir Tarantula-Instanzen ze managen.
/etc/tarantool - hei ass déi ganz Konfiguratioun.
var/log/tarantool - hei sinn d'Logbicher.
var/lib/tarantool - d'Date leien hei, an da ginn se an Instanzen opgedeelt.

Et gi Classeure Instanz-verfügbar an Instanz-enable - et enthält wat lancéiert gëtt - eng Instanz Konfiguratiounsdatei mat lua Code, déi beschreift op wéi eng Ports et lauschtert, wéi eng Erënnerung et verfügbar ass, Vinylmotorastellungen, Code deen beim Startup leeft Serveren, Sharding, Schlaangen, Läschen vun verouderte Donnéeën, asw.

Instanzen funktionnéieren wéi an PostgreS. Zum Beispill wëllt Dir e puer Exemplare vun enger Datebank lafen déi op verschiddene Ports hänkt. Et stellt sech eraus datt verschidde Datebankinstanzen op engem Server gestart ginn, déi op verschiddene Ports hänken. Si kënne ganz aner Astellungen hunn - eng Instanz implementéiert eng Logik, déi zweet - eng aner.

Instanz Gestioun

Mir hunn de Kommando tarantoolctl, wat Iech erlaabt Tarantula Instanzen ze managen. Zum Beispill, tarantoolctl Check Beispill wäert d'Konfiguratiounsdatei iwwerpréiwen a soen - d'Datei ass ok wann et keng Syntaxfehler do sinn.

Dir kënnt de Status vun der Instanz gesinn - tarantoolctl Status Beispill. Am selwechte Wee kënnt Dir ufänken, stoppen, nei starten.

Soubal d'Instanz leeft, kënnt Dir op zwou Weeër matenee verbannen.

1. Administrativ Konsol

Par défaut mécht Tarantool e Socket op, normalen ASCII Text gëtt do geschéckt fir Tarantool ze kontrolléieren. D'Verbindung mat der Konsole geschitt ëmmer ënner dem Administrateur Benotzer, et gëtt keng Authentifikatioun, sou datt et net néideg ass de Konsolport ze externen fir Tarantula ze managen.

Fir mat dëser Method ze verbannen, musst Dir Tarantoolctl gitt Instanznumm aginn. De Kommando lancéiert d'Konsole a verbënnt als Admin Benotzer. Ni de Konsol Hafen no baussen aussetzt - et ass besser et als Eenheet Socket ze verloossen. Da kënnen nëmmen déi, déi Zougang zu der Socket schreiwen hunn, mat Tarantula konnektéieren.

Dës Method ass néideg fir administrativ Saachen. Fir mat Daten ze schaffen, benotzt déi zweet Method - de binäre Protokoll.

2. Mat engem binäre Protokoll fir mat engem spezifeschen Hafen ze verbannen

D'Konfiguratioun enthält eng lauschteren Direktiv, déi en Hafen fir extern Kommunikatioun opmaacht. Dëse Port gëtt mam binäre Protokoll benotzt an d'Authentifikatioun ass do aktivéiert.

Fir dës Verbindung gëtt tarantoolctl connect to port number benotzt. Mat der Hëllef kënnt Dir mat Remote Serveren verbannen, Authentifikatioun benotzen a verschidde Zougangsrechter ginn.

Donnéeën Recording an Box Modul

Zënter Tarantool ass souwuel eng Datebank wéi en Applikatiounsserver, huet et verschidde Moduler. Mir sinn interesséiert am Këscht Modul - et implementéiert Aarbecht mat Daten. Wann Dir eppes an d'Këscht schreift, schreift Tarantool d'Donnéeën op d'Disk, späichert se an d'Erënnerung oder mécht soss eppes mat.

Opnahm

Zum Beispill gi mir an de Këschtmodul a ruffen d'Box.once Funktioun. Dëst wäert Tarantool zwéngen eise Code ze lafen wann de Server initialiséiert gëtt. Mir kreéieren e Raum an deem eis Daten gespäichert ginn.

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

Duerno kreéiere mir e primären Index - primär - duerch dee mir no Daten sichen. Par défaut, wann Dir keng Parameter spezifizéiert, gëtt dat éischt Feld an all Rekord fir de primäre Index benotzt.

Da maache mir e Subventioun un de Gaascht Benotzer, ënner deem mir iwwer de binäre Protokoll verbannen. Mir erlaben Liesen, Schreiwen an Ausféierung iwwer déi ganz Instanz.

Am Verglach mat konventionellen Datenbanken ass alles hei ganz einfach. Mir hunn Plaz - e Gebitt an deem eis Daten einfach gespäichert sinn. All Rekord gëtt en Tupel genannt. Et ass a MessagePack verpackt. Dëst ass e ganz coolt Format - et ass binär an hëlt manner Plaz op - 18 Bytes versus 27.

Am Tarantool kënnt Dir eng super-schnell Datebank an eng Applikatioun kombinéieren fir mat hinnen ze schaffen. Hei ass wéi einfach et ass ze maachen

Et ass ganz bequem mat him ze schaffen. Bal all Zeil, all Daterekord kann komplett verschidde Kolonnen hunn.

Mir kënnen all Plazen de Kommando Box.space benotzt. Fir eng spezifesch Instanz auswielen, schreift box.space Beispill a kritt komplett Informatiounen doriwwer.

Tarantool huet zwee agebaute Motoren: Memory a Vinyl. Memory späichert all Daten an der Erënnerung. Dofir funktionnéiert alles einfach a séier. D'Daten ginn op Scheif gedumpt, an et gëtt och e Schreiwe-Protokoll-Mechanismus, sou datt mir näischt verléieren wann de Server crasht.

Vinyl späichert Daten op Disk an enger Form déi eis méi vertraut ass - dat ass, Dir kënnt méi Daten späicheren wéi mir Erënnerung hunn, an d'Tarantula liest se vun der Disk.

Fir de Moment wäerte mir Memory benotzen.

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:

E primären Index muss fir all Raum erstallt ginn, well ouni et funktionnéiert näischt. Wéi an all Datebank erstellen mir dat éischt Feld - Rekord ID.

Deeler:

Hei weise mer aus wat eisen Index besteet. Et besteet aus engem Deel - dat éischt Feld dat mir benotzen ass vum Typ net ënnerschriwwen - e positivt Ganzt. Sou wäit wéi ech mech aus der Dokumentatioun erënneren, ass déi maximal Zuel déi ka sinn 18 Quintilliounen. Dat ass vill.

Da kënne mir Daten mat dem Insert Kommando aginn.

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>

Dat éischt Feld gëtt als primäre Schlëssel benotzt, also muss et eenzegaarteg sinn. Mir sinn net limitéiert duerch d'Zuel vun de Sailen, also kënne mir esou vill Daten aginn wéi mir wëllen do. Si ginn am MessagePack Format spezifizéiert, wat ech uewen beschriwwen hunn.

Datenausgang

Da kënne mir d'Donnéeën mat dem wielt Kommando weisen.

Box.example.select mam {1} Schlëssel weist de gewënschte Entrée. Wa mir de Schlëssel erofsetzen, gesi mir all Rekorder déi mir hunn. Si ënnerscheeden sech all an der Zuel vun de Sailen, awer hei, am Prinzip, gëtt et kee Konzept vu Spalten - et gi Feldnummeren.

Et kann absolut all Betrag vun Daten ginn. An zum Beispill musse mir se duerch dat zweet Feld sichen. Fir dëst ze maachen, kreéiere mir en neie Secondaire Index.


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

Mir benotzen de Create_index Kommando.
Loosst eis et Secondaire nennen.

Duerno musst Dir d'Parameteren uginn. Index Typ ass TREE. Et ass vläicht net eenzegaarteg, also gitt Unique = falsch.

Da weise mir aus wat fir Deeler eisen Index besteet. Feld ass d'Zuel vum Feld un deem mir den Index binden, a spezifizéieren d'Stringtyp. An esou gouf et geschaf.

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>

Elo ass wéi mir et kënnen nennen:

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

Erhaalung

Wa mir d'Instanz nei starten a probéieren d'Donnéeën erëm ze ruffen, wäerte mir gesinn datt et net do ass - alles ass eidel. Dëst geschitt well Tarantool Checkpoints mécht an d'Donnéeën op Scheif späichert, awer wa mir ophalen bis déi nächst Späichere schaffen, verléiere mir all Operatiounen - well mir vum leschte Checkpoint recuperéieren, wat zum Beispill virun zwou Stonnen war.

Et funktionnéiert och net all Sekonn ze spueren, well dauernd 20 GB op Disk dumpen ass keng gutt Iddi.

Fir dësen Zweck gouf d'Konzept vum Write-Ahead Log erfonnt an ëmgesat. Mat senger Hëllef, fir all Ännerung vun den Donnéeën, gëtt eng Entrée an enger klenger Write-Ahead Log Datei erstallt.

All Entrée bis zum Checkpoint gëtt an hinnen gespäichert. Fir dës Dateie setzen mir d'Gréisst - zum Beispill 64 MB. Wann et voll ass, fänkt den Opnahmen un déi zweet Datei ze goen. An nom Restart gëtt Tarantool vum leschte Kontrollpunkt restauréiert a rullt dann iwwer all spéider Transaktiounen bis et ophält.

Am Tarantool kënnt Dir eng super-schnell Datebank an eng Applikatioun kombinéieren fir mat hinnen ze schaffen. Hei ass wéi einfach et ass ze maachen

Fir esou Opnam auszeféieren, musst Dir d'Optioun an der box.cfg Astellunge spezifizéieren (an der example.lua Datei):

wal_mode = “write”;

Datenverbrauch

Mat deem wat mir elo geschriwwen hunn, kënnt Dir Tarantula benotze fir Daten ze späicheren an et funktionnéiert ganz séier als Datebank. An elo ass de Glace op de Kuch wat Dir mat alles maache kënnt.

Mir schreiwen eng Demande

Zum Beispill, loosst eis déi folgend Applikatioun fir Tarantula schreiwen

Kuckt d'Applikatioun ënner dem 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()

Mir deklaréieren e puer Dësch am lua datt d'Charaktere definéiert. Dës Plack ass néideg fir eng zoufälleg String ze generéieren.

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

Duerno erkläre mir d'Funktioun - randomString a ginn de Längtwäert an Klammern.

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

Da verbannen mir den http Router an den http Server mat eisem Tarantula Server, JSON, dee mir un de Client schécken.

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

Duerno fänken mir um Hafen 8080 op all http Server Interfaces un, déi all Ufroen a Feeler aloggen.

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

Als nächst erkläre mir Route, sou datt wann eng Ufro mat der GET-Methode um Hafen 8080 /count kënnt, da ruffe mir d'Funktioun vun enger Linn un. Et gëtt de Status zréck - 200, 404, 403 oder all aner déi mir spezifizéieren.

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

Am Kierper gi mir json.encode zréck, an et uginn zielen an getcount, déi genannt gëtt a weist d'Zuel vun records an eiser Datebank.

Déi zweet Method

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)

Wou an der Linn router:route({method = 'GET', path = '/token'}, Funktioun() mir ruffen d'Funktioun an generéieren en Token.

Linn lokal Token = randomString(32) ass eng zoufälleg String vun 32 Zeechen.
An der Schlaang local last = box.space.example:len() mir huelen dat lescht Element eraus.
An an der Linn box.space.example:insert{ last + 1, token } mir schreiwen d'Donnéeën an eis Datebank, dat heescht, mir erhéijen d'ID einfach ëm 1. Dat kann een iwwregens net nëmmen op dës knaschteg Manéier maachen. Et gi Sequenzen fir dëst an Tarantula.

Mir schreiwen den Token do.

Sou hu mir d'Applikatioun an engem Dossier geschriwwen. Dir kënnt d'Donnéeën direkt manipuléieren, an de Këschtmodul wäert all d'dreckeg Aarbecht fir Iech maachen.

Et lauschtert op http a schafft mat Daten, alles ass an enger eenzeger Instanz - souwuel d'Applikatioun an d'Daten. Dofir geschitt alles zimlech séier.

Fir unzefänken installéiere mir den http Modul:

Wéi mir dat maachen, kuckt ënnert dem 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:/#

Mir brauchen och Prometheus fir ze lafen:

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

Mir starten a kënnen op d'Moduler kommen

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 gëtt eis de Status 200.
/Token gëtt en Token eraus a schreift dësen Token an d'Datebank.

D'Vitesse testen

Loosst eis e Benchmark fir 50 Ufroe lafen. Et ginn 000 Konkurrenzfuerderunge.

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

Tokens ginn ausgestallt. A mir registréieren dauernd Daten. 99% vun Ufroe goufen an 42 Millisekonnen veraarbecht. Deementspriechend hu mir ongeféier 3500 Ufroen pro Sekonn op enger klenger Maschinn mat 2 Kären a 4 Gigabytes Erënnerung.

Dir kënnt och e puer 50000 Token auswielen a säi Wäert gesinn.

Dir kënnt net nëmmen http benotzen, awer och Hannergrondfunktiounen lafen déi Är Donnéeën veraarbecht. Plus et gi verschidde Ausléiser. Zum Beispill, kënnt Dir Funktiounen op Aktualiséierungen Opruff, eppes kontrolléieren - Korrekt Konflikter.

Dir kënnt Skriptapplikatiounen direkt am Datebankserver selwer schreiwen, an net vun eppes limitéiert sinn, all Moduler verbannen an all Logik ëmsetzen.

Den Applikatiounsserver kann externe Serveren zougräifen, Daten recuperéieren an op seng Datebank addéieren. Daten aus dëser Datebank gi vun aneren Uwendungen benotzt.

Tarantula wäert dëst selwer maachen, an Dir musst net eng separat Applikatioun schreiwen.

Conclusioun

Dëst ass nëmmen den éischten Deel vun enger grousser Aarbecht. Déi zweet wäert ganz geschwënn op der Mail.ru Group Blog publizéiert ginn, a mir wäerten definitiv e Link op et an dësem Material Foto.

Wann Dir interesséiert sidd un Eventer deelzehuelen wou mir dës Saachen online bauen a Froen an Echtzäit stellen, da mellt Iech un Kanal DevOps vum REBRAIN.

Wann Dir an d'Wollek muss plënneren oder Froen iwwer Är Infrastruktur hutt, fillen gratis eng Demande ze verloossen.

PS Mir hunn 2 gratis Auditen pro Mount, vläicht ass Äre Projet ee vun hinnen.

Source: will.com

Setzt e Commentaire