Í Tarantool geturðu sameinað ofurhraðan gagnagrunn og forrit til að vinna með þau. Hér er hversu auðvelt það er að gera

Fyrir fimm árum síðan reyndi ég að vinna með Tarantool, en þá virkaði það ekki fyrir mig. En nýlega hélt ég vefnámskeið þar sem ég talaði um Hadoop og hvernig MapReduce virkar. Þar spurðu þeir mig spurningar: "Af hverju ekki að nota Tarantool fyrir þetta verkefni?"

Af forvitni ákvað ég að snúa aftur til hennar, prófa nýjustu útgáfuna - og í þetta skiptið leist mér vel á verkefnið. Nú mun ég sýna þér hvernig á að skrifa einfalt forrit í Tarantool, hlaða því og athuga frammistöðu þess og þú munt sjá hversu auðvelt og flott allt er.

Í Tarantool geturðu sameinað ofurhraðan gagnagrunn og forrit til að vinna með þau. Hér er hversu auðvelt það er að gera

Hvað er Tarantool

Tarantool staðsetur sig sem ofurhraðan gagnagrunn. Þú getur sett hvaða gögn sem þú vilt þar. Auk þess, endurtaktu þau, klipptu - það er, skiptu gríðarlegu magni af gögnum á nokkra netþjóna og sameinaðu niðurstöðurnar úr þeim - gerðu bilunarþolnar master-master tengingar.

Í öðru lagi er þetta forritaþjónn. Þú getur skrifað forritin þín á það, unnið með gögn, til dæmis, eytt gömlum gögnum í bakgrunni samkvæmt ákveðnum reglum. Þú getur skrifað Http netþjón beint í Tarantula sem mun vinna með gögn: birta magn þeirra, skrifa ný gögn þar og minnka þau öll til meistarans.

Ég las grein um hvernig krakkarnir bjuggu til skilaboða biðröð upp á 300 línur, sem er einfaldlega að springa og þjóta - þeir hafa að lágmarki 20 skilaboð á sekúndu. Hér getur þú virkilega snúið við og skrifað mjög stórt forrit og það verður ekki geymsla eins og í PostgreS.

Ég mun reyna að lýsa einhverju eins og þessum netþjóni, aðeins einfalt, í þessari grein.

Uppsetning

Fyrir prófið byrjaði ég þrjár venjulegar sýndarvélar - 20 GB harður diskur, Ubuntu 18.04. 2 sýndar örgjörvar og 4 tónleikar af minni.

Við setjum upp Tarantool - keyrum bash handritið eða bætum við geymslu og gerum það til að setja upp Tarantool. Tengill á handrit - (krulla -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Við höfum skipanir eins og:

tarantoolctl — aðalskipunin til að stjórna Tarantula-tilvikum.
/etc/tarantool - hér er öll uppsetningin.
var/log/tarantool - hér eru logarnir.
var/lib/tarantool — gögnin liggja hér, og síðan er þeim skipt í tilvik.

Það eru möppur instance-available og instance-enable - það inniheldur það sem verður opnað - tilviksstillingarskrá með lua kóða, sem lýsir á hvaða höfnum það hlustar, hvaða minni er tiltækt fyrir það, Vinyl vélarstillingar, kóða sem keyrir við ræsingu netþjóna, sundrun, biðraðir, eyðingu úreltra gagna og svo framvegis.

Tilvik virka eins og í PostgreS. Til dæmis, þú vilt keyra nokkur eintök af gagnagrunni sem hangir á mismunandi höfnum. Það kemur í ljós að nokkur gagnagrunnstilvik eru ræst á einum netþjóni, sem hanga á mismunandi höfnum. Þeir geta haft allt aðrar stillingar - eitt tilvik útfærir eina rökfræði, annað - annað.

Tilviksstjórnun

Við höfum tarantoolctl skipunina, sem gerir þér kleift að stjórna Tarantula tilvikum. Til dæmis, tarantoolctl check example mun athuga stillingarskrána og segja - skráin er í lagi ef það eru engar setningafræðivillur þar.

Þú getur séð stöðu tilviksins - tarantoolctl stöðudæmi. Á sama hátt geturðu byrjað, hætt, endurræst.

Þegar tilvik er í gangi geturðu tengst því á tvo vegu.

1. Stjórnborð

Sjálfgefið er að Tarantool opnar fals, venjulegur ASCII texti er sendur þangað til að stjórna Tarantool. Tenging við stjórnborðið á sér alltaf stað undir stjórnanda notandanum, það er engin auðkenning, svo það er engin þörf á að ytra stjórnborðshöfnina til að stjórna Tarantula.

Til að tengjast með þessari aðferð þarftu að slá inn Tarantoolctl enter instance name. Skipunin mun ræsa stjórnborðið og tengjast sem admin notandi. Afhjúpaðu aldrei stjórnborðstengið að utan - það er betra að skilja það eftir sem einingainnstungu. Þá geta aðeins þeir sem hafa aðgang að skrifa í innstunguna tengst Tarantula.

Þessi aðferð er nauðsynleg fyrir stjórnsýslu hluti. Til að vinna með gögn, notaðu seinni aðferðina - tvöfalda samskiptaregluna.

2. Notkun tvíundarsamskiptareglur til að tengjast ákveðnu tengi

Uppsetningin inniheldur hlustunartilskipun, sem opnar tengi fyrir ytri fjarskipti. Þessi höfn er notuð með tvöfaldri samskiptareglunni og auðkenning er virkjuð þar.

Fyrir þessa tengingu er tarantoolctl connect to port number notað. Með því að nota það geturðu tengst ytri netþjónum, notað auðkenningu og veitt ýmis aðgangsréttindi.

Gagnaskráning og Box Module

Þar sem Tarantool er bæði gagnagrunnur og forritaþjónn hefur hann ýmsar einingar. Við höfum áhuga á kassaeiningunni - hún útfærir að vinna með gögn. Þegar þú skrifar eitthvað í kassann skrifar Tarantool gögnin á diskinn, geymir þau í minni eða gerir eitthvað annað við þau.

Taka upp

Til dæmis förum við inn í kassaeininguna og köllum box.once aðgerðina. Þetta mun neyða Tarantool til að keyra kóðann okkar þegar þjónninn er frumstilltur. Við búum til rými þar sem gögnin okkar verða geymd.

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

Eftir þetta búum við til frumvísitölu - aðal - sem við getum leitað að gögnum eftir. Sjálfgefið, ef þú tilgreinir engar færibreytur, verður fyrsti reiturinn í hverri færslu notaður fyrir aðalvísitöluna.

Síðan veitum við gestanotandanum styrk, þar sem við tengjumst í gegnum tvöfalda siðareglur. Við leyfum lestri, ritun og framkvæmd í öllu tilvikinu.

Í samanburði við hefðbundna gagnagrunna er allt hér frekar einfalt. Við höfum pláss - svæði þar sem gögnin okkar eru einfaldlega geymd. Hver plata er kölluð tuple. Það er pakkað í MessagePack. Þetta er mjög flott snið - það er tvöfalt og tekur minna pláss - 18 bæti á móti 27.

Í Tarantool geturðu sameinað ofurhraðan gagnagrunn og forrit til að vinna með þau. Hér er hversu auðvelt það er að gera

Það er frekar þægilegt að vinna með honum. Næstum hver lína, hver gagnaskrá getur haft gjörólíka dálka.

Við getum skoðað öll rými með Box.space skipuninni. Til að velja tiltekið tilvik skaltu skrifa box.space dæmi og fá heildarupplýsingar um það.

Tarantool er með tvær innbyggðar vélar: Memory og Vinyl. Minni geymir öll gögn í minni. Þess vegna virkar allt einfaldlega og fljótt. Gögnin eru hent á diskinn og það er líka til að skrifa fyrirfram skráningarkerfi, svo við munum ekki tapa neinu ef þjónninn hrynur.

Vinyl geymir gögn á diski á því formi sem við þekkjum betur - það er, þú getur geymt fleiri gögn en við höfum minni og Tarantula mun lesa þau af disknum.

Í bili munum við nota 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>

Vísitala:

Það verður að búa til frumvísitölu fyrir hvaða rými sem er, því án hennar virkar ekkert. Eins og í hvaða gagnagrunni sem er, búum við til fyrsta reitinn - skráningarauðkenni.

Hlutar:

Hér tilgreinum við hvað vísitalan okkar samanstendur af. Það samanstendur af einum hluta - fyrsti reiturinn sem við munum nota er af gerðinni unsigned - jákvæð heil tala. Eftir því sem ég man eftir úr skjölunum er hámarksfjöldi sem getur verið 18 kvintíljónir. Það er mikið.

Þá getum við sett inn gögn með því að nota insert skipunina.

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>

Fyrsti reiturinn er notaður sem aðallykill, svo hann verður að vera einstakur. Við erum ekki takmörkuð af fjölda dálka, þannig að við getum sett inn eins mikið af gögnum og við viljum þar. Þau eru tilgreind í MessagePack sniðinu, sem ég lýsti hér að ofan.

Gagnaúttak

Þá getum við birt gögnin með því að nota veldu skipunina.

Box.example.select með {1} takkanum mun birta viðkomandi færslu. Ef við lækkum takkann munum við sjá allar skrárnar sem við höfum. Þeir eru allir mismunandi hvað varðar fjölda dálka, en hér er í grundvallaratriðum ekkert hugtak um dálka - það eru svæðisnúmer.

Það getur verið nákvæmlega hvaða magn af gögnum sem er. Og til dæmis þurfum við að leita að þeim eftir öðrum reit. Til að gera þetta búum við til nýja aukavísitölu.


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

Við notum Create_index skipunina.
Við skulum kalla það Secondary.

Eftir þetta þarftu að tilgreina breytur. Vísitölutegund er TREE. Það er kannski ekki einstakt, svo sláðu inn Unique = false.

Síðan tilgreinum við hvaða hlutum vísitalan okkar samanstendur af. Reitur er númer reitsins sem við bindum vísitöluna við og tilgreinum strengjagerðina. Og þannig varð það til.

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>

Svona getum við kallað það:

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

Sparar

Ef við endurræsum tilvikið og reynum að hringja í gögnin aftur, sjáum við að þau eru ekki til staðar - allt er tómt. Þetta gerist vegna þess að Tarantool gerir eftirlitsstöðvar og vistar gögnin á disk, en ef við hættum að vinna þangað til næst að vista þá missum við allar aðgerðir - því við munum jafna okkur eftir síðasta eftirlitsstöð, sem var til dæmis fyrir tveimur tímum síðan.

Það mun ekki virka að spara hverja sekúndu heldur, vegna þess að stöðugt að henda 20 GB á diskinn er ekki góð hugmynd.

Í þessu skyni var hugmyndin um framskráningarskrá fundið upp og útfærð. Með hjálp þess, fyrir hverja breytingu á gögnunum, er færsla búin til í lítilli framskráningarskrá.

Hver færsla upp að eftirlitsstöðinni er geymd í þeim. Fyrir þessar skrár stillum við stærðina - til dæmis 64 MB. Þegar það er fullt byrjar upptakan að fara í seinni skrána. Og eftir endurræsingu er Tarantool endurheimt frá síðasta eftirlitsstað og veltir síðan öllum síðari færslum þar til það hættir.

Í Tarantool geturðu sameinað ofurhraðan gagnagrunn og forrit til að vinna með þau. Hér er hversu auðvelt það er að gera

Til að framkvæma slíka upptöku þarftu að tilgreina valkostinn í box.cfg stillingunum (í example.lua skránni):

wal_mode = “write”;

gagnanotkun

Með því sem við höfum skrifað núna geturðu notað Tarantula til að geyma gögn og það mun virka mjög hratt sem gagnagrunnur. Og nú er rúsínan í pylsuendanum hvað þú getur gert við þetta allt.

Að skrifa umsókn

Til dæmis skulum við skrifa eftirfarandi umsókn fyrir Tarantula

Sjá umsókn undir spoilernum

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

Við lýsum yfir einhverri töflu í lua sem skilgreinir persónurnar. Þessi plata er nauðsynleg til að búa til handahófskennda streng.

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

Eftir það lýsum við yfir fallið - randomString og gefum lengdargildið innan sviga.

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

Síðan tengjum við http router og http server við Tarantula serverinn okkar, JSON, sem við sendum til viðskiptavinarins.

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

Eftir þetta byrjum við á port 8080 á öllum http miðlaraviðmótum, sem skráir allar beiðnir og villur.

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

Næst lýsum við yfir leið, þannig að ef beiðni með GET aðferðinni berst á port 8080 /count, þá köllum við fallið úr einni línu. Það skilar stöðunni - 200, 404, 403 eða einhverju öðru sem við tilgreinum.

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

Í meginmálinu skilum við json.encode, í honum tilgreinum við count og getcount, sem er kallað og sýnir fjölda færslur í gagnagrunninum okkar.

Önnur aðferðin

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)

Hvar í röðinni leið: leið({aðferð = 'GET', slóð = '/tákn'}, fall() við köllum fallið og myndum tákn.

Lína staðbundið tákn = randomString(32) er handahófskenndur strengur með 32 stöfum.
Í línu local last = box.space.example:len() við tökum út síðasta þáttinn.
Og í röðinni box.space.example:insert{ last + 1, token } við skrifum gögnin inn í gagnagrunninn okkar, það er að segja að við hækkum auðkennið einfaldlega um 1. Þetta er að vísu hægt að gera, ekki bara á þennan klaufalega hátt. Það eru raðir fyrir þetta í Tarantula.

Við skrifum táknið þar.

Þannig skrifuðum við umsóknina í eina skrá. Þú getur beint meðhöndlað gögnin þar og kassaeiningin mun gera allt óhreint fyrir þig.

Það hlustar á http og vinnur með gögn, allt er í einu tilviki - bæði forritið og gögnin. Þess vegna gerist allt frekar fljótt.

Til að byrja setjum við upp http einingu:

Hvernig við gerum þetta, skoðaðu undir spoilernum

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

Við þurfum líka Prometheus til að keyra:

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

Við ræsum og getum nálgast einingarnar

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 gefur okkur stöðuna 200.
/token gefur út tákn og skrifar þetta tákn í gagnagrunninn.

Er að prófa hraðann

Við skulum keyra viðmið fyrir 50 beiðnir. Það verða 000 keppendur.

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

Tákn eru gefin út. Og við erum stöðugt að skrá gögn. 99% beiðna voru afgreidd á 42 millisekúndum. Samkvæmt því höfum við um 3500 beiðnir á sekúndu á lítilli vél með 2 kjarna og 4 gígabæta af minni.

Þú getur líka valið um 50000 tákn og séð gildi þess.

Þú getur ekki aðeins notað http, heldur einnig keyrt bakgrunnsaðgerðir sem vinna úr gögnunum þínum. Auk þess eru ýmsar kveikjur. Til dæmis er hægt að kalla aðgerðir á uppfærslum, athuga eitthvað - leiðrétta árekstra.

Þú getur skrifað handritaforrit beint á gagnagrunnsþjóninn sjálfan og ekki takmarkað neitt, tengt hvaða einingar sem er og innleitt hvaða rökfræði sem er.

Forritaþjónninn getur fengið aðgang að ytri netþjónum, sótt gögn og bætt þeim við gagnagrunn sinn. Gögn úr þessum gagnagrunni verða notuð af öðrum forritum.

Tarantula mun gera þetta sjálf og þú þarft ekki að skrifa sérstaka umsókn.

Að lokum

Þetta er aðeins fyrsti hluti af stóru verki. Sá síðari verður birtur mjög fljótlega á Mail.ru Group blogginu og við munum örugglega bæta við hlekk á það í þessu efni.

Ef þú hefur áhuga á að mæta á viðburði þar sem við smíðum þessa hluti á netinu og spyrja spurninga í rauntíma, taktu þá DevOps eftir REBRAIN rás.

Ef þú þarft að fara í skýið eða hefur spurningar um innviði þína, Ekki hika við að senda inn beiðni.

PS Við erum með 2 ókeypis úttektir á mánuði, ef til vill verður verkefnið þitt eitt af þeim.

Heimild: www.habr.com

Bæta við athugasemd