Erlang 在mnesia集群中,查询哪个节点?

Erlang 在mnesia集群中,查询哪个节点?,erlang,mnesia,Erlang,Mnesia,假设在节点a和B上复制了一个mnesia表。如果在节点C上不包含该表的副本,我会mnesia:change\u config(extra\u db\u nodes,[NodeA,NodeB]),然后在节点C上我会mnesia:dirty\u read(user,bob)节点C如何选择要对哪个节点的表副本执行查询?,节点C需要联系节点A或节点B以执行查询。因此,节点C必须自行决定在哪个表副本上执行查询 如果您需要比这更多的东西,您可能需要使用某种算法来决定查询哪个节点,或者甚至在节点C上复制表(这

假设在节点a和B上复制了一个mnesia表。如果在节点C上不包含该表的副本,我会
mnesia:change\u config(extra\u db\u nodes,[NodeA,NodeB])
,然后在节点C上我会
mnesia:dirty\u read(user,bob)
节点C如何选择要对哪个节点的表副本执行查询?

,节点C需要联系节点A或节点B以执行查询。因此,节点C必须自行决定在哪个表副本上执行查询

如果您需要比这更多的东西,您可能需要使用某种算法来决定查询哪个节点,或者甚至在节点C上复制表(这通常取决于您想要/需要什么样的特征)


如果节点A和节点B构成或是数据库集群的一部分,一个好的开始可能是循环算法(或随机算法,如您所建议)。

根据我自己的研究,问题的答案是-它将选择最近连接的节点。如果我发现了错误,我将非常感激——记忆是一个非常复杂的系统

与邮件列表一样,选择要查询的远程节点的算法在
mnesia_lib:set_remote_where_to_read/2
中定义。它如下

set_remote_where_to_read(Tab, Ignore) ->
    Active = val({Tab, active_replicas}),
    Valid =
       case mnesia_recover:get_master_nodes(Tab) of
           [] ->  Active;
           Masters -> mnesia_lib:intersect(Masters, Active)
       end,
    Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore),
    DiscOnlyC = val({Tab, disc_only_copies}),
    Prefered  = Available -- DiscOnlyC,
    if
       Prefered /= [] ->
           set({Tab, where_to_read}, hd(Prefered));
       Available /= [] ->
           set({Tab, where_to_read}, hd(Available));
       true ->
           set({Tab, where_to_read}, nowhere)
    end.
因此,它会获取活动副本列表(即候选列表),可以选择将列表收缩到表的主节点,删除要忽略的表(出于任何原因),将列表收缩到当前连接的节点,然后按以下顺序选择:

  • 第一张非
    光盘\u仅\u拷贝
  • 任何可用节点
  • 实际上,最重要的部分是
    活动\u副本的列表,因为它决定了候选列表中节点的顺序

    active\u replica
    列表是通过远程调用
    mnesia\u controller:add\u active\u replica/*
    从新连接的节点添加到旧节点(即以前在集群中的节点)而形成的,该列表归结为函数
    add/1
    ,该函数将该项添加为列表的标题

    因此,问题的答案是-它将选择最近连接的节点

    注: 要查看给定节点上的活动副本列表,可以使用以下(恶意攻击)代码:


    查看我编辑的帖子,我不确定这将如何应用于我的问题。我可以在没有位置说明的情况下对节点C进行查询,那么它如何选择要使用的表副本?没有发现节点的架构中确实有表。对不起,我的错!这是否意味着mnesia可能没有本地读取,并且将有一些繁忙的节点?我喜欢答案是,这真是一个惊喜。。。
    
    [ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ].