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

Posted

技术标签:

【中文标题】在一个 mnesia 集群中,查询哪个节点?【英文标题】:In a mnesia cluster, which node is queried? 【发布时间】:2010-10-17 21:13:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

如果你需要更多的东西,你要么需要一些算法来决定要查询哪个节点,或者甚至复制节点 C 上的表(这通常取决于你想要/需要什么样的特征) .

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

【讨论】:

检查我编辑的帖子,我不确定这将如何适用于我的要求。我可以在没有位置规范的情况下对节点 C 进行查询,那么它如何选择使用哪个表副本? 没有得到节点实际上在它的模式中有表。对不起,我的错!【参考方案2】:

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

Dan Gudmundsson pointed outmnesia_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,它将项目添加为列表的首位。

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

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

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

【讨论】:

这是否意味着,mnesia 可能不会在本地读取,并且会有一些繁忙的节点? 我很喜欢这个答案igorrs.blogspot.com/2010/05/mnesia-one-year-later.html,真是一个惊喜……

以上是关于在一个 mnesia 集群中,查询哪个节点?的主要内容,如果未能解决你的问题,请参考以下文章

从 mnesia 集群中移除 not_exist_already 节点(方案)

如何将节点添加到 mnesia 集群?

集群中一个 Mnesia Master Node 的意义是啥

ejabberd 节点的集群如何工作?

redis 集群

redis 集群