Mnesia:以{local_content,true}模式读取远程节点数据

时间:2010-03-04 10:04:34

标签: erlang mnesia

是否有办法使用mnesia进行本地写入和全局读取(复制)。例如:节点A写入其本地DB,节点B从节点A的DB读取。 除了本地存储的架构信息之外,节点B没有自己的任何数据。

根据文档,{local_content, true}似乎是我需要使用的,但是我试图让节点B读取节点A的数据是不成功的。

我的架构和表格配置如下所示:

在nodeA @ ip1上:

    net_adm:ping('nodeB@ip2').
    rd(user, {name, nick}).
    mnesia:create_schema([node()|nodes()]).
    mnesia:start().
    mnesia:create_table(user, [ {local_content, true}, 
                                {disc_copies, [node()]}, 
                                {attributes,record_info(fields, user) }]).

%% insert data and list rows on nodeA 
%% WORKS

在nodeB @ ip2上:

    mnesia:start().
    %% code to list rows from user table on nodeA 
    %% throws an ERROR saying table does not exist.

配置是否错误或是否可以通过其他方式完成?

2 个答案:

答案 0 :(得分:1)

我认为你不能像你提到的那样去做。另一种方法可能是对节点A进行rpc调用并以这种方式获取数据。使用mnesia从节点B读取是没有意义的,因为它基本上只会执行RPC。

所以节点B应该是:

rpc:call(nodeA@ip1, mnesia, read, ....).

希望这是你[有点]需要的。

编辑: 哦,我忘了提到你不需要两个节点上的架构来实现这一点。这假设节点B并不真正关心与节点A共享任何其他数据它只是读取它;换句话说,只需在节点A上保留所有mnesia内容,然后从Node B进行RPC调用。

答案 1 :(得分:0)

您可能需要将节点B添加到架构的extra_db_nodes config thingy中。如果它是基于光盘的数据库,你不应该这样做,但是在RAM中必须使它做你想做的事。

不确定具体细节,我可能会混淆在哪里放东西。我对mnesia不太熟悉,但文档表明你应该这样做。