Yn Tarantool, gallwch gyfuno cronfa ddata hynod gyflym a chymhwysiad i weithio gyda nhw. Dyma pa mor hawdd yw hi i'w wneud

Bum mlynedd yn ôl ceisiais weithio gyda Tarantool, ond wedyn ni weithiodd i mi. Ond yn ddiweddar cynhaliais weminar lle siaradais am Hadoop a sut mae MapReduce yn gweithio. Yno fe ofynnon nhw gwestiwn i mi: “Beth am ddefnyddio Tarantool ar gyfer y dasg hon?”

Allan o chwilfrydedd, penderfynais ddychwelyd ato, profi'r fersiwn ddiweddaraf - a'r tro hwn roeddwn i'n hoff iawn o'r prosiect. Nawr byddaf yn dangos i chi sut i ysgrifennu cais syml yn Tarantool, ei lwytho a gwirio ei berfformiad, a byddwch yn gweld pa mor hawdd ac oer yw popeth.

Yn Tarantool, gallwch gyfuno cronfa ddata hynod gyflym a chymhwysiad i weithio gyda nhw. Dyma pa mor hawdd yw hi i'w wneud

Beth yw Tarantool

Mae Tarantool yn gosod ei hun fel cronfa ddata hynod gyflym. Gallwch chi roi unrhyw ddata rydych chi ei eisiau yno. Hefyd, eu hailadrodd, shard - hynny yw, rhannu llawer iawn o ddata ar draws nifer o weinyddion a chyfuno'r canlyniadau ohonynt - gwnewch gysylltiadau meistr-meistr sy'n goddef fai.

Yn ail, gweinydd cais yw hwn. Gallwch ysgrifennu eich ceisiadau arno, gweithio gyda data, er enghraifft, dileu hen gofnodion yn y cefndir yn unol â rheolau penodol. Gallwch chi ysgrifennu gweinydd Http yn uniongyrchol yn Tarantula a fydd yn gweithio gyda data: dosbarthu eu maint, ysgrifennu data newydd yno a lleihau'r cyfan i'r meistr.

Darllenais erthygl am sut y gwnaeth y bechgyn giw neges o 300 o linellau, sy'n fyrstio ac yn rhuthro - mae ganddyn nhw isafswm perfformiad o 20 o negeseuon yr eiliad. Yma gallwch chi wir droi ac ysgrifennu cais mawr iawn, ac ni fydd yn storio, fel yn PostgreS.

Byddaf yn ceisio disgrifio rhywbeth fel y gweinydd hwn, dim ond yn syml, yn yr erthygl hon.

Gosod

Ar gyfer y prawf, dechreuais dri pheiriant rhithwir safonol - gyriant caled 20 GB, Ubuntu 18.04. 2 CPU rhithwir a 4 gig o gof.

Rydyn ni'n gosod Tarantool - yn rhedeg y sgript bash neu'n ychwanegu ystorfa ac yn addas ar gyfer gosod Tarantool. Dolen i'r sgript - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Mae gennym orchmynion fel:

tarantoolctl - y prif orchymyn ar gyfer rheoli achosion Tarantula.
/etc/tarantool - dyma'r cyfluniad cyfan.
var/log/tarantool - dyma'r logiau.
var/lib/tarantool — mae'r data yn gorwedd yma, ac yna mae'n cael ei rannu'n enghreifftiau.

Mae yna ffolderi enghraifft-ar gael ac enghraifft-galluogi - mae'n cynnwys yr hyn fydd yn cael ei lansio - ffeil ffurfweddu enghraifft gyda chod lua, sy'n disgrifio pa borthladdoedd y mae'n gwrando arnynt, pa gof sydd ar gael iddo, gosodiadau injan finyl, cod sy'n rhedeg wrth gychwyn gweinyddwyr, sharding, ciwiau, dileu data darfodedig, ac ati.

Mae enghreifftiau'n gweithio fel yn PostgreS. Er enghraifft, rydych chi am redeg sawl copi o gronfa ddata sy'n hongian ar wahanol borthladdoedd. Mae'n ymddangos bod nifer o achosion cronfa ddata yn cael eu lansio ar un gweinydd, sy'n hongian ar wahanol borthladdoedd. Efallai bod ganddyn nhw osodiadau hollol wahanol - mae un achos yn gweithredu un rhesymeg, yr ail - un arall.

Rheoli achosion

Mae gennym y gorchymyn tarantoolctl, sy'n eich galluogi i reoli achosion Tarantula. Er enghraifft, bydd enghraifft wirio tarantoolctl yn gwirio'r ffeil ffurfweddu ac yn dweud - mae'r ffeil yn iawn os nad oes unrhyw wallau cystrawen yno.

Gallwch weld statws yr enghraifft - enghraifft statws tarantoolctl. Yn yr un modd y gallwch chi ddechrau, stopio, ailgychwyn.

Unwaith y bydd enghraifft yn rhedeg, gallwch gysylltu ag ef mewn dwy ffordd.

1. consol gweinyddol

Yn ddiofyn, mae Tarantool yn agor soced, anfonir testun ASCII arferol yno i reoli Tarantool. Mae cysylltiad â'r consol bob amser yn digwydd o dan y defnyddiwr gweinyddol, nid oes unrhyw ddilysiad, felly nid oes angen symud porthladd y consol y tu allan i reoli Tarantula.

I gysylltu gan ddefnyddio'r dull hwn, mae angen i chi nodi Tarantoolctl rhowch enw enghraifft. Bydd y gorchymyn yn lansio'r consol ac yn cysylltu fel y defnyddiwr gweinyddol. Peidiwch byth ag amlygu porthladd y consol i'r tu allan - mae'n well ei adael fel soced uned. Yna dim ond y rhai sydd â mynediad i ysgrifennu at y soced fydd yn gallu cysylltu â Tarantula.

Mae angen y dull hwn ar gyfer pethau gweinyddol. I weithio gyda data, defnyddiwch yr ail ddull - y protocol deuaidd.

2. Defnyddio protocol deuaidd i gysylltu â phorthladd penodol

Mae'r ffurfweddiad yn cynnwys cyfarwyddeb gwrando, sy'n agor porthladd ar gyfer cyfathrebu allanol. Defnyddir y porth hwn gyda'r protocol deuaidd a galluogir dilysu yno.

Ar gyfer y cysylltiad hwn, defnyddir tarantoolctl cysylltu â rhif porthladd. Gan ei ddefnyddio, gallwch gysylltu â gweinyddwyr o bell, defnyddio dilysu a rhoi hawliau mynediad amrywiol.

Modiwl Cofnodi Data a Blwch

Gan fod Tarantool yn gronfa ddata ac yn weinydd cymwysiadau, mae ganddo fodiwlau amrywiol. Mae gennym ddiddordeb yn y modiwl blwch - mae'n gweithredu gweithio gyda data. Pan fyddwch chi'n ysgrifennu rhywbeth i'r blwch, mae Tarantool yn ysgrifennu'r data i ddisg, yn ei storio yn y cof, neu'n gwneud rhywbeth arall ag ef.

Cofnod

Er enghraifft, rydym yn mynd i mewn i'r modiwl blwch a ffoniwch y swyddogaeth box.once. Bydd hyn yn gorfodi Tarantool i redeg ein cod pan fydd y gweinydd yn cael ei gychwyn. Rydym yn creu gofod lle bydd ein data yn cael ei storio.

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

Ar ôl hyn, rydym yn creu mynegai cynradd - cynradd - y gallwn ei ddefnyddio i chwilio am ddata. Yn ddiofyn, os na fyddwch yn nodi unrhyw baramedrau, bydd y maes cyntaf ym mhob cofnod yn cael ei ddefnyddio ar gyfer y mynegai cynradd.

Yna rydym yn gwneud grant i'r defnyddiwr gwadd, ac o dan yr ydym yn cysylltu trwy'r protocol deuaidd. Rydym yn caniatáu darllen, ysgrifennu a gweithredu ar draws yr enghraifft gyfan.

O'i gymharu â chronfeydd data confensiynol, mae popeth yma yn eithaf syml. Mae gennym le - ardal lle mae ein data yn cael ei storio yn syml. Gelwir pob cofnod yn tuple. Mae wedi'i becynnu yn MessagePack. Mae hwn yn fformat cŵl iawn - mae'n ddeuaidd ac yn cymryd llai o le - 18 beit yn erbyn 27.

Yn Tarantool, gallwch gyfuno cronfa ddata hynod gyflym a chymhwysiad i weithio gyda nhw. Dyma pa mor hawdd yw hi i'w wneud

Mae'n eithaf cyfleus i weithio gydag ef. Gall bron pob llinell, pob cofnod data gael colofnau hollol wahanol.

Gallwn weld pob gofod gan ddefnyddio'r gorchymyn Box.space. I ddewis enghraifft benodol, ysgrifennwch enghraifft box.space a chael gwybodaeth gyflawn amdano.

Mae gan Tarantool ddwy injan adeiledig: Memory a Vinyl. Mae cof yn storio'r holl ddata yn y cof. Felly, mae popeth yn gweithio'n syml ac yn gyflym. Mae'r data'n cael ei ddympio i ddisg, ac mae yna hefyd fecanwaith log ysgrifennu ymlaen llaw, felly ni fyddwn yn colli unrhyw beth os bydd y gweinydd yn damwain.

Mae finyl yn storio data ar ddisg mewn ffurf sy'n fwy cyfarwydd i ni - hynny yw, gallwch storio mwy o ddata nag sydd gennym ni cof, a bydd Tarantula yn ei ddarllen o ddisg.

Am y tro byddwn yn defnyddio Cof.

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>

Mynegai:

Rhaid creu mynegai cynradd ar gyfer unrhyw ofod, oherwydd hebddo ni fydd dim yn gweithio. Fel mewn unrhyw gronfa ddata, rydyn ni'n creu'r maes cyntaf - ID cofnod.

Rhannau:

Yma rydym yn nodi beth mae ein mynegai yn ei gynnwys. Mae'n cynnwys un rhan - y maes cyntaf y byddwn yn ei ddefnyddio yw'r math heb ei lofnodi - cyfanrif positif. Hyd y cofiaf o'r ddogfennaeth, y nifer uchaf y gall fod yw 18 pumliwn. Mae hynny'n llawer.

Yna gallwn fewnosod data gan ddefnyddio'r gorchymyn mewnosod.

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>

Defnyddir y maes cyntaf fel y prif allwedd, felly rhaid iddo fod yn unigryw. Nid ydym wedi ein cyfyngu gan nifer y colofnau, felly gallwn fewnosod cymaint o ddata ag y dymunwn yno. Fe'u nodir yn y fformat MessagePack, a ddisgrifiais uchod.

Allbwn data

Yna gallwn arddangos y data gan ddefnyddio'r gorchymyn dethol.

Bydd Box.example.select gyda'r allwedd {1} yn dangos y cofnod a ddymunir. Os byddwn yn gostwng y cywair, byddwn yn gweld yr holl gofnodion sydd gennym. Maent i gyd yn wahanol yn nifer y colofnau, ond yma, mewn egwyddor, nid oes unrhyw gysyniad o golofnau - mae yna rifau maes.

Gall fod unrhyw swm o ddata o gwbl. Ac er enghraifft, mae angen i ni chwilio amdanynt erbyn yr ail faes. I wneud hyn, rydym yn creu mynegai eilaidd newydd.


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

Rydym yn defnyddio'r gorchymyn Create_index.
Gadewch i ni ei alw'n Uwchradd.

Ar ôl hyn mae angen i chi nodi'r paramedrau. Y math o fynegai yw COEDEN. Efallai nad yw'n unigryw, felly rhowch Unigryw = ffug.

Yna rydyn ni'n nodi pa rannau mae ein mynegai yn eu cynnwys. Maes yw rhif y maes yr ydym yn rhwymo'r mynegai iddo, ac yn nodi'r math o linyn. Ac felly y cafodd ei greu.

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>

Nawr dyma sut y gallwn ei alw:

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

Cadw

Os byddwn yn ailgychwyn yr enghraifft ac yn ceisio galw'r data eto, fe welwn nad yw yno - mae popeth yn wag. Mae hyn yn digwydd oherwydd bod Tarantool yn gwneud pwyntiau gwirio ac yn arbed y data i ddisg, ond os byddwn yn rhoi'r gorau i weithio tan yr arbediad nesaf, byddwn yn colli'r holl weithrediadau - oherwydd byddwn yn gwella o'r pwynt gwirio diwethaf, a oedd, er enghraifft, ddwy awr yn ôl.

Ni fydd yn gweithio i arbed pob eiliad chwaith, oherwydd nid yw dympio 20 GB ar ddisg yn gyson yn syniad da.

At y diben hwn, dyfeisiwyd a gweithredwyd y cysyniad o log ysgrifennu ymlaen llaw. Gyda'i help, ar gyfer pob newid yn y data, mae cofnod yn cael ei greu mewn ffeil log ysgrifennu ymlaen llaw fach.

Mae pob cofnod hyd at y pwynt gwirio yn cael ei storio ynddynt. Ar gyfer y ffeiliau hyn rydym yn gosod y maint - er enghraifft, 64 MB. Pan fydd yn llawn, mae recordio yn dechrau mynd i'r ail ffeil. Ac ar ôl yr ailgychwyn, mae Tarantool yn cael ei adfer o'r pwynt gwirio diwethaf ac yna'n rholio dros yr holl drafodion diweddarach nes iddo ddod i ben.

Yn Tarantool, gallwch gyfuno cronfa ddata hynod gyflym a chymhwysiad i weithio gyda nhw. Dyma pa mor hawdd yw hi i'w wneud

I wneud recordiad o'r fath, mae angen i chi nodi'r opsiwn yn y gosodiadau box.cfg (yn y ffeil example.lua):

wal_mode = “write”;

defnyddio data

Gyda'r hyn rydyn ni wedi'i ysgrifennu nawr, gallwch chi ddefnyddio Tarantula i storio data a bydd yn gweithio'n gyflym iawn fel cronfa ddata. A nawr yr eisin ar y gacen yw'r hyn y gallwch chi ei wneud â'r cyfan.

Ysgrifennu cais

Er enghraifft, gadewch i ni ysgrifennu'r cais canlynol ar gyfer Tarantula

Gweler y cais o dan y 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()

Rydym yn datgan rhywfaint o dabl mewn lua sy'n diffinio'r nodau. Mae angen y plât hwn i gynhyrchu llinyn ar hap.

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

Ar ôl hynny, rydym yn datgan y swyddogaeth - randomString ac yn rhoi gwerth hyd mewn cromfachau.

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

Yna rydym yn cysylltu'r llwybrydd http a'r gweinydd http i'n gweinydd Tarantula, JSON, y byddwn yn ei anfon at y cleient.

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

Ar ôl hyn, rydym yn dechrau ar borthladd 8080 ar bob rhyngwyneb gweinydd http, a fydd yn cofnodi pob cais a gwall.

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

Nesaf, rydym yn datgan llwybr, felly os bydd cais gyda'r dull GET yn cyrraedd porthladd 8080 /count, yna rydym yn galw'r swyddogaeth o un llinell. Mae'n dychwelyd y statws - 200, 404, 403 neu unrhyw un arall a nodir gennym.

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

Yn y corff rydyn ni'n dychwelyd json.encode, ynddo rydyn ni'n nodi cyfrif a chael cyfrif, sy'n cael ei alw ac yn dangos nifer y cofnodion yn ein cronfa ddata.

Yr ail ddull

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)

Ble yn y llinell llwybrydd: route({method = 'GET', llwybr = '/token'}, ffwythiant() rydym yn galw'r swyddogaeth ac yn cynhyrchu tocyn.

Llinyn tocyn lleol = randomString(32) yn llinyn ar hap o 32 nod.
Mewn llinell lleol diwethaf = box.space.example:len() rydym yn cymryd yr elfen olaf allan.
Ac yn y llinell box.space.example:insert{ diwethaf + 1, tocyn } rydym yn ysgrifennu'r data i'n cronfa ddata, hynny yw, rydym yn syml yn cynyddu'r ID gan 1. Gellir gwneud hyn, gyda llaw, nid yn unig yn y ffordd drwsgl hon. Mae dilyniannau ar gyfer hyn yn Tarantula.

Ysgrifennwn y tocyn yno.

Felly, fe wnaethon ni ysgrifennu'r cais mewn un ffeil. Gallwch chi drin y data yn uniongyrchol yno, a bydd y modiwl blwch yn gwneud yr holl waith budr i chi.

Mae'n gwrando ar http ac yn gweithio gyda data, mae popeth mewn un achos - y cymhwysiad a'r data. Felly, mae popeth yn digwydd yn eithaf cyflym.

I ddechrau rydym yn gosod y modiwl http:

Sut rydyn ni'n gwneud hyn, edrychwch o dan y sbwyliwr

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

Mae angen prometheus arnom hefyd i redeg:

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

Rydym yn lansio a gallwn gael mynediad at y modiwlau

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

Mae /count yn rhoi statws 200 i ni.
Mae /token yn rhoi tocyn ac yn ysgrifennu'r tocyn hwn i'r gronfa ddata.

Profi'r cyflymder

Gadewch i ni redeg meincnod ar gyfer 50 o geisiadau. Bydd 000 o geisiadau yn cystadlu.

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

Rhoddir tocynnau. Ac rydym yn cofnodi data yn gyson. Cafodd 99% o geisiadau eu prosesu mewn 42 milieiliad. Yn unol â hynny, mae gennym tua 3500 o geisiadau yr eiliad ar beiriant bach gyda 2 graidd a 4 gigabeit o gof.

Gallwch hefyd ddewis rhyw 50000 o docyn a gweld ei werth.

Gallwch ddefnyddio nid yn unig http, ond hefyd rhedeg swyddogaethau cefndir sy'n prosesu eich data. Hefyd mae yna wahanol sbardunau. Er enghraifft, gallwch chi ffonio swyddogaethau ar ddiweddariadau, gwirio rhywbeth - gwrthdaro cywir.

Gallwch ysgrifennu cymwysiadau sgript yn uniongyrchol yn y gweinydd cronfa ddata ei hun, a pheidio â chael eich cyfyngu gan unrhyw beth, cysylltu unrhyw fodiwlau a gweithredu unrhyw resymeg.

Gall gweinydd y rhaglen gyrchu gweinyddwyr allanol, adfer data a'i ychwanegu at ei gronfa ddata. Bydd data o'r gronfa ddata hon yn cael ei ddefnyddio gan raglenni eraill.

Bydd Tarantula yn gwneud hyn ei hun, ac ni fydd yn rhaid i chi ysgrifennu cais ar wahân.

I gloi

Dim ond y rhan gyntaf o waith mawr yw hwn. Cyhoeddir yr ail un yn fuan iawn ar flog Grŵp Mail.ru, a byddwn yn bendant yn ychwanegu dolen ato yn y deunydd hwn.

Os oes gennych ddiddordeb mewn mynychu digwyddiadau lle rydym yn adeiladu'r pethau hyn ar-lein a gofyn cwestiynau mewn amser real, gwrandewch sianel DevOps gan REBRAIN.

Os oes angen i chi symud i'r cwmwl neu os oes gennych chi gwestiynau am eich seilwaith, croeso i chi adael cais.

ON Mae gennym 2 archwiliad rhad ac am ddim y mis, efallai y bydd eich prosiect yn un ohonynt.

Ffynhonnell: hab.com

Ychwanegu sylw