我在群集中运行了两个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
你能帮我解决一下如何在片段上分发记录吗?
答案 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_*
函数;在脏活动中使用“裸”。