Kudzokorora kwepamusoro muTarantool DBMS

Mhoro, ndiri kugadzira zvikumbiro zveDBMS Tarantool ipuratifomu yakagadziridzwa neMail.ru Boka rinobatanidza DBMS yepamusoro-soro uye sevha yekushandisa mumutauro weLua. Iyo yakanyanya kumhanya yemhinduro yakavakirwa paTarantool inowanikwa, kunyanya, nekuda kwerutsigiro rwemu-memory mode yeDBMS uye kugona kuita application bhizinesi logic mune imwe kero nzvimbo ine data. Panguva imwecheteyo, kushivirira kwedata kunovimbiswa uchishandisa ACID transactions (a WAL log inochengetwa pa diski). Tarantool ine yakavakirwa-mukati tsigiro yekudzokorora uye sharding. Kutanga kubva mushanduro 2.1, mibvunzo mumutauro weSQL inotsigirwa. Tarantool yakavhurika sosi uye ine rezinesi pasi peRakareruka BSD rezinesi. Kune zvakare yekushambadzira Enterprise vhezheni.

Kudzokorora kwepamusoro muTarantool DBMS
Inzwa simba! (...aka nakidzwa nekuita)

Zvese zviri pamusoro zvinoita kuti Tarantool ive chikuva chinoyevedza chekugadzira yakakwira-mutoro maapplication anoshanda nemadatabase. Mumashandisirwo akadai, kazhinji panodiwa kudzokororwa kwedata.

Sezvambotaurwa pamusoro, Tarantool ine yakavakirwa-mukati data replication. Nheyo yekushanda kwayo ndeyekuita zvakatevedzana pane replicas zvese zvekutengesa zviri mu master log (WAL). Kazhinji kudzokorora kwakadaro (isu tichazoidaidza zvakare low-level) inoshandiswa kuve nechokwadi chekushanda kukanganisa kushivirira uye / kana kugovera mutoro wekuverenga pakati pemasumbu node.

Kudzokorora kwepamusoro muTarantool DBMS
Mupunga. 1. Kudzokorora mukati mesumbu

Muenzaniso weimwe mamiriro angave ari kuendesa data rakagadzirwa mune imwe dhatabhesi kuenda kune imwe dhatabhesi yekugadzirisa/kutarisa. Muchiitiko chekupedzisira, mhinduro iri nyore inogona kunge iri yekushandisa high level kudzokorora - kudzokorodza data padanho rebhizinesi rekushandisa. Avo. Isu hatishandise yakagadzirira-yakagadziriswa mhinduro yakavakirwa muDBMS, asi toshandisa kudzokorora pachedu mukati mekushandisa kwatiri kugadzira. Iyi nzira ine zvese zvakanakira nezvayakaipira. Ngatinyorei zvakanakira.

1. Kuchengetwa kwetraffic:

  • Iwe haugone kutamisa data rese, asi chikamu chayo chete (somuenzaniso, unogona kutamisa mamwe matafura, mamwe makoramu avo kana marekodhi anosangana neimwe chirevo);
  • Kusiyana nekudzokorora kwakadzika-chikamu, icho chinoitwa chinoramba chichiitwa muasynchronous (inoshandiswa mune yazvino vhezheni yeTarantool - 1.10) kana synchronous (ichaitwa mune dzinotevera shanduro dzeTarantool) modhi, kudzokorora kwepamusoro kunogona kuitwa muzvikamu (kureva, Chikumbiro chinotanga kuwiriranisa iyo data - yekuchinjana chikamu data, ipapo pane kumbomira mukudzokorora, mushure meiyo inotevera yekutsinhana chikamu inoitika, nezvimwewo);
  • kana rekodhi rakachinja kakawanda, unogona kuendesa chete yazvino vhezheni (kusiyana yakaderera-level replication, umo shanduko dzese dzakaitwa pana tenzi dzicharidzwa sequentially pane replicas).

2. Hapana matambudziko nekushandisa HTTP kuchinjana, izvo zvinokutendera kuti uwiriranise dhatabhesi kure.

Kudzokorora kwepamusoro muTarantool DBMS
Mupunga. 2. Kudzokorora paHTTP

3. Zvivako zve database pakati peiyo data inotamiswa hazvifanirwe kunge zvakafanana (uyezve, mune yakajairika, zvinokwanisika kushandisa DBMS dzakasiyana, mitauro yekuronga, mapuratifomu, nezvimwewo).

Kudzokorora kwepamusoro muTarantool DBMS
Mupunga. 3. Kudzokorora mune zvakasiyana-siyana zvirongwa

Izvo zvakaderera ndezvekuti, paavhareji, hurongwa hwakanyanya kuoma / kudhura kupfuura kumisikidza, uye pachinzvimbo chekugadzirisa iyo yakavakirwa-mukati mashandiro, uchafanirwa kuita yako pachako.

Kana mumamiriro ako ezvinhu mabhenefiti ari pamusoro akakosha (kana ari mamiriro anodiwa), saka zvine musoro kushandisa yakakwirira-level replication. Ngatitarisei nzira dzinoverengeka dzekushandisa yakakwira-level data replication muTarantool DBMS.

Kuderedza traffic

Saka, imwe yemabhenefiti ekudzokorodza kwepamusoro-soro kuchengetedza traffic. Kuti mukana uyu unyatsozadzikiswa, zvinodikanwa kudzikisa huwandu hwe data inotamiswa panguva yega yega yekutsinhana. Ehe, isu hatifanirwe kukanganwa kuti pakupera kwechikamu, iyo inogamuchira data inofanirwa kuwiriraniswa neyekunobva (kunyanya kune icho chikamu che data chinobatanidzwa mukudzokorora).

Maitiro ekudzikisa huwandu hwe data inotamiswa panguva yepamusoro-yepamusoro kudzokorora? Mhinduro yakatwasuka inogona kuve yekusarudza data nezuva uye nguva. Kuti uite izvi, unogona kushandisa iyo yemazuva-nguva munda yatovepo mutafura (kana iripo). Semuenzaniso, gwaro re "kurongeka" rinogona kunge riine munda "inodiwa nguva yekuraira" - delivery_time. Dambudziko nemhinduro iyi nderekuti zvakakosha mumunda uyu hazvifanirwe kunge zviri munhevedzano inoenderana nekugadzirwa kwemirairo. Saka isu hatigone kurangarira iyo yakanyanya kukosha yemunda delivery_time, inotapurirwa panguva yekutsinhana kwekare, uye panguva inotevera yekutsinhana sarudza marekodhi ese ane yakakwirira yemunda kukosha delivery_time. Zvinyorwa zvine huwandu hwemunda hunogona kunge hwakawedzerwa pakati pezvikamu zvekutsinhana delivery_time. Zvakare, kurongeka kwaigona kuve kwakachinja, izvo zvisinei zvisina kukanganisa munda delivery_time. Muzviitiko zvese izvi, shanduko haizotamiswa kubva kutsime kuenda kunzvimbo yekuenda. Kuti tigadzirise matambudziko aya, isu tichafanirwa kuendesa data "yakatarisana". Avo. muchikamu chega chega chekuchinjana tichaendesa data yese nehuwandu hwemunda delivery_time, kudarika imwe nguva munguva yakapfuura (somuenzaniso, maawa N kubva panguva ino). Nekudaro, zviri pachena kuti kune mahombe masisitimu nzira iyi yakanyanya kuwanda uye inogona kuderedza iyo traffic traffic iyo yatiri kuedza kuita pasina. Pamusoro pezvo, tafura iri kutamiswa inogona kunge isina munda wakabatana nemazuva-nguva.

Imwe mhinduro, yakanyanya kuoma maererano nekuita, ndeyekubvuma kugamuchirwa kwedata. Muchiitiko ichi, panguva yega yega yekuchinjana, data yose inoparadzirwa, risiti yaro isina kusimbiswa nemugamuchiri. Kuti uite izvi, iwe uchafanirwa kuwedzera Boolean column kune iyo tafura tafura (semuenzaniso, is_transferred) Kana mugamuchiri akabvuma kugamuchira rekodhi, munda unowirirana unotora kukosha true, mushure mezvo kupinda hakuchina kubatanidzwa mukutsinhanisa. Iyi sarudzo yekushandisa ine zvinotevera zvakaipa. Chekutanga, parekodhi yega yega inotamiswa, kubvuma kunofanirwa kugadzirwa uye kutumirwa. Zvichireva kutaura, izvi zvinogona kufananidzwa nekupeta kaviri huwandu hwe data inotamiswa uye zvichitungamira mukupeta kaviri nhamba yekutenderera. Chechipiri, hapana mukana wekutumira rekodhi imwechete kune vakati wandei vanogamuchira (yekutanga anogamuchira anosimbisa risiti yake uye yevamwe vese).

Nzira isina zvayakaipira yakapihwa pamusoro ndeyekuwedzera koramu patafura inotamisirwa kuronda shanduko mumitsara yayo. Koramu yakadaro inogona kuve yerudzi-yenguva uye inofanirwa kusetwa / yakagadziridzwa nechishandiso kusvika panguva iripo nguva yega marekodhi akawedzerwa / achichinjwa (atomiki nekuwedzera / shanduko). Semuenzaniso, ngatidaidze iyo column update_time. Nekuchengetedza iyo yakanyanya kukosha yemunda yekoramu iyi kune marekodhi akatamiswa, tinogona kutanga iyo inotevera yekutsinhana chikamu neichi kukosha (sarudza marekodhi ane mutengo wemunda. update_time, kudarika kukosha kwakachengetwa kare). Dambudziko nemaitiro ekupedzisira nderekuti shanduko yedata inogona kuitika mumabhechi. Nekuda kweiyo munda kukosha mune iyo column update_time inogona kunge isiri yega. Saka, iyi koramu haigone kushandiswa kugovaniswa (peji-ne-peji) kuburitsa data. Kuti uratidze peji yedata nepeji, uchafanirwa kugadzira imwe nzira iyo inogona kunge iine yakaderera zvakanyanya (semuenzaniso, kutora kubva kudhatabhesi zvinyorwa zvese zvine kukosha. update_time yakakwirira kupfuura yakapiwa uye ichigadzira imwe nhamba yemarekodhi, kutanga kubva pane imwe offset kubva pakutanga kwemuenzaniso).

Iwe unogona kuvandudza mashandiro ekufambisa data nekuvandudza zvishoma nzira yapfuura. Kuti tiite izvi, isu tichashandisa iyo nhamba yemhando (yakareba integer) sechikamu chemunda kukosha kwekutevera shanduko. Ngatipei zita mbiru row_ver. Kukosha kwenzvimbo yekoramu iyi kunofanira kuramba kuchiiswa/kuvandudzwa nguva imwe neimwe apo rekodhi inogadzirwa/yakagadziridzwa. Asi mune iyi kesi, munda hauzopihwe ikozvino-nguva-nguva, asi kukosha kweimwe counter, yakawedzera neimwe. Nekuda kweizvozvo, iyo column row_ver ichange iine hunhu hwakasarudzika uye inogona kushandiswa kwete chete kuratidza "delta" data (data rakawedzerwa / rakachinjirwa kubva pakupera kweiyo yapfuura chikamu chekuchinjana), asi zvakare kungoita uye zvinobudirira kuiputsa kuita mapeji.

Iyo yekupedzisira yakarongwa nzira yekudzikisa huwandu hwe data inotamiswa mukati meiyo yepamusoro-yepamusoro kudzokorora inoratidzika kwandiri seyakanyanya kunaka uye yepasirese. Ngatizvitarisei zvakadzama.

Kupfuura Data Uchishandisa Row Version Counter

Kuitwa kwesevha/master chikamu

MuMS SQL Server, pane yakakosha column mhando yekushandisa iyi nzira - rowversion. Imwe neimwe dhatabhesi ine counter iyo inowedzera neimwe nguva imwe neimwe rekodhi ichiwedzerwa / kuchinjwa mutafura ine mbiru yakafanana rowversion. Kukosha kwekaunda iyi kunopihwa otomatiki kumunda wekoramu iyi mune rekodhi yakawedzerwa/yakachinjwa. Iyo Tarantool DBMS haina yakafanana yakavakirwa-mukati meshini. Nekudaro, muTarantool hazvina kuoma kuishandisa nemaoko. Ngationei kuti izvi zvinoitwa sei.

Kutanga, izwi diki diki: matafura muTarantool anonzi nzvimbo, uye marekodhi anonzi tuples. MuTarantool unogona kugadzira kutevedzana. Kutevedzana hakuna chimwe chinhu kunze kwemazita majenereta eakaodha nhamba yakazara. Avo. izvi ndizvo chaizvo zvatinoda pazvinangwa zvedu. Pazasi isu tichagadzira kutevedzana kwakadaro.

Usati waita chero dhatabhesi mashandiro muTarantool, unofanirwa kumhanya unotevera kuraira:

box.cfg{}

Nekuda kweizvozvo, Tarantool ichatanga kunyora dhatabhesi snapshots uye transaction logs kune yazvino dhairekitori.

Ngatigadzire kutevedzana row_version:

box.schema.sequence.create('row_version',
    { if_not_exists = true })

Sarudzo if_not_exists inobvumira script yekugadzira kuti iitwe kakawanda: kana chinhu chiripo, Tarantool haizoedze kuigadzira zvakare. Iyi sarudzo ichashandiswa mune yese inotevera DDL mirairo.

Ngatigadzire nzvimbo semuenzaniso.

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        },
        {
            name = 'row_ver',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

Pano tinoisa zita renzvimbo (goods), mazita eminda nemhando dzawo.

Auto-incrementing minda muTarantool inogadzirwawo uchishandisa kutevedzana. Ngatigadzirei auto-incrementing primary key by field id:

box.schema.sequence.create('goods_id',
    { if_not_exists = true })
box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Tarantool inotsigira akati wandei marudzi ema indexes. Ma indexes anonyanya kushandiswa ndeeTREE neHASH marudzi, ayo anobva pane zvimiro zvinoenderana nezita. MUTI ndiyo indekisi yemhando yakawanda. Inokubvumira kuti uwanezve data nenzira yakarongeka. Asi pakusarudza kuenzana, HASH inonyanya kukodzera. Saizvozvo, zvinokurudzirwa kushandisa HASH kune kiyi yekutanga (ndizvo zvatakaita).

Kushandisa column row_ver kuendesa yakashandurwa data, unofanirwa kusunga nhevedzano kukosha kuminda yeiyi column row_ver. Asi kusiyana nekiyi yekutanga, iyo column field value row_ver inofanira kuwedzera neimwe kwete chete kana uchiwedzera zvinyorwa zvitsva, asiwo kana uchichinja zviripo. Unogona kushandisa zvinokonzeresa izvi. Tarantool ine marudzi maviri ezvinokonzera nzvimbo: before_replace ΠΈ on_replace. Zvinokonzeresa zvinodzingwa pese kana data iri munzvimbo yachinja (yega yega tuple yakakanganiswa neshanduko, inokonzeresa basa inotangwa). Kusiyana on_replace, before_replace-triggers inokubvumira kuti uchinje iyo data ye tuple iyo iyo inokonzeresa inourayiwa. Naizvozvo, rudzi rwekupedzisira rwezvinokonzeresa runokodzera isu.

box.space.goods:before_replace(function(old, new)
    return box.tuple.new({new[1], new[2], new[3],
        box.sequence.row_version:next()})
end)

Iyo inotevera trigger inotsiva kukosha kwemunda row_ver yakachengetwa tuple kune inotevera kukosha kwekutevedzana row_version.

Kuti ukwanise kuburitsa data kubva muchadenga goods by column row_ver, ngatigadzire index:

box.space.goods:create_index('row_ver', {
    parts = { 'row_ver' },
    unique = true,
    type = 'TREE',
    if_not_exists = true
})

Index type - muti (TREE), nokuti isu tichada kuburitsa iyo data mukukwira kurongeka kweiyo kukosha mukoromo row_ver.

Ngatiwedzere imwe data kune nzvimbo:

box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}

Nokuti Munda wekutanga ndeye auto-incrementing counter; isu tinopfuura nil pachinzvimbo. Tarantool inongotsiva iyo inotevera kukosha. Saizvozvowo, sekukosha kwezvikamu zve column row_ver unogona kupfuura nil - kana kusatsanangura kukosha zvachose, nekuti koramu iyi inotora nzvimbo yekupedzisira munzvimbo.

Ngatitarisei mhinduro yekuisa:

tarantool> box.space.goods:select()
---
- - [1, 'pen', 123, 1]
  - [2, 'pencil', 321, 2]
  - [3, 'brush', 100, 3]
  - [4, 'watercolour', 456, 4]
  - [5, 'album', 101, 5]
  - [6, 'notebook', 800, 6]
  - [7, 'rubber', 531, 7]
  - [8, 'ruler', 135, 8]
...

Sezvauri kuona, yekutanga uye yekupedzisira minda inozadzwa otomatiki. Iye zvino zvichave nyore kunyora basa rekuisa peji-ne-peji yekuchinja kwenzvimbo goods:

local page_size = 5
local function get_goods(row_ver)
    local index = box.space.goods.index.row_ver
    local goods = {}
    local counter = 0
    for _, tuple in index:pairs(row_ver, {
        iterator = 'GT' }) do
        local obj = tuple:tomap({ names_only = true })
        table.insert(goods, obj)
        counter = counter + 1
        if counter >= page_size then
            break
        end
    end
    return goods
end

Basa racho rinotora separameter kukosha row_ver, kutanga kubva pazvinenge zvakakodzera kusunungura shanduko, uye inodzorera chikamu che data yakashandurwa.

Sampling yedata muTarantool inoitwa kuburikidza nema indexes. Function get_goods inoshandisa iterator ne index row_ver kugamuchira data rakachinja. Iterator mhando iGT (Huru Kupfuura, yakakura kupfuura). Izvi zvinoreva kuti iyo iterator inotevedza sequentially index index kutanga kubva pane yakapfuura kiyi (munda kukosha row_ver).

Iyo iterator inodzorera tuples. Kuti ugozokwanisa kuendesa data kuburikidza neHTTP, zvinodikanwa kushandura tuples kuita chimiro chakanakira inotevera serialization. Muenzaniso unoshandisa yakajairwa basa reizvi tomap. Panzvimbo yekushandisa tomap unogona kunyora basa rako pachako. Somuenzaniso, tingada kupa zita renzvimbo name, musapfuura munda code uye wedzera munda comment:

local function unflatten_goods(tuple)
    local obj = {}
    obj.id = tuple.id
    obj.goods_name = tuple.name
    obj.comment = 'some comment'
    obj.row_ver = tuple.row_ver
    return obj
end

Ukuru hwepeji ye data yakabuda (nhamba yezvinyorwa muchikamu chimwe chete) inotarirwa nekusiyana page_size. Mumuenzaniso kukosha page_size iri 5. Muchirongwa chaicho, saizi yepeji kazhinji inonyanya kukosha. Izvo zvinoenderana neavhareji saizi yenzvimbo tuple. Iyo yakakwana saizi yepeji inogona kutsanangurwa empirically nekuyera nguva yekufambisa data. Iyo yakakura saizi yepeji, idiki nhamba yekutenderera pakati pekutumira nekugamuchira mativi. Nenzira iyi unogona kuderedza iyo yakazara nguva yekurodha shanduko. Nekudaro, kana saizi yepeji yakakurisa, isu tichapedza nguva yakareba pane sevha serial sampuli. Nekuda kweizvozvo, panogona kuve nekunonoka mukugadzirisa zvimwe zvikumbiro zvinouya kune server. Parameter page_size inogona kutakurwa kubva kufaira rekugadzirisa. Kune imwe neimwe nzvimbo inotapurirwa, unogona kuseta kukosha kwayo. Nekudaro, kune dzakawanda nzvimbo kukosha kwakasarudzika (semuenzaniso, 100) kungave kwakakodzera.

Ngatiite basa racho get_goods:

tarantool> get_goods(0)

---
- - row_ver: 1
    code: 123
    name: pen
    id: 1
  - row_ver: 2
    code: 321
    name: pencil
    id: 2
  - row_ver: 3
    code: 100
    name: brush
    id: 3
  - row_ver: 4
    code: 456
    name: watercolour
    id: 4
  - row_ver: 5
    code: 101
    name: album
    id: 5
...

Ngatitorei kukosha kwemunda row_ver kubva pamutsetse wekupedzisira uye fonera basa zvakare:

tarantool> get_goods(5)

---
- - row_ver: 6
    code: 800
    name: notebook
    id: 6
  - row_ver: 7
    code: 531
    name: rubber
    id: 7
  - row_ver: 8
    code: 135
    name: ruler
    id: 8
...

Zvakare:

tarantool> get_goods(8)
---
- []
...

Sezvauri kuona, kana yakashandiswa nenzira iyi, basa rinodzosa ese marekodhi enzvimbo peji nepeji goods. Peji yekupedzisira inoteverwa nesarudzo isina chinhu.

Ngatishandure nzvimbo:

box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}

Takashandura kukosha kwemunda name kune imwe yekupinda uye akawedzera maviri matsva ekupinda.

Ngatidzokorore iyo yekupedzisira basa kufona:

tarantool> get_goods(8)
---



- - row_ver: 9
    code: 800
    name: copybook
    id: 6
  - row_ver: 10
    code: 234
    name: clip
    id: 9
  - row_ver: 11
    code: 432
    name: folder
    id: 10
...

Basa racho rakadzorera zvakachinjwa uye akawedzera zvinyorwa. Saka basa get_goods inokubvumira kuti ugamuchire data yakachinja kubva payapedzisira kufona, inova hwaro hwenzira yekudzokorora iri kutariswa.

Tichasiya kuburitswa kwemhedzisiro kuburikidza neHTTP muchimiro cheJSON kunze kwechikamu chechinyorwa ichi. Unogona kuverenga pamusoro peizvi pano: https://habr.com/ru/company/mailru/blog/272141/

Kuitwa kwemutengi/muranda chikamu

Ngatitarisei kuti kuisirwa kwedivi rekugamuchira kunoita sei. Ngatigadzirei nzvimbo padivi rekugamuchira kuti tichengetedze data rakatorwa:

box.schema.space.create('goods', {
    format = {
        {
            name = 'id',
            type = 'unsigned'

        },
        {
            name = 'name',
            type = 'string'

        },
        {
            name = 'code',
            type = 'unsigned'

        }
    },
    if_not_exists = true
})

box.space.goods:create_index('primary', {
    parts = { 'id' },
    sequence = 'goods_id',
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Chimiro chenzvimbo inofanana nechimiro chenzvimbo iri mutsime. Asi sezvo isu hatisi kuzopfuudza iyo yakagamuchirwa data kumwe kunhu, iyo column row_ver haisi munzvimbo yemugamuchiri. Mumunda id zviziviso zvekwakabva zvicharekodhwa. Naizvozvo, padivi rekugamuchira hapana chikonzero chekuzviita auto-incrementing.

Mukuwedzera, tinoda nzvimbo yekuchengetedza tsika row_ver:

box.schema.space.create('row_ver', {
    format = {
        {
            name = 'space_name',
            type = 'string'

        },
        {
            name = 'value',
            type = 'string'

        }
    },
    if_not_exists = true
})

box.space.row_ver:create_index('primary', {
    parts = { 'space_name' },
    unique = true,
    type = 'HASH',
    if_not_exists = true
})

Kune imwe neimwe nzvimbo yakatakurwa (munda space_name) tichachengetedza kukosha kwekupedzisira kwakatakura pano row_ver (munda value) Iyo column inoshanda sekiyi yekutanga space_name.

Ngatigadzirei basa rekurodha data yenzvimbo goods kuburikidza neHTTP. Kuti tiite izvi, tinoda raibhurari inoshandisa mutengi weHTTP. Mutsara unotevera unotakura raibhurari uye unosimbisa mutengi weHTTP:

local http_client = require('http.client').new()

Isu tinodawo raibhurari yejson deserialization:

local json = require('json')

Izvi zvakakwana kugadzira basa rekurodha data:

local function load_data(url, row_ver)
    local url = ('%s?rowVer=%s'):format(url,
        tostring(row_ver))
    local body = nil
    local data = http_client:request('GET', url, body, {
        keepalive_idle =  1,
        keepalive_interval = 1
    })
    return json.decode(data.body)
end

Basa racho rinoita chikumbiro cheHTTP kune url kero uye inotumira row_ver separameter uye inodzosa mhedzisiro yekukumbira.

Basa rekuchengetedza data rakagamuchirwa rinotaridzika seizvi:

local function save_goods(goods)
    local n = #goods
    box.atomic(function()
        for i = 1, n do
            local obj = goods[i]
            box.space.goods:put(
                obj.id, obj.name, obj.code)
        end
    end)
end

Kutenderera kwekuchengetedza data kunzvimbo goods yakaiswa mukutengeserana (basa rinoshandiswa pane izvi box.atomic) kuderedza nhamba yekushanda kwe disk.

Chekupedzisira, iyo yemuno nzvimbo yekubatanidza basa goods nesosi unogona kuishandisa seizvi:

local function sync_goods()
    local tuple = box.space.row_ver:get('goods')
    local row_ver = tuple and tuple.value or 0

    β€”β€” set your url here:
    local url = 'http://127.0.0.1:81/test/goods/list'

    while true do
        local goods = load_goods(url, row_ver)

        local count = #goods
        if count == 0 then
            return
        end

        save_goods(goods)

        row_ver = goods[count].rowVer
        box.space.row_ver:put({'goods', row_ver})
    end
end

Kutanga tinoverenga kukosha kwakachengetwa kare row_ver kuitira nzvimbo goods. Kana ikashaikwa (yekutanga yekutsinhana chikamu), saka tinoitora se row_ver zero. Tevere mukutenderera tinoita peji-ne-peji kudhawunirodha data rakashandurwa kubva kunobva kune yakatsanangurwa url. Pane imwe neimwe iteration, tinochengetedza data yakagamuchirwa kunzvimbo yakakodzera yemunharaunda uye nekuvandudza kukosha row_ver (munzvimbo row_ver uye mune variable row_ver) - tora kukosha row_ver kubva pamutsetse wekupedzisira we data yakarodha.

Kuti udzivirire kubva netsaona looping (kana kukanganisa muchirongwa), loop while inogona kutsiviwa ne for:

for _ = 1, max_req do ...

Somugumisiro wekuita basa racho sync_goods nzvimbo goods iyo inogamuchira ichava neazvino vhezheni yeese marekodhi enzvimbo goods mutsime.

Zviripachena, kudzima data hakugone kutepfenyurwa nenzira iyi. Kana kuda kwakadaro kuripo, unogona kushandisa chiratidzo chekudzima. Wedzera kune nzvimbo goods boolean field is_deleted uye pachinzvimbo chekudzima rekodhi, tinoshandisa kudzima zvine musoro - tinoisa kukosha kwemunda is_deleted muchirevo true. Dzimwe nguva pane nzvimbo ye boolean is_deleted zviri nyore kushandisa munda deleted, iyo inochengetedza zuva-nguva yekudzima zvine musoro kwerekodhi. Mushure mekuita kudzima zvine musoro, rekodhi yakamisikidzwa kuti ibviswe inozotamiswa kubva kwainobva kuenda kwainoenda (maererano nepfungwa yakurukurwa pamusoro).

Sequence row_ver inogona kushandiswa kuendesa data kubva kune dzimwe nzvimbo: hapana chikonzero chekugadzira yakaparadzana kutevedzana kune imwe neimwe nzvimbo inotapurirwa.

Takatarisa nzira inoshanda yekudzokororwa kwedata repamusoro mumashandisirwo uchishandisa Tarantool DBMS.

zvakawanikwa

  1. Tarantool DBMS inoyevedza, inovimbisa chigadzirwa chekugadzira yakakwira-mutoro maapplication.
  2. High-level data replication ine akati wandei mabhenefiti pane yakaderera-level replication.
  3. Iyo yepamusoro-yepamusoro nzira yekudzokorora inokurukurwa muchinyorwa inokubvumira kuti uderedze huwandu hwe data yakatamiswa nekuendesa chete iwo marekodhi akachinja kubva pachikamu chekupedzisira chekuchinjana.

Source: www.habr.com

Voeg