Пространство, доступное на всех узлах Tarantool (vshard)

#tarantool

#tarantool

Вопрос:

Я использую Tarantool с модулем vshard. Когда установлен bucket_id, данные распределяются по кластеру. Каждый узел имеет свой собственный набор bucket_ids. Как создать пространство, чтобы оно было полностью доступно на каждом узле (словаре)?

Ответ №1:

Я использую следующий фрагмент для запуска функции во всех хранилищах (может быть, есть лучший способ).

Предположим, у нас есть функция для хранилищ:

 local function putMyData(rows)
    box.atomic(function()
        for _, row in ipairs(rows)
            box.mySpace:put(row)
        end
    end)
end

box.schema.func.create("putMyData", { if_not_exists = true })
box.schema.role.grant("public", "execute", "function", "putMyData", { if_not_exists = true })
rawset(_G, "putMyData", putMyData)

  

Затем для вызова функции может использоваться следующий помощник:

 local function callAll(mode, fnName, args, resHandler, timeoutSec)
    local replicaSets, err = vshard.router.routeall()
    if err ~= nil then
        error(err)
    end

    local count = 0
    for _, _ in pairs(replicaSets) do
        count = count   1
    end

    local channel = fiber.channel(count)

    local method
    if mode == "read" then
        method = "callbro"
    else
        method = "callrw"
    end

    for _, replicaSet in pairs(replicaSets) do
        fiber.create(
            function()
                local res, fErr = replicaSet[method](replicaSet,
                    fnName, args, { timeout = timeoutSec or opts.timeout })
                channel:put({ res = res, err = fErr })
            end)
    end

    local results = { }

    for i = 1, count do
        local val = channel:get()
        if val.err ~= nil then
            error(val.err)
        end

        if resHandler == nil then
            results[i] = val.res
        else
            resHandler(val.res, results)
        end
    end

    return results
end