Katika Tarantool, unaweza kuchanganya hifadhidata ya haraka sana na programu ya kufanya kazi nayo. Hivi ndivyo ilivyo rahisi kufanya

Miaka mitano iliyopita nilijaribu kufanya kazi na Tarantool, lakini haikufanya kazi kwangu. Lakini hivi majuzi nilishikilia wavuti ambapo nilizungumza juu ya Hadoop, kuhusu jinsi MapReduce inavyofanya kazi. Huko niliulizwa swali - "Kwa nini usitumie Tarantool kwa kazi hii?".

Kwa ajili ya udadisi, niliamua kurudi kwake, jaribu toleo la hivi karibuni - na wakati huu nilipenda sana mradi huo. Sasa nitaonyesha jinsi ya kuandika maombi rahisi katika Tarantool, kuipakia na kuangalia utendaji, na utaona jinsi kila kitu ni rahisi na baridi.

Katika Tarantool, unaweza kuchanganya hifadhidata ya haraka sana na programu ya kufanya kazi nayo. Hivi ndivyo ilivyo rahisi kufanya

Tarantool ni nini

Tarantool inajiweka kama hifadhidata ya haraka sana. Unaweza kuweka data yoyote unayotaka hapo. Zaidi ya hayo, zirudishe, shard - yaani, gawanya kiasi kikubwa cha data kwenye seva kadhaa na kuchanganya matokeo kutoka kwao - tengeneza viungo vya bwana-bwana vinavyostahimili makosa.

Pili, ni seva ya programu. Unaweza kuandika programu zako juu yake, fanya kazi na data, kwa mfano, futa maingizo ya zamani nyuma kulingana na sheria fulani. Unaweza kuandika seva ya Http moja kwa moja kwenye Tarantula ambayo itafanya kazi na data: toa nambari yao, andika data mpya hapo na upunguze yote kwa bwana.

Nilisoma makala kuhusu jinsi wavulana walivyofanya foleni ya ujumbe wa mstari 300, ambayo ni machozi na kupiga tu - wana utendaji wa chini wa ujumbe 20 kwa sekunde. Hapa unaweza kweli kugeuka na kuandika programu kubwa sana, na hizi hazitahifadhiwa, kama katika PostgreS.

Takriban seva kama hiyo, rahisi tu, nitajaribu kuelezea katika nakala hii.

Ufungaji

Kwa jaribio, nilianza mashine tatu za kawaida za kawaida - gari ngumu ya gigabyte 20, Ubuntu 18.04. CPU 2 pepe na gigabaiti 4 za kumbukumbu.

Tunasanikisha Tarantool - endesha hati ya bash au ongeza hazina na upate kusakinisha Tarantool. Unganisha kwa hati - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Tunayo amri kama vile:

tarantoolctl ndio amri kuu ya kudhibiti matukio ya Tarantula.
/etc/tarantool - hapa kuna usanidi mzima.
var/log/tarantool - hapa ni kumbukumbu.
var/lib/tarantool - hapa kuna data, na kisha imegawanywa katika matukio.

Kuna folda zinazopatikana kwa mfano na kuwezesha mfano - ina kile kitakachozinduliwa - faili ya usanidi ya mfano na nambari ya lua, ambayo inaelezea ni bandari gani inasikiza, ni kumbukumbu gani inayopatikana kwake, mipangilio ya injini ya Vinyl, nambari inayofanya kazi wakati wa kuanza. seva, sharding, foleni, kufuta data ya kizamani, na kadhalika.

Matukio hufanya kazi kama katika PostgreS. Kwa mfano, unataka kuendesha nakala nyingi za hifadhidata ambayo hutegemea bandari tofauti. Inatokea kwamba matukio kadhaa ya database yanazinduliwa kwenye seva moja, ambayo hutegemea bandari tofauti. Wanaweza kuwa na mipangilio tofauti kabisa - mfano mmoja hutumia mantiki moja, ya pili - nyingine.

Usimamizi wa Matukio

Tunayo amri ya tarantoolctl ambayo huturuhusu kudhibiti matukio ya Tarantula. Kwa mfano, mfano wa ukaguzi wa tarantoolctl utakagua faili ya usanidi na kusema faili ni sawa ikiwa hakuna makosa ya kisintaksia.

Unaweza kuona hali ya mfano - mfano wa hali ya tarantoolctl. Kwa njia hiyo hiyo, unaweza kufanya kuanza, kuacha, kuanzisha upya.

Mara tu mfano unapoendesha, kuna njia mbili za kuunganishwa nayo.

1. Console ya utawala

Kwa chaguo-msingi, Tarantool hufungua tundu na kutuma maandishi wazi ya ASCII ili kudhibiti Tarantula. Uunganisho kwenye console daima hutokea chini ya mtumiaji wa msimamizi, hakuna uthibitishaji, kwa hivyo huna haja ya kuchukua bandari ya console ili kudhibiti Tarantula nje.

Ili kuunganisha kwa njia hii, unahitaji kuingiza jina la mfano la Tarantoolctl. Amri itazindua koni na kuunganishwa kama mtumiaji wa msimamizi. Kamwe usifichue bandari ya koni kwa nje - ni bora kuiacha kama tundu la kitengo. Kisha wale tu ambao wana upatikanaji wa kuandika kwenye tundu wataweza kuunganisha kwenye Tarantula.

Njia hii inahitajika kwa mambo ya utawala. Kufanya kazi na data, tumia njia ya pili - itifaki ya binary.

2. Kutumia itifaki ya binary kuunganisha kwenye mlango maalum

Kuna maagizo ya kusikiliza katika usanidi, ambayo hufungua bandari kwa mawasiliano ya nje. Mlango huu unatumiwa na itifaki ya binary na uthibitishaji umewezeshwa hapo.

Kwa uunganisho huu, tarantoolctl kuunganisha kwa nambari ya bandari hutumiwa. Kwa kuitumia, unaweza kuunganisha kwenye seva za mbali, kutumia uthibitishaji na kutoa haki mbalimbali za kufikia.

Kurekodi Data na Kisanduku Moduli

Kwa kuwa Tarantool ni hifadhidata na seva ya programu, ina moduli anuwai. Tunavutiwa na moduli ya kisanduku - inatekeleza kazi na data. Unapoandika kitu kwenye sanduku, Tarantool huandika data kwenye diski, huihifadhi kwenye kumbukumbu, au hufanya kitu kingine nayo.

Rekodi

Kwa mfano, tunaingia kwenye moduli ya sanduku na kuwaita kazi ya box.once. Italazimisha Tarantool kuendesha msimbo wetu wakati seva imeanzishwa. Tunaunda nafasi ambapo data yetu itahifadhiwa.

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

Baada ya hayo, tunaunda index ya msingi - msingi - ambayo tunaweza kutafuta data. Kwa chaguo-msingi, ikiwa hakuna vigezo vilivyoainishwa, sehemu ya kwanza katika kila ingizo la kielezo cha kwanza itatumika.

Kisha tunatoa ruzuku kwa mtumiaji wa mgeni, ambayo tunaunganisha kupitia itifaki ya binary. Tunaruhusu kusoma, kuandika na kutekeleza katika mfano mzima.

Ikilinganishwa na hifadhidata za kawaida, kila kitu ni rahisi sana hapa. Tuna nafasi - eneo ambalo data yetu imehifadhiwa tu. Kila kiingilio kinaitwa tuple. Imewekwa kwenye MessagePack. Huu ni umbizo baridi sana - ni la binary na huchukua nafasi kidogo - baiti 18 dhidi ya 27.

Katika Tarantool, unaweza kuchanganya hifadhidata ya haraka sana na programu ya kufanya kazi nayo. Hivi ndivyo ilivyo rahisi kufanya

Ni rahisi sana kufanya kazi naye. Karibu kila mstari, kila ingizo la data linaweza kuwa na safu wima tofauti kabisa.

Tunaweza kutazama nafasi zote kwa kutumia amri ya Box.space. Ili kuchagua mfano maalum, tunaandika mfano wa box.space na kupata taarifa kamili juu yake.

Kuna aina mbili za injini zilizojengwa kwenye Tarantool: Kumbukumbu na Vinyl. Kumbukumbu huhifadhi data zote kwenye kumbukumbu. Kwa hivyo, kila kitu hufanya kazi kwa urahisi na haraka. Data hutupwa kwenye diski, na pia kuna utaratibu wa kumbukumbu ya kuandika mbele, kwa hivyo hatutapoteza chochote ikiwa seva itaacha kufanya kazi.

Vinyl huhifadhi data kwenye diski kwa fomu inayojulikana zaidi - yaani, unaweza kuhifadhi data zaidi kuliko tunayo kumbukumbu, na Tarantula itaisoma kutoka kwenye diski.

Sasa tutatumia Kumbukumbu.

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>

Kielelezo:

Fahirisi ya msingi lazima iundwe kwa nafasi yoyote, kwa sababu hakuna kitu kitafanya kazi bila hiyo. Kama katika hifadhidata yoyote, tunaunda uwanja wa kwanza - kitambulisho cha rekodi.

Parts:

Hapa ndipo tunapobainisha faharasa yetu inajumuisha nini. Inajumuisha sehemu moja - sehemu ya kwanza ambayo tutatumia, chapa bila kusainiwa - nambari kamili. Kwa kadiri ninavyokumbuka kutoka kwa nyaraka, idadi ya juu inayoweza kuwa ni quintillion 18. mengi ya kutisha.

Kisha tunaweza kuingiza data kwa kutumia amri ya kuingiza.

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>

Sehemu ya kwanza inatumika kama ufunguo msingi, kwa hivyo lazima iwe ya kipekee. Hatuzuiliwi na idadi ya safu wima, kwa hivyo tunaweza kuingiza data nyingi tunavyopenda hapo. Zimebainishwa katika umbizo la MessagePack, ambalo nililielezea hapo juu.

Pato la data

Kisha tunaweza kuonyesha data na amri ya kuchagua.

Box.example.select kwa ufunguo {1} itaonyesha ingizo unalotaka. Ikiwa tutaacha ufunguo, tutaona rekodi zote tulizo nazo. Wote ni tofauti kwa idadi ya nguzo, lakini hapa, kwa kanuni, hakuna dhana ya nguzo - kuna nambari za shamba.

Kunaweza kuwa na data nyingi kama unavyopenda. Na kwa mfano, tunahitaji kuwatafuta kwenye uwanja wa pili. Ili kufanya hivyo, tunafanya index mpya ya sekondari.


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

Tunatumia amri ya Create_index.
Tunaita Sekondari.

Baada ya hayo, unahitaji kutaja vigezo. Aina ya faharasa ni TREE. Huenda isiwe ya kipekee, kwa hivyo tunaingia Unique = uongo.

Kisha tunaonyesha ni sehemu gani index yetu ina. Shamba ni nambari ya shamba ambalo tunafunga index, na inabainisha aina ya kamba. Na hivyo iliundwa.

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>

Sasa hivi ndivyo tunavyoweza kuiita:

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

Uhifadhi

Ikiwa tutaanza tena mfano na kujaribu kupiga data tena, tutaona kwamba hawapo - kila kitu ni tupu. Hii hutokea kwa sababu Tarantool hufanya vituo vya ukaguzi na kuhifadhi data kwenye diski, lakini ikiwa tunaacha kufanya kazi kabla ya kuokoa ijayo, tutapoteza shughuli zote - kwa sababu tutapona kutoka kwa ukaguzi wa mwisho, ambao ulikuwa, kwa mfano, saa mbili zilizopita.

Kuokoa kila sekunde pia haitafanya kazi - kwa sababu mara kwa mara kutupa GB 20 kwa diski ni wazo la hivyo.

Kwa hili, dhana ya logi ya kuandika-mbele ilivumbuliwa na kutekelezwa. Kwa msaada wake, kwa kila mabadiliko katika data, rekodi huundwa katika faili ndogo ya logi ya kuandika-mbele.

Kila kiingilio hadi kituo cha ukaguzi kinahifadhiwa ndani yao. Kwa faili hizi, tunaweka ukubwa - kwa mfano, 64 mb. Inapojaza, kurekodi huanza kwenda kwenye faili ya pili. Na baada ya kuwasha upya, Tarantool hupata nafuu kutoka kwa kituo cha ukaguzi cha mwisho na kisha kusogeza juu ya shughuli zote za baadaye hadi ikome.

Katika Tarantool, unaweza kuchanganya hifadhidata ya haraka sana na programu ya kufanya kazi nayo. Hivi ndivyo ilivyo rahisi kufanya

Ili kutekeleza rekodi kama hiyo, unahitaji kutaja chaguo katika mipangilio ya box.cfg (katika faili ya example.lua):

wal_mode = “write”;

matumizi ya data

Kwa kile tulichoandika sasa, unaweza kutumia Tarantula kuhifadhi data na itafanya kazi haraka sana kama hifadhidata. Na sasa cherry kwenye keki - unaweza kufanya nini na yote.

Kuandika maombi

Kwa mfano, wacha tuandike maombi kama haya kwa Tarantula

Tazama programu chini ya 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()

Tunatangaza jedwali fulani katika lua ambalo hufafanua alama. Jedwali hili linahitajika ili kutoa mfuatano wa nasibu.

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

Baada ya hayo, tunatangaza kazi - randomString na kutoa thamani ya urefu katika mabano.

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

Kisha tunaunganisha router ya http na seva ya http kwenye seva yetu ya Tarantula, JSON, ambayo tutampa mteja.

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

Baada ya hayo, tunaanza kwenye bandari 8080 kwenye interfaces zote za seva za http, ambazo zitaweka maombi na makosa yote.

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

Ifuatayo, tunatangaza njia ambayo ikiwa ombi na njia ya GET inakuja kwenye bandari 8080 /hesabu, basi tunaita kazi kutoka kwa mstari mmoja. Inarudisha hali - 200, 404, 403 au chochote tunachotaja.

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

Katika mwili, tunarudi json.encode, tunataja hesabu na getcount ndani yake, ambayo inaitwa na inaonyesha idadi ya rekodi katika database yetu.

Njia ya pili

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)

Ambapo kwenye mstari router:njia({njia = 'GET', path = '/token'}, function() tunaita kazi na kutoa ishara.

Kamba ishara ya ndani = randomString(32) ni mfuatano wa nasibu wa herufi 32.
Katika mstari local last = box.space.example:len() tunatoa kipengele cha mwisho.
Na kwenye mstari box.space.example:insert{ mwisho + 1, ishara } tunaandika data kwenye hifadhidata yetu, yaani, tunaongeza tu kitambulisho kwa 1. Hii inaweza kufanyika, kwa njia, si tu kwa njia hiyo mbaya. Tarantula ina mlolongo wa kesi hii.

Tunaandika ishara hapo.

Kwa hivyo, tuliandika maombi katika faili moja. Unaweza kufikia data mara moja, na moduli ya sanduku itakufanyia kazi zote chafu.

Inasikiliza http na inafanya kazi na data, kila kitu kiko katika mfano mmoja - programu na data. Kwa hiyo, kila kitu hutokea haraka sana.

Ili kuendesha, tunasanikisha moduli ya http:

Jinsi tunavyofanya, angalia chini ya mharibifu

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

Tunahitaji pia prometheus kuendesha:

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

Tunaanza na tunaweza kufikia 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:/#

/hesabu inatupa hadhi 200.
/token hutoa ishara na huandika ishara hii kwenye hifadhidata.

Kasi ya kupima

Wacha tuweke alama kwa hoja 50. Maombi ya ushindani yatakuwa 000.

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

Tokeni hutolewa. Na tunarekodi data kila wakati. 99% ya maombi yalikamilishwa katika milisekunde 42. Ipasavyo, tuna maombi kama 3500 kwa sekunde kwenye mashine ndogo, ambapo kuna cores 2 na gigabytes 4 za kumbukumbu.

Unaweza pia kuchagua tokeni 50000 na uone thamani yake.

Unaweza kutumia sio tu http, endesha vitendaji vya chinichini ambavyo huchakata data yako. Plus kuna vichochezi mbalimbali. Kwa mfano, unaweza kupiga kazi kwenye sasisho, angalia kitu - kurekebisha migogoro.

Unaweza kuandika maombi ya hati moja kwa moja kwenye seva ya hifadhidata yenyewe, na usizuiliwe na chochote, unganisha moduli zozote na utekeleze mantiki yoyote.

Seva ya programu inaweza kufikia seva za nje, kukusanya data na kuiongeza kwenye hifadhidata yake. Data kutoka kwa hifadhidata hii itatumiwa na programu zingine.

Hii itafanywa na Tarantula yenyewe, na hakuna haja ya kuandika maombi tofauti.

Kwa kumalizia

Hii ni sehemu ya kwanza tu ya kazi kubwa. Ya pili itachapishwa hivi karibuni kwenye blogi ya Mail.ru Group, na hakika tutaongeza kiunga kwake katika nakala hii.

Ikiwa ungependa kuhudhuria matukio ambapo tunaunda vitu hivi mtandaoni na kuuliza maswali kwa wakati halisi, unganisha kwa DevOps by REBRAIN chaneli.

Ikiwa unahitaji kuhamia kwenye wingu au una maswali kuhusu miundombinu yako, Jisikie huru kuwasilisha ombi.

PS Tuna ukaguzi 2 wa bure kwa mwezi, labda mradi wako utakuwa mmoja wao.

Chanzo: mapenzi.com

Kuongeza maoni