【问题标题】:How to distribute the records over mnesia fragments?如何将记录分布在 mnesia 片段上?
【发布时间】:2017-01-14 17:37:12
【问题描述】:

我在集群中运行了两个 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

您能帮我如何将记录分布在片段上吗?

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    仅创建具有碎片属性的 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_*函数;在肮脏的活动中使用“裸露”的活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 2019-06-23
      • 2010-09-08
      • 1970-01-01
      • 2019-07-23
      • 2019-06-04
      • 2016-10-27
      • 2017-01-21
      相关资源
      最近更新 更多