High-theem replication hauv Tarantool DBMS

Nyob zoo, Kuv tab tom tsim cov ntawv thov rau DBMS Tarantool yog lub platform tsim los ntawm Mail.ru Group uas sib txuas ua haujlwm siab DBMS thiab daim ntawv thov neeg rau zaub mov hauv Lua lus. Kev kub ceev ntawm kev daws teeb meem raws li Tarantool tau ua tiav, tshwj xeeb, vim yog kev txhawb nqa rau hauv-nco hom ntawm DBMS thiab muaj peev xwm ua tiav daim ntawv thov kev lag luam logic hauv ib qho chaw nyob nrog cov ntaub ntawv. Nyob rau tib lub sijhawm, cov ntaub ntawv persistence yog xyuas kom siv ACID kev lag luam (ib daim ntawv WAL khaws cia rau hauv disk). Tarantool muaj built-in kev txhawb nqa rau replication thiab sharding. Pib los ntawm version 2.1, cov lus nug hauv SQL lus tau txais kev txhawb nqa. Tarantool yog qhib qhov chaw thiab muaj ntawv tso cai raws li daim ntawv tso cai Simplified BSD. Kuj tseem muaj kev lag luam Enterprise version.

High-theem replication hauv Tarantool DBMS
Xav lub zog! (…aka txaus siab rau kev ua yeeb yam)

Tag nrho cov saum toj no ua rau Tarantool yog qhov txaus nyiam platform rau kev tsim cov ntawv thov siab uas ua haujlwm nrog cov ntaub ntawv. Hauv cov ntawv thov no, feem ntau xav tau cov ntaub ntawv rov ua dua.

Raws li tau hais los saum no, Tarantool tau tsim cov ntaub ntawv rov ua dua. Lub hauv paus ntsiab lus ntawm nws txoj haujlwm yog ua raws li kev coj ua ntawm replicas tag nrho cov kev lag luam muaj nyob rau hauv tus tswv log (WAL). Feem ntau xws li replication (peb yuav hu nws ntxiv qib qis) yog siv los xyuas kom meej daim ntawv thov ua txhaum cai thiab / lossis faib cov kev nyeem ntawv ntawm pawg nodes.

High-theem replication hauv Tarantool DBMS
Rice. 1. Replication nyob rau hauv ib pawg

Ib qho piv txwv ntawm lwm qhov xwm txheej yuav hloov cov ntaub ntawv tsim nyob rau hauv ib qho chaw khaws ntaub ntawv mus rau lwm lub database rau kev ua / saib xyuas. Hauv qhov kawg, kev daws teeb meem yooj yim dua tuaj yeem siv qib siab replication - cov ntaub ntawv replication ntawm daim ntawv thov kev lag luam qib logic. Cov. Peb tsis siv cov kev daws teeb meem uas tau npaj ua rau hauv DBMS, tab sis siv rov ua dua ntawm peb tus kheej hauv daim ntawv thov peb tab tom tsim. Txoj kev no muaj ob qho zoo thiab qhov tsis zoo. Cia peb teev qhov zoo.

1. Kev txuag tsheb:

  • Koj tsis tuaj yeem hloov tag nrho cov ntaub ntawv, tab sis tsuas yog ib feem ntawm nws (piv txwv li, koj tuaj yeem hloov qee lub rooj xwb, qee qhov ntawm lawv cov kab lossis cov ntaub ntawv uas ua tau raws li qee qhov kev ntsuas);
  • Tsis zoo li qib qis replication, uas yog ua tsis tu ncua nyob rau hauv asynchronous (ua nyob rau hauv lub tam sim no version ntawm Tarantool - 1.10) los yog synchronous (yuav tsum tau siv nyob rau hauv lub tom ntej versions ntawm Tarantool) hom, high-theem replication yuav ua tau nyob rau hauv lub sij hawm (piv txwv li, lub daim ntawv thov ua ntej synchronizes cov ntaub ntawv - kev sib pauv cov ntaub ntawv sib tham, tom qab ntawd muaj ib ntus hauv kev rov ua dua, tom qab ntawd qhov kev sib pauv tom ntej tshwm sim, thiab lwm yam);
  • Yog tias cov ntaub ntawv tau hloov pauv ntau zaus, koj tuaj yeem hloov pauv tsuas yog nws qhov tseeb version (tsis zoo li cov txheej txheem qis qis, uas txhua qhov kev hloov pauv ntawm tus tswv yuav raug ntaus rov qab ua ntu zus ntawm cov replicas).

2. Tsis muaj teeb meem nrog kev siv HTTP pauv, uas tso cai rau koj los synchronize tej thaj chaw deb databases.

High-theem replication hauv Tarantool DBMS
Rice. 2. Rov ua dua HTTP

3. Cov txheej txheem database ntawm cov ntaub ntawv hloov pauv tsis tas yuav tsum yog tib yam (tsis tas li ntawd, hauv cov ntaub ntawv dav dav, nws tseem tuaj yeem siv DBMSs sib txawv, cov lus programming, platforms, thiab lwm yam).

High-theem replication hauv Tarantool DBMS
Rice. 3. Replication nyob rau hauv heterogeneous systems

Qhov tsis zoo yog qhov nruab nrab, qhov programming nyuaj / kim dua li kev teeb tsa, thiab hloov kho cov kev ua haujlwm hauv built-in, koj yuav tsum siv koj tus kheej.

Yog tias hauv koj qhov xwm txheej saum toj no qhov zoo yog qhov tseem ceeb (lossis yog ib qho xwm txheej tsim nyog), ces nws ua rau kev txiav txim siab siv qib siab replication. Cia peb saib ob peb txoj hauv kev los siv cov ntaub ntawv qib siab replication hauv Tarantool DBMS.

Kev tsheb tsawg kawg nkaus

Yog li, ib qho ntawm qhov zoo ntawm kev rov ua dua qib siab yog kev txuag tsheb. Txhawm rau kom tau txais txiaj ntsig zoo no kom tiav, nws yog ib qho tsim nyog yuav tsum txo qis tus nqi ntawm cov ntaub ntawv xa mus rau txhua qhov kev sib pauv pauv. Tau kawg, peb yuav tsum tsis txhob hnov ​​​​qab tias thaum kawg ntawm qhov kev sib kho, tus neeg txais cov ntaub ntawv yuav tsum tau synchronized nrog lub hauv paus (tsawg kawg yog rau ib feem ntawm cov ntaub ntawv uas koom nrog hauv replication).

Yuav ua li cas txo tus nqi ntawm cov ntaub ntawv pauv thaum lub sij hawm replication siab? Ib txoj hauv kev yooj yim tuaj yeem xaiv cov ntaub ntawv los ntawm hnub thiab sijhawm. Txhawm rau ua qhov no, koj tuaj yeem siv hnub-lub sijhawm teb uas twb muaj lawm hauv lub rooj (yog tias muaj). Piv txwv li, ib daim ntawv "kev txiav txim" tej zaum yuav muaj ib daim teb "yuav tsum tau txiav txim ua lub sij hawm" - delivery_time. Qhov teeb meem nrog qhov kev daws teeb meem no yog tias qhov tseem ceeb hauv daim teb no tsis tas yuav tsum nyob rau hauv cov kab ke uas sib haum rau kev tsim cov kev txiav txim. Yog li peb tsis tuaj yeem nco qab tus nqi siab tshaj plaws delivery_time, kis tau thaum lub sij hawm sib pauv dhau los, thiab thaum lub sij hawm sib pauv hloov tom ntej xaiv tag nrho cov ntaub ntawv nrog tus nqi siab dua delivery_time. Cov ntaub ntawv nrog tus nqi qis dua tuaj yeem raug ntxiv ntawm kev sib pauv delivery_time. Tsis tas li ntawd, qhov kev txiav txim tuaj yeem hloov pauv, txawm li cas los xij tsis cuam tshuam rau thaj chaw delivery_time. Hauv ob qho xwm txheej, qhov kev hloov pauv yuav tsis raug xa mus los ntawm qhov chaw mus rau qhov chaw. Txhawm rau daws cov teeb meem no, peb yuav tsum hloov cov ntaub ntawv "overlapping". Cov. hauv txhua qhov kev sib pauv pauv peb yuav hloov tag nrho cov ntaub ntawv nrog tus nqi teb delivery_time, tshaj qee qhov taw tes yav dhau los (piv txwv li, N teev los ntawm lub sijhawm tam sim no). Txawm li cas los xij, nws yog qhov pom tseeb tias rau cov tshuab loj no txoj hauv kev no yog qhov tsis txaus ntseeg thiab tuaj yeem txo cov tsheb thauj mus los uas peb tau mob siab rau tsis muaj dab tsi. Tsis tas li ntawd, lub rooj raug xa mus yuav tsis muaj ib daim teb uas cuam tshuam nrog hnub tim.

Lwm qhov kev daws teeb meem, ntau txoj hauv kev ntawm kev siv, yog lees paub qhov tau txais cov ntaub ntawv. Nyob rau hauv cov ntaub ntawv no, nyob rau hauv txhua rooj sib tham sib pauv, tag nrho cov ntaub ntawv yog kis tau tus mob, qhov tau txais uas tsis tau lees paub los ntawm tus neeg tau txais kev pab. Txhawm rau ua qhov no, koj yuav tsum ntxiv ib kab Boolean rau hauv lub rooj (piv txwv li, is_transferred). Yog tias tus neeg txais kev lees paub tau txais cov ntaub ntawv, qhov chaw sib txuas yuav siv tus nqi true, tom qab uas qhov nkag tsis tau koom nrog hauv kev sib pauv. Qhov kev xaiv no muaj qhov tsis zoo hauv qab no. Ua ntej, rau txhua cov ntaub ntawv xa mus, kev lees paub yuav tsum raug tsim thiab xa. Hais lus kwv yees, qhov no tuaj yeem muab piv rau ob npaug ntawm cov ntaub ntawv xa mus thiab ua rau ob npaug ntawm tus lej ntawm kev mus ncig. Qhov thib ob, tsis muaj peev xwm xa tib cov ntaub ntawv mus rau ntau tus neeg txais (thawj tus txais yuav lees paub qhov tau txais rau nws tus kheej thiab rau tag nrho lwm tus).

Ib txoj hauv kev uas tsis muaj qhov tsis zoo tau muab los saum toj no yog ntxiv ib kem rau lub rooj hloov pauv mus taug qab cov kev hloov pauv hauv nws cov kab. Cov kab ke no tuaj yeem yog hom hnub tim thiab yuav tsum tau teeb tsa / hloov kho los ntawm daim ntawv thov mus rau lub sijhawm tam sim no txhua lub sijhawm cov ntaub ntawv ntxiv / hloov pauv (atomically nrog qhov sib ntxiv / hloov). Ua piv txwv, cia peb hu rau sab update_time. Los ntawm kev txuag tus nqi siab tshaj plaws ntawm kab ntawv no rau cov ntaub ntawv xa mus, peb tuaj yeem pib qhov kev sib pauv hloov tom ntej nrog tus nqi no (xaiv cov ntaub ntawv nrog tus nqi teb update_time, tshaj tus nqi khaws cia yav dhau los). Qhov teeb meem nrog txoj hauv kev tom kawg yog cov ntaub ntawv hloov pauv tuaj yeem tshwm sim hauv cov khoom siv. Raws li qhov txiaj ntsig ntawm thaj chaw muaj txiaj ntsig hauv kab update_time tej zaum yuav tsis tshwj xeeb. Yog li, kab ntawv no tsis tuaj yeem siv rau kev faib tawm (nplooj los ntawm nplooj) cov ntaub ntawv tawm. Txhawm rau tso cov ntaub ntawv nplooj ntawv los ntawm nplooj ntawv, koj yuav tsum tau tsim cov txheej txheem ntxiv uas yuav muaj qhov ua tau zoo tsawg heev (piv txwv li, muab cov ntaub ntawv los ntawm cov ntaub ntawv txhua cov ntaub ntawv nrog tus nqi. update_time siab tshaj ib tug muab thiab ua ib tug tej yam xov tooj ntawm cov ntaub ntawv, pib los ntawm ib tug tej yam offset los ntawm qhov pib ntawm cov qauv).

Koj tuaj yeem txhim kho qhov ua tau zoo ntawm cov ntaub ntawv hloov pauv los ntawm kev txhim kho me ntsis ntawm txoj hauv kev dhau los. Txhawm rau ua qhov no, peb yuav siv hom integer (long integer) raws li kab ntawv qhov tseem ceeb rau kev taug qab cov kev hloov pauv. Wb lub npe kem row_ver. Tus nqi teb ntawm kab ntawv no tseem yuav tsum tau teeb tsa / hloov kho txhua zaus cov ntaub ntawv raug tsim / hloov kho. Tab sis nyob rau hauv cov ntaub ntawv no, daim teb yuav tsis muab rau tam sim no hnub-lub sij hawm, tab sis tus nqi ntawm ib co counter, nce los ntawm ib tug. Yog li ntawd, kab row_ver yuav muaj cov txiaj ntsig tshwj xeeb thiab tuaj yeem siv tsis tau tsuas yog los tso saib "delta" cov ntaub ntawv (cov ntaub ntawv ntxiv / hloov pauv txij li qhov kawg ntawm kev sib pauv yav dhau los), tab sis kuj tseem ua kom yooj yim thiab ua haujlwm zoo rau hauv nplooj ntawv.

Txoj kev npaj kawg ntawm kev txo qis ntawm cov ntaub ntawv xa mus rau hauv lub moj khaum ntawm qib siab replication zoo li kuv qhov zoo tshaj plaws thiab universal. Cia peb saib nws hauv kev nthuav dav ntxiv.

Hla cov ntaub ntawv siv kab lus Version Counter

Kev nqis tes ua ntawm server / master part

Hauv MS SQL neeg rau zaub mov, muaj ib kab tshwj xeeb rau kev siv txoj hauv kev no - rowversion. Txhua lub database muaj lub txee uas nce los ntawm ib qho txhua zaus cov ntaub ntawv ntxiv / hloov pauv hauv lub rooj uas muaj kab zoo li rowversion. Tus nqi ntawm lub txee no tau muab tso rau hauv daim teb ntawm kab ntawv no hauv cov ntaub ntawv ntxiv / hloov pauv. Lub Tarantool DBMS tsis muaj qhov zoo sib xws hauv cov txheej txheem. Txawm li cas los xij, hauv Tarantool nws tsis yooj yim rau kev siv nws manually. Cia peb saib seb qhov no ua li cas.

Ua ntej, me ntsis terminology: cov ntxhuav hauv Tarantool hu ua qhov chaw, thiab cov ntaub ntawv hu ua tuples. Hauv Tarantool koj tuaj yeem tsim cov kab ke. Sequences yog tsis muaj dab tsi ntau tshaj li lub npe hu ua generators ntawm txiav txim integer qhov tseem ceeb. Cov. qhov no yog qhov peb xav tau rau peb lub hom phiaj. Hauv qab no peb yuav tsim ib ntus.

Ua ntej ua ib qho kev lag luam database hauv Tarantool, koj yuav tsum khiav cov lus txib hauv qab no:

box.cfg{}

Raws li qhov tshwm sim, Tarantool yuav pib sau cov ntaub ntawv snapshots thiab cov ntaub ntawv sib pauv mus rau cov npe tam sim no.

Cia peb tsim ib ntu row_version:

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

Xaiv if_not_exists tso cai rau cov ntawv tsim kom ua tiav ntau zaus: yog tias cov khoom muaj, Tarantool yuav tsis sim tsim nws dua. Qhov kev xaiv no yuav raug siv rau hauv tag nrho cov lus txib DDL tom ntej.

Cia peb tsim qhov chaw ua piv txwv.

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

Ntawm no peb teem lub npe ntawm qhov chaw (goods), cov npe teb thiab lawv hom.

Nws pib-incrementing teb nyob rau hauv Tarantool kuj yog tsim siv sequences. Cia peb tsim ib qho pib-incrementing thawj tus yuam sij los ntawm teb 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 txhawb ntau hom kev ntsuas. Cov feem ntau siv indexes yog TREE thiab HASH hom, uas yog raws li cov qauv coj mus rau lub npe. TREE yog hom index ntau ntau yam. Nws tso cai rau koj mus muab cov ntaub ntawv nyob rau hauv ib tug txheej txheem. Tab sis rau kev xaiv sib npaug, HASH yog qhov tsim nyog dua. Raws li, nws raug nquahu kom siv HASH rau qhov tseem ceeb (uas yog qhov peb tau ua).

Txhawm rau siv kab row_ver Txhawm rau hloov cov ntaub ntawv hloov pauv, koj yuav tsum khi cov txiaj ntsig sib luag rau cov teb ntawm kab ntawv no row_ver. Tab sis tsis zoo li tus yuam sij tseem ceeb, tus nqi ntawm kab row_ver yuav tsum nce los ntawm ib qho tsis yog thaum ntxiv cov ntaub ntawv tshiab, tab sis kuj thaum hloov cov uas twb muaj lawm. Koj tuaj yeem siv cov txiaj ntsig rau qhov no. Tarantool muaj ob hom chaw ua haujlwm: before_replace ΠΈ on_replace. Cov txiaj ntsig raug rho tawm haujlwm thaum twg cov ntaub ntawv hauv qhov chaw hloov pauv (rau txhua tus tuple cuam tshuam los ntawm kev hloov pauv, qhov ua haujlwm tshwm sim tau pib). Tsis zoo li on_replace, before_replace-triggers tso cai rau koj hloov kho cov ntaub ntawv ntawm tuple uas tus txhais tau raug tua. Raws li qhov kawg ntawm kev ua kom haum rau peb.

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

Cov txiaj ntsig hauv qab no hloov cov nqi teb row_ver khaws tuple rau tus nqi tom ntej ntawm qhov sib lawv liag row_version.

Txhawm rau kom muaj peev xwm rho tawm cov ntaub ntawv los ntawm qhov chaw goods los ntawm kab row_ver, cia peb tsim ib qho index:

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

Index type - tsob ntoo (TREE), vim peb yuav tau rho tawm cov ntaub ntawv nyob rau hauv ascending kev txiav txim ntawm tus nqi nyob rau hauv kem row_ver.

Cia peb ntxiv qee cov ntaub ntawv rau qhov chaw:

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}

Vim Thawj daim teb yog qhov pib-incrementing txee; peb hla nil xwb. Tarantool yuav hloov pauv tus nqi tom ntej. Ib yam li ntawd, raws li tus nqi ntawm cov kab ke row_ver koj tuaj yeem hla nil - lossis tsis qhia tus nqi txhua, vim kem no occupies kawg nyob rau hauv qhov chaw.

Cia peb txheeb xyuas qhov tshwm sim ntawm qhov ntxig:

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]
...

Raws li koj tuaj yeem pom, thawj zaug thiab qhov kawg teb tau sau cia. Tam sim no nws yuav yooj yim los sau cov haujlwm rau nplooj ntawv-los-nplooj uploading ntawm qhov chaw hloov pauv 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

Cov nuj nqi yuav siv raws li ib tug parameter tus nqi row_ver, pib los ntawm qhov yuav tsum tau tshem tawm cov kev hloov pauv, thiab rov qab ib feem ntawm cov ntaub ntawv hloov pauv.

Cov ntaub ntawv sampling nyob rau hauv Tarantool yog ua los ntawm indexes. Muaj nuj nqi get_goods siv tus iterator los ntawm index row_ver kom tau txais cov ntaub ntawv hloov pauv. Iterator hom yog GT (Greater dua, ntau dua). Qhov no txhais tau hais tias tus iterator yuav sequentially traverse qhov Performance index qhov tseem ceeb pib los ntawm tus yuam sij dhau lawm (tus nqi teb row_ver).

Tus iterator rov tuples. Txhawm rau txuas ntxiv tuaj yeem hloov cov ntaub ntawv ntawm HTTP, nws yog ib qho tsim nyog los hloov cov tuples rau cov qauv yooj yim rau kev sib txuas ntxiv tom ntej. Piv txwv siv tus qauv ua haujlwm rau qhov no tomap. Es tsis txhob siv tomap koj tuaj yeem sau koj tus kheej ua haujlwm. Piv txwv li, tej zaum peb yuav xav hloov lub npe teb name, tsis dhau daim teb code thiab ntxiv ib daim teb 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

Nplooj ntawv loj ntawm cov ntaub ntawv tso zis (tus naj npawb ntawm cov ntaub ntawv hauv ib feem) yog txiav txim los ntawm qhov sib txawv page_size. Hauv qhov piv txwv tus nqi page_size yog 5. Hauv qhov kev pab cuam tiag tiag, nplooj ntawv loj feem ntau tseem ceeb dua. Nws nyob ntawm qhov nruab nrab qhov loj ntawm qhov chaw tuple. Qhov zoo tshaj plaws nplooj ntawv loj tuaj yeem txiav txim siab los ntawm kev ntsuas cov ntaub ntawv hloov sijhawm. Qhov loj ntawm nplooj ntawv loj, qhov me me ntawm cov roundtrips ntawm kev xa thiab txais sab. Txoj kev no koj tuaj yeem txo lub sijhawm tag nrho rau kev hloov pauv. Txawm li cas los xij, yog tias nplooj ntawv loj dhau lawm, peb yuav siv sijhawm ntev dhau ntawm lub server serializing tus qauv. Yog li ntawd, tej zaum yuav muaj kev ncua qeeb hauv kev ua lwm yam kev thov tuaj rau lub server. Parameter page_size tuaj yeem thauj khoom los ntawm cov ntaub ntawv teeb tsa. Rau txhua qhov chaw sib kis, koj tuaj yeem teeb tsa nws tus nqi. Txawm li cas los xij, rau feem ntau qhov chaw tus nqi pib (piv txwv li, 100) yuav tsim nyog.

Cia peb ua haujlwm 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
...

Wb coj tus nqi teb row_ver los ntawm kab kawg thiab hu rau lub luag haujlwm dua:

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
...

Ib zaug ntxiv:

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

Raws li koj tuaj yeem pom, thaum siv txoj hauv kev no, cov haujlwm rov qab txhua qhov chaw cov ntaub ntawv nplooj ntawv los ntawm nplooj ntawv goods. Nplooj ntawv kawg yog ua raws li kev xaiv khoob.

Cia peb hloov qhov chaw:

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

Peb tau hloov tus nqi teb name rau ib qho nkag thiab ntxiv ob qhov kev nkag tshiab.

Cia peb rov ua lub luag haujlwm kawg hu:

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
...

Cov haujlwm xa rov qab cov ntaub ntawv hloov pauv thiab ntxiv. Yog li cov haujlwm get_goods tso cai rau koj kom tau txais cov ntaub ntawv uas tau hloov pauv txij li nws qhov kev hu xov tooj kawg, uas yog lub hauv paus ntawm txoj kev rov ua dua raws li kev xav.

Peb yuav tawm qhov kev tshaj tawm ntawm cov txiaj ntsig ntawm HTTP hauv daim ntawv ntawm JSON sab nraud ntawm cov kab lus no. Koj tuaj yeem nyeem txog qhov no ntawm no: https://habr.com/ru/company/mailru/blog/272141/

Kev siv ntawm tus neeg siv khoom / qhev ib feem

Cia peb saib seb qhov kev txais sab nraud qhov kev siv zoo li cas. Cia peb tsim ib qho chaw nyob rau sab txais los khaws cov ntaub ntawv rub tawm:

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

Cov qauv ntawm qhov chaw zoo ib yam li cov qauv ntawm qhov chaw hauv qhov chaw. Tab sis txij li thaum peb tsis mus dhau cov ntaub ntawv tau txais nyob qhov twg lwm tus, kab row_ver tsis nyob hauv tus neeg txais qhov chaw. Hauv teb id tus cim qhov chaw yuav raug kaw. Yog li ntawd, nyob rau sab receiver tsis tas yuav ua kom nws pib-incrementing.

Tsis tas li ntawd, peb xav tau qhov chaw kom txuag tau qhov tseem ceeb 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
})

Rau txhua qhov chaw thauj khoom (thaj chaw space_name) peb yuav txuag tus nqi thauj khoom kawg ntawm no row_ver ( teb value). Cov kem ua raws li tus yuam sij tseem ceeb space_name.

Cia peb tsim ib txoj haujlwm los thauj cov ntaub ntawv chaw goods ntawm HTTP. Txhawm rau ua qhov no, peb xav tau lub tsev qiv ntawv uas siv HTTP tus neeg siv khoom. Cov kab hauv qab no thauj cov tsev qiv ntawv thiab instantiates HTTP neeg siv:

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

Peb kuj xav tau lub tsev qiv ntawv rau json deserialization:

local json = require('json')

Qhov no yog txaus los tsim cov ntaub ntawv loading muaj nuj nqi:

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

Txoj haujlwm ua tiav HTTP thov rau qhov chaw nyob url thiab xa nws row_ver raws li qhov parameter thiab xa rov qab cov txiaj ntsig deserialized ntawm qhov kev thov.

Lub luag haujlwm rau txuag tau txais cov ntaub ntawv zoo li no:

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

Lub voj voog ntawm kev txuag cov ntaub ntawv rau qhov chaw goods muab tso rau hauv kev sib pauv (cov haujlwm no yog siv rau qhov no box.atomic) txhawm rau txo tus naj npawb ntawm cov haujlwm disk.

Thaum kawg, lub zos qhov chaw synchronization muaj nuj nqi goods Nrog ib qhov chaw koj tuaj yeem siv nws zoo li no:

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

Ua ntej peb nyeem tus nqi khaws tseg yav dhau los row_ver rau qhov chaw goods. Yog tias nws ploj lawm (thawj zaug kev sib pauv), ces peb coj nws li row_ver xoom. Tom ntej no hauv lub voj voog peb ua ib nplooj ntawv-los-nplooj rub tawm ntawm cov ntaub ntawv hloov pauv los ntawm qhov chaw ntawm qhov teev url. Ntawm txhua qhov iteration, peb khaws cov ntaub ntawv tau txais mus rau qhov chaw tsim nyog hauv zos thiab hloov kho tus nqi row_ver (hauv qhov chaw row_ver thiab hauv qhov sib txawv row_ver) - coj tus nqi row_ver los ntawm kab kawg ntawm cov ntaub ntawv loaded.

Txhawm rau tiv thaiv kev sib tsoo looping (thaum muaj qhov yuam kev hauv qhov program), lub voj while tuaj yeem hloov tau for:

for _ = 1, max_req do ...

Raws li qhov tshwm sim ntawm kev ua haujlwm sync_goods qhov chaw goods tus txais yuav muaj qhov tseeb versions ntawm txhua qhov chaw cov ntaub ntawv goods hauv qhov chaw.

Obviously, cov ntaub ntawv rho tawm tsis tuaj yeem tshaj tawm hauv txoj kev no. Yog tias muaj qhov xav tau, koj tuaj yeem siv lub cim tshem tawm. Ntxiv rau qhov chaw goods boolean teb is_deleted thiab es tsis txhob ntawm lub cev rho tawm cov ntaub ntawv, peb siv cov laj thawj deletion - peb teeb tsa tus nqi teb is_deleted rau hauv lub ntsiab lus true. Qee zaum es tsis txhob boolean teb is_deleted nws yog qhov yooj yim dua los siv thaj chaw deleted, uas khaws cov hnub-lub sij hawm ntawm lub logic deletion ntawm cov ntaub ntawv. Tom qab ua tiav qhov kev tshem tawm, cov ntaub ntawv teev tseg rau kev tshem tawm yuav raug xa mus los ntawm qhov chaw mus rau qhov chaw (raws li lub logic tau tham saum toj no).

Ua Ciaj Ua Ke row_ver tuaj yeem siv los xa cov ntaub ntawv los ntawm lwm qhov chaw: tsis tas yuav tsim ib qho kev sib cais rau txhua qhov chaw sib kis.

Peb tau saib txoj hauv kev zoo ntawm cov ntaub ntawv qib siab rov ua dua hauv cov ntawv thov siv Tarantool DBMS.

tshawb pom

  1. Tarantool DBMS yog ib qho khoom txaus nyiam, cog lus rau kev tsim cov ntawv thov siab.
  2. High-level data replication muaj ib tug xov tooj ntawm qhov zoo tshaj qhov tsawg-theem replication.
  3. Txoj kev hloov pauv qib siab uas tau tham hauv tsab xov xwm tso cai rau koj kom txo qis cov ntaub ntawv hloov pauv los ntawm kev hloov pauv tsuas yog cov ntaub ntawv tau hloov pauv txij li kev sib pauv zaum kawg.

Tau qhov twg los: www.hab.com

Ntxiv ib saib