A cikin Tarantool, zaku iya haɗa manyan bayanai masu sauri da aikace-aikacen aiki tare da su. Ga yadda sauƙin yin shi ke

Shekaru biyar da suka wuce na yi ƙoƙarin yin aiki tare da Tarantool, amma sai bai yi aiki a gare ni ba. Amma kwanan nan na gudanar da gidan yanar gizo inda na yi magana game da Hadoop da yadda MapReduce ke aiki. A can suka yi mani tambaya: "Me ya sa ba za a yi amfani da Tarantool don wannan aikin ba?"

Saboda sha'awar, na yanke shawarar komawa gare shi, gwada sabon sigar - kuma wannan lokacin ina matukar son aikin. Yanzu zan nuna muku yadda ake rubuta aikace-aikace mai sauƙi a cikin Tarantool, loda shi kuma duba aikin sa, kuma zaku ga yadda sauƙi da sanyi komai yake.

A cikin Tarantool, zaku iya haɗa manyan bayanai masu sauri da aikace-aikacen aiki tare da su. Ga yadda sauƙin yin shi ke

Menene Tarantool

Tarantool tana sanya kanta azaman bayanan bayanai mai sauri. Kuna iya sanya duk bayanan da kuke so a wurin. Bugu da ƙari, maimaita su, shard - wato, raba bayanai masu yawa a cikin sabar da yawa kuma a haɗa sakamakon daga gare su - yin haɗin kai-majiɓinci-majiɓinci.

Na biyu, wannan uwar garken aikace-aikace ne. Kuna iya rubuta aikace-aikacen ku a kai, yin aiki tare da bayanai, misali, share tsoffin bayanan a bango bisa ga wasu dokoki. Kuna iya rubuta uwar garken Http kai tsaye a cikin Tarantula wanda zai yi aiki tare da bayanai: nuna adadinsa, rubuta sabbin bayanai a wurin kuma a rage su duka ga maigidan.

Na karanta wata kasida game da yadda mutanen suka yi jerin gwano na saƙon layi 300, wanda kawai ke fashe da gaggawa - suna da mafi ƙarancin aiki na saƙonni 20 a sakan daya. Anan zaku iya juyawa da gaske ku rubuta babban aikace-aikacen, kuma ba zai zama ajiya ba, kamar a cikin PostgreS.

Zan yi ƙoƙarin bayyana wani abu kamar wannan uwar garken, mai sauƙi kawai, a cikin wannan labarin.

saitin

Don gwajin, na fara daidaitattun injunan kama-da-wane guda uku - rumbun kwamfutar 20 GB, Ubuntu 18.04. 2 Virtual CPUs da 4 gigs na ƙwaƙwalwar ajiya.

Mun shigar da Tarantool - gudanar da rubutun bash ko ƙara wurin ajiya kuma mu dace da shigar da Tarantool. Hanyar haɗi zuwa rubutun - (curl -L https://tarantool.io/installer.sh | VER = 2.4 sudo -E bash). Muna da umarni kamar:

taratoolctl - babban umarni don sarrafa al'amuran Tarantula.
/etc/tarantool - Anan shine duka tsarin.
var/log/tarantool - a nan akwai rajistan ayyukan.
var/lib/tarantool - bayanan ya ta'allaka ne a nan, sa'an nan kuma an raba shi zuwa misalai.

Akwai manyan fayiloli misali-samuwa da misali-amfani - yana ƙunshe da abin da za a ƙaddamar - fayil ɗin daidaitawa na misali tare da lambar lua, wanda ke bayyana menene tashar jiragen ruwa da yake saurare, menene ƙwaƙwalwar ajiya da ke akwai, saitunan injin Vinyl, lambar da ke gudana a farawa. sabobin, sharding, jerin gwano, goge bayanan da ba a gama ba, da sauransu.

Misalai suna aiki kamar a cikin PostgreS. Misali, kuna son gudanar da kwafi da yawa na ma'ajin bayanai waɗanda ke rataye a tashoshin jiragen ruwa daban-daban. Ya bayyana cewa an ƙaddamar da wasu lokuta na bayanai akan sabar guda ɗaya, waɗanda ke rataye a kan tashoshin jiragen ruwa daban-daban. Suna iya samun saituna daban-daban - misali ɗaya yana aiwatar da dabaru ɗaya, na biyu - wani.

Gudanar da misali

Muna da umarnin tarantoolctl, wanda ke ba ku damar sarrafa al'amuran Tarantula. Misali, tarantoolctl duba misali zai duba fayil ɗin daidaitawa kuma ya ce - fayil ɗin yana da kyau idan babu kurakurai a wurin.

Kuna iya ganin matsayin misali - tarantoolctl matsayi misali. Hakanan zaka iya farawa, tsayawa, sake farawa.

Da zarar misali yana gudana, zaku iya haɗa shi ta hanyoyi biyu.

1. Gudanar da wasan bidiyo

Ta hanyar tsoho, Tarantool yana buɗe soket, ana aika rubutu na ASCII na yau da kullun don sarrafa Tarantool. Haɗin kai zuwa na'ura wasan bidiyo koyaushe yana faruwa a ƙarƙashin mai amfani da mai gudanarwa, babu tabbaci, don haka babu buƙatar fitar da tashar jiragen ruwa ta waje don sarrafa Tarantula.

Don haɗa ta amfani da wannan hanyar, kuna buƙatar shigar da Tarantoolctl shigar da sunan misali. Umurnin zai ƙaddamar da na'ura wasan bidiyo kuma ya haɗa a matsayin mai amfani. Kada a taba fallasa tashar jiragen ruwa zuwa waje - yana da kyau a bar shi azaman soket naúrar. Sannan waɗanda ke da damar yin rubutu zuwa soket ɗin kawai za su iya haɗawa zuwa Tarantula.

Ana buƙatar wannan hanyar don abubuwan gudanarwa. Don aiki tare da bayanai, yi amfani da hanya ta biyu - ka'idar binary.

2. Yin amfani da ƙa'idar binary don haɗawa zuwa takamaiman tashar jiragen ruwa

Tsarin yana ƙunshe da umarnin saurare, wanda ke buɗe tashar jiragen ruwa don sadarwar waje. Ana amfani da wannan tashar jiragen ruwa tare da ka'idar binary kuma ana kunna tabbatarwa a can.

Don wannan haɗin, tarantoolctl haɗi zuwa lambar tashar jiragen ruwa ana amfani da shi. Yin amfani da shi, zaku iya haɗawa zuwa sabar mai nisa, yi amfani da ingantaccen aiki da ba da haƙƙin shiga daban-daban.

Rikodin bayanai da Module na Akwatin

Tunda Tarantool duka ma'ajin bayanai ne da uwar garken aikace-aikace, yana da nau'o'i daban-daban. Muna sha'awar akwatin akwatin - yana aiwatar da aiki tare da bayanai. Lokacin da ka rubuta wani abu zuwa akwatin, Tarantool ya rubuta bayanan zuwa faifai, adana shi a ƙwaƙwalwar ajiya, ko yin wani abu da shi.

Yi rikodin

Misali, muna shiga cikin akwatin akwatin kuma mu kira aikin box.once. Wannan zai tilasta Tarantool ya gudanar da lambar mu lokacin da aka fara sabar. Muna ƙirƙirar sarari inda za a adana bayanan mu a cikinsa.

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

Bayan wannan, za mu ƙirƙiri fihirisar firamare - firamare - ta inda za mu iya nemo bayanai. Ta hanyar tsoho, idan ba ku ƙididdige kowane sigogi ba, za a yi amfani da filin farko a kowane rikodin don fihirisar farko.

Sa'an nan kuma mu ba da kyauta ga mai amfani da baƙo, wanda a ƙarƙashinsa muke haɗi ta hanyar binary yarjejeniya. Muna ba da izinin karatu, rubutu da aiwatarwa a duk faɗin misali.

Idan aka kwatanta da bayanan al'ada, duk abin da ke nan yana da sauƙi. Muna da sarari - wurin da ake adana bayanan mu kawai. Ana kiran kowane rikodin tuple. An kunshe shi a cikin MessagePack. Wannan tsari ne mai sanyi sosai - binary ne kuma yana ɗaukar ƙasa kaɗan - 18 bytes da 27.

A cikin Tarantool, zaku iya haɗa manyan bayanai masu sauri da aikace-aikacen aiki tare da su. Ga yadda sauƙin yin shi ke

Yana da matukar dacewa don yin aiki tare da shi. Kusan kowane layi, kowane rikodin bayanai na iya samun ginshiƙai daban-daban.

Za mu iya duba duk wurare ta amfani da umarnin Box.space. Don zaɓar takamaiman misali, rubuta misali box.space kuma sami cikakken bayani game da shi.

Tarantool yana da injuna guda biyu: Memory da Vinyl. Ƙwaƙwalwar ajiya tana adana duk bayanai a cikin ƙwaƙwalwar ajiya. Sabili da haka, komai yana aiki cikin sauƙi da sauri. Ana zubar da bayanan zuwa faifai, kuma akwai kuma tsarin rubutawa na gaba, don haka ba za mu rasa komai ba idan uwar garken ta fadi.

Vinyl yana adana bayanai akan faifai a cikin nau'in da ya fi dacewa da mu - wato, zaku iya adana bayanai fiye da yadda muke da ƙwaƙwalwar ajiya, kuma Tarantula zai karanta ta daga diski.

A yanzu za mu yi amfani da 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>

Index:

Dole ne a ƙirƙiri fihirisa na farko don kowane sarari, saboda ba tare da shi babu abin da zai yi aiki ba. Kamar yadda a cikin kowane bayanan bayanai, muna ƙirƙirar filin farko - ID na rikodin.

Bangarorin:

Anan mun nuna abin da fihirisar mu ta kunsa. Ya ƙunshi kashi ɗaya - filin farko da za mu yi amfani da shi na nau'in nau'in nau'i ne wanda ba a sanya hannu ba - integer tabbatacce. Kamar yadda na tuna daga takardun, iyakar adadin da zai iya zama shine 18 quintillion. Wannan yana da yawa.

Sannan zamu iya saka bayanai ta amfani da umarnin sakawa.

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>

Ana amfani da filin farko azaman maɓalli na farko, don haka dole ne ya zama na musamman. Ba a iyakance mu da adadin ginshiƙai ba, don haka za mu iya saka bayanai da yawa kamar yadda muke so a can. An ayyana su a cikin tsarin MessagePack, wanda na bayyana a sama.

Fitar bayanai

Sa'an nan za mu iya nuna bayanan ta amfani da zaɓin umurnin.

Box.example.select tare da maɓallin {1} zai nuna shigarwar da ake so. Idan muka runtse maɓallin, za mu ga duk bayanan da muke da su. Dukansu sun bambanta da adadin ginshiƙai, amma a nan, bisa ka'ida, babu ra'ayi na ginshiƙai - akwai lambobin filin.

Ana iya samun cikakken kowane adadin bayanai. Kuma alal misali, muna buƙatar nemo su ta filin na biyu. Don yin wannan, muna ƙirƙirar sabon fihirisar sakandare.


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

Muna amfani da umarnin Create_index.
Mu kira shi Secondary.

Bayan wannan kuna buƙatar ƙayyade sigogi. Nau'in fihirisar itace itace. Yana iya zama ba na musamman ba, don haka shigar da Unique = ƙarya.

Sa'an nan kuma mu nuna abin da sassan na mu ya ƙunshi. Filin shine adadin filin da muke ɗaure fihirisar zuwa gareshi, kuma mu saka nau'in kirtani. Don haka aka halicce ta.

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>

Yanzu ga yadda za mu iya kiransa:

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

Adanawa

Idan muka sake farawa misali kuma muka sake gwada kiran bayanan, za mu ga cewa babu shi - komai ya zama fanko. Wannan yana faruwa ne saboda Tarantool yana yin wuraren bincike kuma yana adana bayanan zuwa faifai, amma idan muka daina aiki har sai na gaba na gaba, za mu rasa duk ayyukan - saboda za mu dawo daga wurin bincike na ƙarshe, wanda shine, alal misali, sa'o'i biyu da suka gabata.

Ba zai yi aiki don adana kowane sakan ɗaya ba, saboda kullun zubar da 20 GB akan faifai ba kyakkyawan ra'ayi bane.

Don wannan dalili, an ƙirƙira da aiwatar da manufar rubuta-gaba. Tare da taimakonsa, ga kowane canji a cikin bayanan, an ƙirƙiri shigarwa a cikin ƙaramin fayil ɗin rubuta-gaba.

Ana adana kowace shigarwa har zuwa wurin bincike a cikinsu. Ga waɗannan fayilolin mun saita girman - misali, 64 MB. Lokacin da ya cika, rikodin zai fara zuwa fayil na biyu. Kuma bayan sake kunnawa, Tarantool yana dawo da shi daga wurin bincike na ƙarshe sannan yana jujjuya duk ma'amaloli na gaba har sai ya tsaya.

A cikin Tarantool, zaku iya haɗa manyan bayanai masu sauri da aikace-aikacen aiki tare da su. Ga yadda sauƙin yin shi ke

Don aiwatar da irin wannan rikodin, kuna buƙatar saka zaɓi a cikin saitunan box.cfg (a cikin fayil ɗin example.lua):

wal_mode = “write”;

amfani data

Tare da abin da muka rubuta a yanzu, zaku iya amfani da Tarantula don adana bayanai kuma zai yi aiki da sauri azaman bayanan bayanai. Kuma yanzu icing a kan cake shine abin da za ku iya yi da shi duka.

Rubuta aikace-aikace

Misali, bari mu rubuta wannan aikace-aikacen don Tarantula

Duba aikace-aikacen ƙarƙashin mai ɓarna

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

Muna ayyana wasu tebur a cikin lua wanda ke bayyana haruffa. Ana buƙatar wannan farantin don samar da kirtani bazuwar.

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

Bayan haka, muna ayyana aikin - randomString kuma muna ba da ƙimar tsayi a cikin baka.

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

Sa'an nan kuma mu haɗa na'ura mai ba da hanya tsakanin hanyoyin sadarwa da http zuwa uwar garken Tarantula, JSON, wanda za mu aika zuwa abokin ciniki.

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

Bayan wannan, za mu fara kan tashar jiragen ruwa 8080 akan duk hanyoyin haɗin yanar gizo na http, wanda zai shiga duk buƙatun da kurakurai.

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

Na gaba, muna bayyana hanya, don haka idan buƙatar tare da hanyar GET ta isa tashar jiragen ruwa 8080 / count, to muna kiran aikin daga layi ɗaya. Yana mayar da matsayi - 200, 404, 403 ko wani abin da muka ƙayyade.

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

A cikin jiki mun dawo json.encode, a cikinsa muna nuna ƙidaya da samun ƙididdiga, wanda ake kira kuma yana nuna adadin bayanai a cikin bayanan mu.

Hanyar na biyu

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)

Inda a cikin layi na'ura mai ba da hanya tsakanin hanyoyin sadarwa: hanya ({hanyar = 'GET', hanya = '/token'}, aiki () muna kiran aikin kuma muna samar da alama.

Layi Alamar gida = randomString(32) shi ne bazuwar kirtani na haruffa 32.
A cikin layi local last = box.space.example:len() muna fitar da kashi na ƙarshe.
Kuma a cikin layi box.space.example:saka{arshe + 1, alama} muna rubuta bayanan a cikin ma'ajin mu, wato, kawai muna ƙara ID da 1. Ana iya yin haka, ta hanya, ba kawai ta wannan hanya mara kyau ba. Akwai jerin jerin wannan a cikin Tarantula.

Muna rubuta alamar a can.

Don haka, mun rubuta aikace-aikacen a cikin fayil ɗaya. Kuna iya sarrafa bayanan kai tsaye a can, kuma akwatin akwatin zai yi muku duk aikin datti.

Yana sauraron http kuma yana aiki tare da bayanai, komai yana cikin misali guda - duka aikace-aikacen da bayanai. Saboda haka, komai yana faruwa da sauri.

Don fara mu shigar da http module:

Yadda muke yin wannan, duba ƙarƙashin mai ɓarna

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

Muna kuma buƙatar prometheus don gudu:

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

Mun ƙaddamar kuma za mu iya samun dama ga kayayyaki

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 yana ba mu matsayi 200.
/token yana fitar da alama kuma ya rubuta wannan alamar zuwa bayanan bayanai.

Gudun gwaji

Bari mu gudanar da ma'auni don buƙatun 50. Za a sami buƙatun gasa guda 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:/#

Ana ba da alamu. Kuma muna yin rikodin bayanai akai-akai. 99% na buƙatun an sarrafa su a cikin millise seconds 42. Saboda haka, muna da kusan buƙatun 3500 a cikin daƙiƙa ɗaya akan ƙaramin injin da ke da nau'ikan 2 da gigabytes na ƙwaƙwalwar ajiya.

Hakanan zaka iya zaɓar wasu alamun 50000 kuma duba ƙimar sa.

Kuna iya amfani da ba kawai http ba, har ma da gudanar da ayyukan bango waɗanda ke sarrafa bayanan ku. Bugu da ƙari, akwai abubuwa daban-daban. Misali, zaku iya kiran ayyuka akan sabuntawa, duba wani abu - daidaita rikice-rikice.

Kuna iya rubuta aikace-aikacen rubutun kai tsaye a cikin uwar garken bayanan kanta, kuma ba za'a iyakance shi da komai ba, haɗa kowane nau'i kuma aiwatar da kowane dabaru.

Sabar aikace-aikacen na iya shiga sabar na waje, dawo da bayanai kuma ƙara su cikin ma'ajin bayanai. Wasu aikace-aikace za su yi amfani da bayanai daga wannan bayanan.

Tarantula zai yi wannan da kansa, kuma ba za ku rubuta wani aikace-aikacen daban ba.

A ƙarshe

Wannan shine kawai ɓangaren farko na babban aiki. Za a buga na biyu nan ba da jimawa ba a kan shafin yanar gizon Mail.ru, kuma tabbas za mu ƙara hanyar haɗi zuwa gare ta a cikin wannan kayan.

Idan kuna sha'awar halartar abubuwan da muke gina waɗannan abubuwan akan layi da yin tambayoyi a ainihin lokacin, kunna tashar DevOps ta REBRAIN.

Idan kuna buƙatar matsawa zuwa gajimare ko kuna da tambayoyi game da kayan aikin ku, jin kyauta don barin buƙata.

PS Muna da bincike na kyauta 2 kowane wata, watakila aikin ku zai kasance ɗaya daga cikinsu.

source: www.habr.com

Add a comment