Дар Tarantool, шумо метавонед як пойгоҳи фаврӣ ва барномаро барои кор бо онҳо муттаҳид кунед. Ин аст, ки ин кор чӣ қадар осон аст

Панҷ сол пеш ман кӯшиш кардам, ки бо Tarantool кор кунам, аммо он барои ман кор накард. Аммо ба наздикӣ ман як вебинар баргузор кардам, ки дар он ман дар бораи Hadoop ва чӣ гуна кор кардани MapReduce сӯҳбат кардам. Он ҷо онҳо ба ман савол доданд: "Чаро барои ин вазифа Tarantool-ро истифода набаред?"

Аз кунҷковӣ ман қарор додам, ки ба он баргардам, версияи охиринро санҷам - ва ин дафъа ба ман лоиҳа хеле маъқул шуд. Ҳоло ман ба шумо нишон медиҳам, ки чӣ тавр дар Tarantool як замимаи оддӣ нависед, онро бор кунед ва иҷрои онро санҷед ва шумо хоҳед дид, ки ҳама чиз чӣ гуна осон ва сард аст.

Дар Tarantool, шумо метавонед як пойгоҳи фаврӣ ва барномаро барои кор бо онҳо муттаҳид кунед. Ин аст, ки ин кор чӣ қадар осон аст

Tarantool чист

Tarantool худро ҳамчун пойгоҳи додаҳои ултра зуд ҷойгир мекунад. Шумо метавонед ҳама гуна маълумотеро, ки мехоҳед дар он ҷо ҷойгир кунед. Илова бар ин, онҳоро такрор кунед, shard - яъне миқдори зиёди маълумотро дар якчанд серверҳо тақсим кунед ва натиҷаҳоро аз онҳо муттаҳид кунед - пайвастҳои ба хатогиҳо таҳаммулпазири усто-мастер эҷод кунед.

Дуюм, ин сервери барнома аст. Шумо метавонед дар он замимаҳои худро нависед, бо маълумот кор кунед, масалан, мувофиқи қоидаҳои муайян сабтҳои кӯҳнаро дар замина нест кунед. Шумо метавонед сервери Http-ро мустақиман дар Тарантула нависед, ки бо маълумот кор мекунад: миқдори онҳоро диҳед, дар он ҷо маълумоти нав нависед ва ҳамаашро ба устод кам кунед.

Ман мақолаеро хондам, ки чӣ тавр бачаҳо як навбати паёмро аз 300 сатр сохтанд, ки ин танҳо дарида ва шитоб аст - онҳо ҳадди аққал 20 паём дар як сония доранд. Дар ин ҷо шумо метавонед воқеан рӯй гардонед ва як барномаи хеле калон нависед ва он мисли PostgreS нигоҳдорӣ нахоҳад буд.

Ман кӯшиш мекунам, ки дар ин мақола чизе монанди ин серверро тавсиф кунам, танҳо оддӣ.

параметр

Барои санҷиш, ман се мошини стандартии виртуалиро оғоз кардам - ​​диски сахти 20 ГБ, Ubuntu 18.04. 2 CPU виртуалӣ ва 4 гиг хотира.

Мо Tarantool-ро насб мекунем - скрипти bash -ро иҷро кунед ё анбор илова кунед ва ба таври мувофиқ насб кунед Tarantool. Истинод ба скрипт - (curl -L https://tarantool.io/installer.sh | VER = 2.4 sudo -E bash). Мо чунин фармонҳо дорем:

tarantoolctl - фармони асосӣ барои идоракунии мисолҳои Тарантула.
/etc/tarantool - ин аст тамоми конфигуратсия.
var/log/tarantool — Ана, губкахо.
var/lib/tarantool — маълумот дар ин чост ва баъд ба инстанцияхо таксим мешавад.

Ҷузвдонҳое ҳастанд, ки барои инстансия дастрасанд ва имкон доранд - он дорои он чизест, ки оғоз мешавад - файли конфигуратсияи намуна бо рамзи lua, ки тавсиф мекунад, ки кадом портҳоро гӯш мекунад, кадом хотира барои он дастрас аст, Танзимоти муҳаррики винилӣ, коде, ки ҳангоми оғозёбӣ кор мекунад серверҳо, тақсимкунӣ, навбатҳо, нест кардани маълумоти кӯҳна ва ғайра.

Мисолҳо мисли PostgreS кор мекунанд. Масалан, шумо мехоҳед якчанд нусхаи пойгоҳи додаҳоро, ки дар портҳои гуногун овезон аст, иҷро кунед. Маълум мешавад, ки якчанд мисолҳои базаи маълумот дар як сервер ба кор андохта мешаванд, ки дар портҳои гуногун овезон мешаванд. Онҳо метавонанд танзимоти комилан гуногун дошта бошанд - як мисол як мантиқро амалӣ мекунад, дуюм - дигар.

Идоракунии мисол

Мо фармони tarantoolctl дорем, ки ба шумо имкон медиҳад, ки мисолҳои Tarantula-ро идора кунед. Масалан, мисоли тафтиши tarantoolctl файли конфигуратсияро тафтиш мекунад ва мегӯяд - файл хуб аст, агар дар он ҷо хатогиҳои синтаксисӣ вуҷуд надошта бошанд.

Шумо метавонед ҳолати мисолро бубинед - мисоли status tarantoolctl. Ба ҳамин тариқ шумо метавонед оғоз, қатъ ва аз нав оғоз кунед.

Вақте ки инстансия кор мекунад, шумо метавонед ба он бо ду роҳ пайваст шавед.

1. Консоли маъмурӣ

Бо нобаёнӣ, Tarantool розетка мекушояд, матни муқаррарии ASCII ба он ҷо барои идоракунии Tarantool фиристода мешавад. Пайвастшавӣ ба консол ҳамеша дар зери корбари администратор сурат мегирад, аутентификатсия вуҷуд надорад, бинобар ин барои идоракунии Тарантула ба берун кардани порти консол лозим нест.

Барои пайваст шудан бо ин усул, шумо бояд номи мисолро ворид кунед Tarantoolctl. Фармон консолро оғоз мекунад ва ҳамчун корбари администратор пайваст мешавад. Ҳеҷ гоҳ бандари консолро ба берун нагузоред - беҳтар аст, ки онро ҳамчун васлаки воҳид гузоред. Он гоҳ танҳо онҳое, ки барои навиштан ба розетка дастрасӣ доранд, метавонанд ба Тарантула пайваст шаванд.

Ин усул барои корҳои маъмурӣ лозим аст. Барои кор бо додаҳо усули дуюм - протоколи бинариро истифода баред.

2. Истифодаи протоколи дуӣ барои пайвастшавӣ ба порти мушаххас

Конфигуратсия дорои дастури гӯш аст, ки портро барои иртиботи беруна мекушояд. Ин порт бо протоколи дуӣ истифода мешавад ва аутентификатсия дар он ҷо фаъол аст.

Барои ин пайвастшавӣ tarantoolctl пайваст ба рақами порт истифода мешавад. Бо истифода аз он, шумо метавонед ба серверҳои дурдаст пайваст шавед, аутентификатсияро истифода баред ва ҳуқуқҳои гуногуни дастрасӣ диҳед.

Модули сабти маълумот ва қуттии

Азбаски Tarantool ҳам пойгоҳи додаҳо ва ҳам сервери барномаҳост, он дорои модулҳои гуногун аст. Мо ба модули қуттӣ таваҷҷӯҳ дорем - он кор бо маълумотро амалӣ мекунад. Вақте ки шумо ба қуттӣ чизе менависед, Tarantool маълумотро ба диск менависад, онро дар хотира нигоҳ медорад ё бо он кори дигаре мекунад.

рекорд

Масалан, мо ба модули қуттӣ меравем ва функсияи box.once -ро даъват мекунем. Ин Tarantool-ро маҷбур мекунад, ки коди моро ҳангоми оғоз кардани сервер иҷро кунад. Мо фазоеро эҷод мекунем, ки дар он маълумоти мо нигоҳ дошта мешавад.

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

Пас аз ин, мо шохиси ибтидоӣ - ибтидоӣ - эҷод мекунем, ки тавассути он мо метавонем маълумотро ҷустуҷӯ кунем. Бо нобаёнӣ, агар шумо ягон параметрро муайян накунед, майдони якум дар ҳар як сабт барои индекси асосӣ истифода мешавад.

Сипас мо ба корбари меҳмон грант медиҳем, ки дар доираи он мо тавассути протоколи дуӣ пайваст мешавем. Мо дар тамоми инстансия хондан, навиштан ва иҷро карданро иҷозат медиҳем.

Дар муқоиса бо пойгоҳи додаҳои муқаррарӣ, ҳама чиз дар ин ҷо хеле содда аст. Мо фазо дорем - минтақае, ки дар он маълумоти мо оддӣ нигоҳ дошта мешавад. Ҳар як сабт tuple номида мешавад. Он дар MessagePack бастабандӣ шудааст. Ин формати хеле олӣ аст - он дуӣ аст ва фазои камтарро ишғол мекунад - 18 байт нисбат ба 27.

Дар Tarantool, шумо метавонед як пойгоҳи фаврӣ ва барномаро барои кор бо онҳо муттаҳид кунед. Ин аст, ки ин кор чӣ қадар осон аст

Бо ӯ кор кардан хеле қулай аст. Қариб ҳар як сатр, ҳар як сабти маълумот метавонад сутунҳои тамоман гуногун дошта бошад.

Мо метавонем ҳамаи фосилаҳоро бо истифода аз фармони Box.space дидан кунем. Барои интихоби мисоли мушаххас, мисоли box.space нависед ва дар бораи он маълумоти пурра гиред.

Tarantool дорои ду муҳаррики дарунсохт: Memory ва Vinyl. Хотира ҳама маълумотро дар хотира нигоҳ медорад. Аз ин рӯ, ҳама чиз оддӣ ва зуд кор мекунад. Маълумот ба диск партофта мешавад ва инчунин як механизми сабти пешнавис мавҷуд аст, бинобар ин, агар сервер суқут кунад, мо чизеро аз даст намедиҳем.

Винил маълумотро дар диск дар шакли ба мо шинос нигоҳ медорад - яъне шумо метавонед маълумотро аз хотираи мо зиёдтар нигоҳ доред ва Тарантула онро аз диск мехонад.

Ҳоло мо хотираро истифода мебарем.

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>

Индекс:

Индекси ибтидоӣ бояд барои ҳама гуна фазо эҷод карда шавад, зеро бе он чизе кор намекунад. Мисли ҳама гуна пойгоҳи додаҳо, мо майдони аввалро эҷод мекунем - ID сабт.

Қисмҳо:

Дар ин ҷо мо нишон медиҳем, ки индекси мо аз чӣ иборат аст. Он аз як қисм иборат аст - майдони аввалине, ки мо истифода хоҳем кард, навъи unsigned - адади мусбат аст. То ҷое ки ман аз ҳуҷҷатҳо дар ёд дорам, шумораи максималии он метавонад 18 квинтиллон бошад. Ин хеле зиёд аст.

Пас мо метавонем бо истифода аз фармони insert маълумот ворид кунем.

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>

Майдони аввал ҳамчун калиди асосӣ истифода мешавад, бинобар ин он бояд беназир бошад. Мо бо шумораи сутунҳо маҳдуд нестем, аз ин рӯ мо метавонем ба он ҷо миқдори зиёди маълумотро ворид кунем. Онҳо дар формати MessagePack муайян шудаанд, ки ман дар боло тавсиф кардам.

Натиҷаи маълумот

Пас мо метавонем маълумотро бо истифода аз фармони интихоб нишон диҳем.

Box.example.select бо калиди {1} сабти дилхоҳро нишон медиҳад. Агар мо калидро паст кунем, мо ҳама сабтҳоеро мебинем, ки дар даст дорем. Ҳамаи онҳо аз рӯи шумораи сутунҳо фарқ мекунанд, аммо дар ин ҷо, аслан мафҳуми сутунҳо вуҷуд надорад - рақамҳои майдонҳо мавҷуданд.

Мутлақо ягон миқдори маълумот вуҷуд дошта метавонад. Ва масалан, мо бояд онҳоро аз рӯи майдони дуюм ҷустуҷӯ кунем. Барои ин мо индекси нави дуюмдараҷа эҷод мекунем.


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

Мо фармони Create_index -ро истифода мебарем.
Биёед онро дуюмдараҷа бигӯем.

Пас аз ин шумо бояд параметрҳоро муайян кунед. Навъи индекс TREE аст. Он метавонад беназир набошад, аз ин рӯ Unique = false -ро ворид кунед.

Сипас мо нишон медиҳем, ки индекси мо аз кадом қисмҳо иборат аст. Майдон рақами майдонест, ки мо ба он индекс мепайвандем ва навъи сатрро муайян мекунем. Ва ҳамин тавр офарида шудааст.

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>

Акнун мо онро ин тавр номида метавонем:

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

Тақвим

Агар мо мисолро аз нав оғоз кунем ва кӯшиш кунем, ки маълумотро дубора занг занем, мо мебинем, ки он дар он ҷо нест - ҳама чиз холӣ аст. Ин аз он сабаб рӯй медиҳад, ки Tarantool гузаргоҳҳоро месозад ва маълумотро ба диск нигоҳ медорад, аммо агар мо корро то сабти навбатӣ қатъ кунем, мо ҳама амалиётҳоро аз даст медиҳем - зеро мо аз нуқтаи охирин, ки масалан, ду соат пеш буд, барқарор мешавем.

Он ҳам барои сарфа кардани ҳар сония кор намекунад, зеро пайваста партофтани 20 ГБ ба диск фикри хуб нест.

Бо ин мақсад консепсияи сабти пешнавис ихтироъ ва амалӣ карда шуд. Бо ёрии он, барои ҳар як тағирот дар маълумот, дар як файли хурди сабти пешнавис сабт эҷод карда мешавад.

Ҳар як вуруд то гузаргоҳ дар онҳо нигоҳ дошта мешавад. Барои ин файлҳо мо андозаро муқаррар мекунем - масалан, 64 МБ. Вақте ки он пур мешавад, сабт ба файли дуюм мегузарад. Ва пас аз бозоғозӣ, Tarantool аз гузаргоҳи охирин барқарор карда мешавад ва сипас тамоми транзаксияҳои баъдӣ то қатъ шудани он мегузаранд.

Дар Tarantool, шумо метавонед як пойгоҳи фаврӣ ва барномаро барои кор бо онҳо муттаҳид кунед. Ин аст, ки ин кор чӣ қадар осон аст

Барои анҷом додани чунин сабт, шумо бояд интихобро дар танзимоти box.cfg муайян кунед (дар файли example.lua):

wal_mode = “write”;

истифодаи маълумот

Бо он чизе ки мо ҳоло навиштаем, шумо метавонед Тарантуларо барои нигоҳ доштани маълумот истифода баред ва он ҳамчун пойгоҳи додаҳо хеле зуд кор мекунад. Ва акнун яхбандии торт он чизест, ки шумо бо ин ҳама кор карда метавонед.

Навиштани ариза

Масалан, биёед аризаи зеринро барои Тарантула нависем

Барномаро дар зери спойлер бубинед

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

Мо дар lua ҷадвалеро эълон мекунем, ки аломатҳоро муайян мекунад. Ин табақ барои тавлиди сатри тасодуфӣ лозим аст.

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

Баъд аз ин, мо функсия - randomString -ро эълон мекунем ва арзиши дарозиро дар қавс мегузорем.

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

Сипас, мо http роутер ва http серверро ба сервери Тарантулаи худ JSON пайваст мекунем, ки мо онро ба муштарӣ мефиристем.

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

Пас аз ин, мо дар порти 8080 дар ҳама интерфейсҳои сервери http оғоз мекунем, ки ҳамаи дархостҳо ва хатогиҳоро сабт мекунад.

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

Баъдан, мо масирро эълон мекунем, то ки агар дархост бо усули GET ба порти 8080 /count ворид шавад, мо функсияро аз як сатр даъват мекунем. Он ҳолатро бармегардонад - 200, 404, 403 ё ҳар чизи дигаре, ки мо муайян мекунем.

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

Дар бадан мо json.encode -ро бармегардонем, дар он мо ҳисоб ва getcount -ро нишон медиҳем, ки номида мешавад ва шумораи сабтҳоро дар базаи мо нишон медиҳад.

Усули дуюм

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)

Дар куҷо дар хати роутер: масир ({метод = 'GET', роҳ = '/токен'}, функсия () мо функсияро даъват мекунем ва нишона тавлид мекунем.

Стринг аломати маҳаллӣ = randomString (32) як сатри тасодуфии 32 аломат аст.
Дар мувофиқат охирини маҳаллӣ = box.space.example:len() мо элементи охиринро мегирем.
Ва дар саф box.space.example:ворид {охирин + 1, нишона } мо маълумотро ба базаи худ менависем, яъне мо танҳо ID-ро 1 зиёд мекунем. Инро, дар омади гап, на танҳо бо ин роҳи бесарусомон анҷом додан мумкин аст. Барои ин дар Тарантула пайдарпайҳо мавҷуданд.

Мо аломатро дар он ҷо менависем.

Хамин тавр, мо аризаро дар як файл навиштем. Шумо метавонед мустақиман маълумотро дар он ҷо идора кунед ва модули қуттӣ ҳама корҳои ифлосро барои шумо иҷро мекунад.

Он http-ро гӯш мекунад ва бо маълумот кор мекунад, ҳама чиз дар як мисол аст - ҳам барнома ва ҳам маълумот. Аз ин рӯ, ҳама чиз хеле зуд рӯй медиҳад.

Барои оғоз кардан мо модули http-ро насб мекунем:

Чӣ тавр мо ин корро мекунем, ба зери спойлер нигаред

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

Барои давидан ба мо инчунин прометей лозим аст:

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

Мо модулҳоро оғоз мекунем ва метавонем ба модулҳо дастрасӣ пайдо кунем

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 ба мо мақоми 200 медиҳад.
/ token токен мебарорад ва ин нишонаро ба базаи маълумот менависад.

Суръати санҷиш

Биёед як меъёрро барои 50 дархост иҷро кунем. 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:/#

Токенҳо бароварда мешаванд. Ва мо пайваста маълумотро сабт мекунем. 99% дархостҳо дар 42 миллисония коркард карда шуданд. Мувофиқи он, мо дар як мошини хурд бо 3500 ядро ​​ва 2 гигабайт хотира дар як сония тақрибан 4 дархост дорем.

Шумо инчунин метавонед тақрибан 50000 аломатро интихоб кунед ва арзиши онро бубинед.

Шумо метавонед на танҳо http истифода баред, балки инчунин функсияҳои заминаро иҷро кунед, ки маълумоти шуморо коркард мекунанд. Илова бар ин, триггерҳои гуногун мавҷуданд. Масалан, шумо метавонед ба функсияҳо оид ба навсозӣ занг занед, чизеро тафтиш кунед - ихтилофҳои дуруст.

Шумо метавонед барномаҳои скриптро мустақиман дар худи сервери пойгоҳи додаҳо нависед ва бо ҳеҷ чиз маҳдуд нашавед, ҳама гуна модулҳоро пайваст кунед ва ҳама гуна мантиқро амалӣ кунед.

Сервери барнома метавонад ба серверҳои беруна дастрасӣ пайдо кунад, маълумотро дарёфт кунад ва ба пойгоҳи додаи худ илова кунад. Маълумот аз ин пойгоҳи додаҳо аз ҷониби дигар замимаҳо истифода мешаванд.

Тарантула ин корро худаш мекунад ва ба шумо лозим нест, ки аризаи алоҳида нависед.

Дар охир

Ин факат кисми якуми кори калон аст. Дуюмаш ба зудӣ дар блоги Mail.ru Group нашр мешавад ва мо ҳатман дар ин мавод истиноди онро илова хоҳем кард.

Агар шумо хоҳиши иштирок дар чорабиниҳоеро дошта бошед, ки мо ин чизҳоро онлайн месозем ва дар вақти воқеӣ саволҳо медиҳем, ҷӯр кунед канали DevOps аз ҷониби REBRAIN.

Агар ба шумо лозим аст, ки ба абр гузаред ё дар бораи инфрасохтори худ савол дошта бошед, озодона дархост гузоред.

PS Мо дар як моҳ 2 аудити ройгон дорем, шояд лоиҳаи шумо яке аз онҳо бошад.

Манбаъ: will.com

Илова Эзоҳ