代码之家  ›  专栏  ›  技术社区  ›  ryeguy

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

  •  13
  • ryeguy  · 技术社区  · 16 年前

    假设您在节点A和B上复制了一个mnesia表。如果在不包含表副本的节点C上,我会这样做。 mnesia:change_config(extra_db_nodes, [NodeA, NodeB]) ,然后在节点C上 mnesia:dirty_read(user, bob) 节点C如何选择要对哪个节点执行查询的表副本?

    2 回复  |  直到 16 年前
        1
  •  14
  •   Andrew    16 年前

    根据我自己的研究,这个问题的答案是——它会选择 最近连接的节点 . 我将感谢指出错误,如果发现-记忆是一个真正复杂的系统!

    AS Dan Gudmundsson pointed out 在邮件列表中定义了选择要查询的远程节点的算法。 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.
    

    因此,它获取活动的复制副本列表(即候选列表),可以选择将列表缩小到表的主节点,删除要忽略的表(出于任何原因),将列表缩小到当前连接的节点,然后按以下顺序选择:

    1. 第一非 disc_only_copies
    2. 任何可用节点

    最重要的部分实际上是 active_replicas ,因为它决定了候选列表中节点的顺序。

    名单 活性复制品 是由远程调用 mnesia_controller:add_active_replica/* 从新连接的节点到旧节点(即以前在集群中的节点),这归结为函数 add/1 它将项目添加为列表的标题。

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

    笔记: 要查看给定节点上的活动副本列表,可以使用以下(脏黑客)代码:

    [ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ]. 
    
        2
  •  -1
  •   Adam Lindberg    16 年前

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

    如果您需要比这个更多的东西,您要么需要一些算法来决定查询哪个节点,要么甚至在节点C上复制表(这通常取决于您想要/需要什么类型的特性)。

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

    推荐文章