Tarantool-д та маш хурдан мэдээллийн сан болон тэдгээртэй ажиллах програмыг нэгтгэж болно. Үүнийг хийхэд хэр хялбар болохыг эндээс харж болно

Таван жилийн өмнө би “Тарантоол”-той ажиллах гэж оролдсон ч бүтсэнгүй. Гэхдээ саяхан би вебинар зохион байгуулж, MapReduce хэрхэн ажилладаг талаар Hadoop-ийн талаар ярилцсан. Тэнд надаас "Яагаад энэ ажилд Tarantool ашиглаж болохгүй гэж?" Гэсэн асуулт асуусан.

Сонирхолтой байхын тулд би түүн рүү буцаж, хамгийн сүүлийн хувилбарыг туршиж үзэхээр шийдсэн бөгөөд энэ удаад төсөл надад үнэхээр таалагдсан. Одоо би Tarantool дээр хэрхэн энгийн програм бичиж, ачаалж, гүйцэтгэлийг шалгахыг харуулах болно, та тэнд бүх зүйл хичнээн хялбар, сайхан байгааг харах болно.

Tarantool-д та маш хурдан мэдээллийн сан болон тэдгээртэй ажиллах програмыг нэгтгэж болно. Үүнийг хийхэд хэр хялбар болохыг эндээс харж болно

Tarantool гэж юу вэ

Tarantool нь өөрийгөө маш хурдан мэдээллийн сан гэж үздэг. Та тэнд хүссэн мэдээллээ оруулж болно. Дээрээс нь тэдгээрийг хуулбарлана, хэлтэрхий - өөрөөр хэлбэл асар их хэмжээний өгөгдлийг хэд хэдэн серверт хувааж, тэдгээрийн үр дүнг нэгтгэх - алдааг тэсвэрлэх чадвартай мастер-мастер холбоосыг үүсгэ.

Хоёрдугаарт, энэ нь програмын сервер юм. Та үүн дээр програмаа бичиж, өгөгдөлтэй ажиллах боломжтой, жишээлбэл, хуучин оруулгуудыг тодорхой дүрмийн дагуу устгаж болно. Та Tarantula-д өгөгдөлтэй ажиллах 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 - Энд өгөгдөл байгаа бөгөөд дараа нь тэдгээрийг жишээ болгон хуваана.

Instance-боломжтой болон instance-идэвхжүүлэх фолдерууд байдаг - энэ нь юу эхлүүлэхийг агуулдаг - lua код бүхий жишээний тохиргооны файл бөгөөд энэ нь ямар портууд дээр сонсдог, ямар санах ой байдаг, Винил хөдөлгүүрийн тохиргоо, эхлүүлэх үед ажилладаг код. сервер, хуваалт, дараалал, хуучирсан өгөгдлийг устгах гэх мэт.

Тохиолдлууд PostgreS шиг ажилладаг. Жишээлбэл, та өөр портууд дээр өлгөгдсөн мэдээллийн сангийн олон хуулбарыг ажиллуулахыг хүсч байна. Нэг сервер дээр хэд хэдэн өгөгдлийн сангийн инстанцуудыг ажиллуулж, өөр портууд дээр өлгөдөг болох нь харагдаж байна. Тэд огт өөр тохиргоотой байж болно - нэг жишээ нь нэг логикийг хэрэгжүүлдэг, хоёр дахь нь өөр.

Instance Management

Бидэнд Tarantula instances-ийг удирдах боломжийг олгодог tarantoolctl тушаал байна. Жишээ нь, tarantoolctl шалгах жишээ нь тохиргооны файлыг шалгаж, синтаксийн алдаа байхгүй бол файлыг зүгээр гэж хэлэх болно.

Та жишээний статусыг харж болно - tarantoolctl status example. Үүнтэй адилаар та эхлүүлэх, зогсоох, дахин эхлүүлэх боломжтой.

Нэгэнт ажиллаж байгаа бол түүнтэй холбогдох хоёр арга бий.

1. Захиргааны консол

Анхдагч байдлаар, Tarantool нь залгуур нээж, Tarantula-г удирдахын тулд энгийн ASCII текстийг илгээдэг. Консолтой холбогдох нь үргэлж админ хэрэглэгчийн дор явагддаг тул баталгаажуулалт байхгүй тул Тарантулыг гаднаас нь удирдахын тулд консолын портыг гаргах шаардлагагүй болно.

Ийм байдлаар холбогдохын тулд та Tarantoolctl instance name оруулах хэрэгтэй. Энэ тушаал нь консолыг ажиллуулж админ хэрэглэгчээр холбогдоно. Консолын портыг хэзээ ч гадна талд бүү гарга - үүнийг нэгжийн залгуур болгон үлдээсэн нь дээр. Зөвхөн залгуурт бичих эрхтэй хүмүүс л Тарантула руу холбогдох боломжтой болно.

Энэ арга нь захиргааны зүйлд хэрэгтэй. Өгөгдөлтэй ажиллахын тулд хоёр дахь аргыг ашиглана уу - хоёртын протокол.

2. Тодорхой порт руу холбогдохын тулд хоёртын протокол ашиглах

Тохиргоонд сонсох заавар байдаг бөгөөд энэ нь гадаад харилцаа холбооны портыг нээдэг. Энэ портыг хоёртын протоколд ашигладаг бөгөөд баталгаажуулалтыг тэнд идэвхжүүлсэн.

Энэ холболтын хувьд tarantoolctl connect to port дугаарыг ашигладаг. Үүнийг ашигласнаар та алсын серверүүдтэй холбогдож, баталгаажуулалтыг ашиглаж, янз бүрийн хандалтын эрхийг өгөх боломжтой.

Өгөгдлийн бичлэг ба хайрцагны модуль

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-д хоёр төрлийн хөдөлгүүр байдаг: Санах ойн болон Винил. Санах ой нь бүх өгөгдлийг санах ойд хадгалдаг. Тиймээс бүх зүйл энгийн бөгөөд хурдан ажилладаг. Өгөгдөл нь диск рүү хаягддаг бөгөөд цааш бичих лог механизм байдаг тул сервер эвдэрсэн тохиолдолд бид юу ч алдахгүй.

Винил нь дискэн дээрх өгөгдлийг илүү танил хэлбэрээр хадгалдаг - өөрөөр хэлбэл та бидний санах ойноос илүү их өгөгдлийг хадгалах боломжтой бөгөөд Тарантула үүнийг дискнээс унших болно.

Одоо бид санах ойг ашиглах болно.

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.

Хэсгүүд:

Эндээс манай индекс юунаас бүрдэхийг зааж өгдөг. Энэ нь нэг хэсгээс бүрдэнэ - бидний ашиглах эхний талбар, тэмдэггүй гэж бичнэ үү - эерэг бүхэл тоо. Баримт бичгээс миний санаж байгаагаар дээд тал нь 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 = худал гэж оруулна.

Дараа нь бид индекс маань ямар хэсгүүдээс бүрдэхийг зааж өгнө. Талбар нь индексийг холбох талбарын дугаар бөгөөд мөрийн төрлийг зааж өгдөг. Тэгээд л бүтээгдсэн.

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 mb. Үүнийг дүүргэх үед бичлэг хоёр дахь файл руу шилжиж эхэлнэ. Дахин ачаалсны дараа Tarantool нь хамгийн сүүлийн хяналтын цэгээс сэргэж, дараа нь зогсох хүртэл дараагийн бүх гүйлгээг эргүүлнэ.

Tarantool-д та маш хурдан мэдээллийн сан болон тэдгээртэй ажиллах програмыг нэгтгэж болно. Үүнийг хийхэд хэр хялбар болохыг эндээс харж болно

Ийм бичлэг хийхийн тулд та box.cfg тохиргоонд (example.lua файлд) сонголтыг зааж өгөх хэрэгтэй.

wal_mode = “write”;

дата хэрэглээ

Одоо бидний бичсэн зүйлээр та Tarantula-г өгөгдөл хадгалахад ашиглаж болох бөгөөд энэ нь мэдээллийн сангийн хувьд маш хурдан ажиллах болно. Одоо бялуу дээрх интоор - энэ бүгдийг та юу хийж чадах вэ.

Өргөдөл бичиж байна

Жишээлбэл, Тарантулад зориулж ийм өргөдөл бичье

Спойлер доор байгаа програмыг харна уу

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 серверийг манай Tarantula сервер JSON-той холбож, үйлчлүүлэгчид өгөх болно.

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

Үүний дараа бид бүх http серверийн интерфэйс дээрх 8080 порт дээр ажиллаж эхлэх бөгөөд энэ нь бүх хүсэлт, алдааг бүртгэх болно.

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-г буцаадаг, бид үүн дотор count болон 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:insert{сүүлийн + 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 гэсэн статусыг өгдөг.
/токен нь токен гаргаж, энэ токеныг мэдээллийн санд бичдэг.

Туршилтын хурд

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 группын блог дээр нийтлэгдэх бөгөөд бид энэ нийтлэлд линкийг нэмж оруулах болно.

Хэрэв та эдгээр зүйлсийг онлайнаар бүтээдэг арга хэмжээнд оролцож, бодит цаг хугацаанд асуулт асуухыг сонирхож байвал холбогдоно уу REBRAIN сувгийн DevOps.

Хэрэв та үүлэн рүү шилжих эсвэл дэд бүтцийнхээ талаар асуух зүйл байвал Хүсэлтийг чөлөөтэй илгээнэ үү.

Жич: Бид сард 2 удаа үнэгүй аудит хийдэг, магадгүй таны төсөл тэдний нэг байх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх