#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