【发布时间】:2020-05-30 09:06:17
【问题描述】:
我有几个副本集的集群。我想在所有节点上调用一些存储函数而不计算bucket_id,然后映射结果。我该怎么做?
【问题讨论】:
我有几个副本集的集群。我想在所有节点上调用一些存储函数而不计算bucket_id,然后映射结果。我该怎么做?
【问题讨论】:
您可以使用模块cartridge.rpc 函数get_candidates 来获取所有具有某些角色的节点,然后使用模块cartridge.pool 函数map_call 来调用您的函数和映射结果。此功能适用于 1.2.0-17 版本的墨盒。所以你的代码可能是这样的:
local cartridge = require('cartridge')
local nodes = cartridge.rpc_get_candidates('my_role_name', { leaders_only = true, healthy_only = true })
local pool = require('cartridge.pool')
local results, err = pool.map_call('_G.my_function_name', { func_args }, { uri_list = nodes, timeout = 10 })
if (err ~= nil) then
#your error handling#
end
所有函数响应将保存到results 变量并映射到每个 URI。所有错误都将保存到err 变量中作为映射键:line、class_name、err、file、suberrors、str
【讨论】:
另一个提议。
如果您使用 vshard 并希望对存储执行 map-reduce:
local replicaset, err = vshard.router.routeall()
for _, replica in pairs(replicaset) do
local _, err = replica:callrw('function', { args })
if err ~= nil then
return nil, err
end
end
【讨论】: