如何在mnesia片段上分发记录?

时间:2016-09-07 06:47:45

标签: erlang mnesia

我在群集中运行了两个erlang MNESIA节点。

我已通过以下属性创建了表格。

mnesia:create_table(vmq_offline_store,[
                {frag_properties,[
                    {node_pool,[node()|nodes()]},
                    {hash_module,verneDB_frag_hash},
                    {n_fragments,8},
                    {n_disc_only_copies,length([node()|nodes()])}]
                },
                {index,[]},{type, bag},
                {attributes,record_info(fields,vmq_offline_store)}]).

我可以看到在两个erlang节点上创建的所有8个片段。

在此之后,我使用来自外部节点的RPC调用将50000条记录插入到表中。这些50000条记录仅插入到vmq_offline_store中。没有分发在所有碎片上。

vmq_offline_store: with 50000    records occupying 2096701142 bytes on disc
vmq_offline_store_frag2: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag3: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag4: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag5: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag6: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag7: with 0        records occupying 5464     bytes on disc
vmq_offline_store_frag8: with 0        records occupying 5464     bytes on disc

你能帮我解决一下如何在片段上分发记录吗?

1 个答案:

答案 0 :(得分:0)

使用碎片属性创建Mnesia表是不够的。每个表操作都必须为分段表mnesia_frag显式指定“访问模块”。这是通过调用函数mnesia:activity/4来完成的,而不是调用mnesia:transaction/1或使用脏操作。

例如,此代码:

Fun = fun() -> ... end,
{atomic, Result} = mnesia:transaction(Fun),

变为:

Fun = fun() -> ... end,
Result = mnesia:activity(transaction, Fun, [], mnesia_frag),

(请注意,错误mnesia:activity表示错误而不是返回{aborted, Reason}。)

对于脏操作,代码如下:

mnesia:dirty_write(MyRecord)

变为:

mnesia:activity(sync_dirty, mnesia, write, [MyRecord], mnesia_frag)

或者:

mnesia:activity(sync_dirty, fun() -> mnesia:write(MyRecord) end, [],
                mnesia_frag)

也就是说,从不使用mnesia:dirty_*函数;在脏活动中使用“裸”。