2016-09-07 9 views
0

私はクラスタ内で2つのerlang MNESIAノードを実行しています。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)}]). 

2つの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

フラグメンテーションプロパティを持つMnesiaテーブルを作成するだけでは不十分です。すべてのテーブル操作では、フラグメント化されたテーブルのアクセスモジュールを明示的に指定する必要があります。mnesia_fragこれは、mnesia:transaction/1を呼び出すか、ダーティ操作を使用する代わりに、関数mnesia:activity/4を呼び出すことによって行われます。例えば、このコード

を:

​​

は次のようになる。ダーティ操作について

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

(代わり{aborted, Reason}を返すエラーを通知mnesia:activityエラーであることに注意してください。)

、コードこのように:

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_*機能を使用しません。汚れた活動の中で「裸の」ものを使用してください。

関連する問題