当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在mnesia集群中,查询哪个节点?》经验,为你挑选了1个好方法。

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



1> gleber..:

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

正如Dan Gudmundsson在邮件列表中指出的那样,选择要查询的远程节点的算法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.

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

    第一个非disc_only_copies

    任何可用节点

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

列表active_replicas是通过mnesia_controller:add_active_replica/*从新连接的节点到旧节点(即之前在集群中的节点)的远程调用形成的,其归结为add/1将项目添加为列表的头部的功能.

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

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

[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ]. 

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有