【问题标题】:ejabberd clustering, Slave doesn't work when master goes downejabberd集群,当master宕机时,Slave不起作用
【发布时间】:2016-04-15 09:11:55
【问题描述】:

我已经设置了 ejabberd 集群,一个是主机,另一个是从机,如 here 所述。

我已将 .erlang.cookie 和数据库文件从主机复制到从机。 一切正常。
问题是当我停止主节点时:

  1. 然后没有请求被路由到从站。
  2. 尝试重新启动从节点时,它一旦关闭就无法启动。

我在这里卡住了,请帮帮我。 谢谢

【问题讨论】:

    标签: erlang ejabberd mnesia


    【解决方案1】:

    这是 Mnesia 的标准行为。如果您启动的节点不是集群中最后一个停止的节点,那么它就无法知道它是否拥有最新、最新的数据。

    启动 Mnesia 集群的过程是按照与关闭节点相反的顺序启动节点。

    如果最后出现在 Mnesia 集群上的节点无法启动或加入集群,您需要使用 Mnesia 命令强制集群“master”,即告诉它您认为该节点拥有最多迄今为止的内容。这是通过使用 Erlang 命令mnesia:set_master_nodes/1 完成的。

    例如,从 ejabberd Erlang 命令行:

    mnesia:set_master_nodes([node1@myhost]).
    

    在大多数情况下,Mnesia 集群会自动处理所有事情。当一个节点出现故障时,其他节点会意识到并自动继续透明地工作。您需要将哪个节点设置为参考数据(使用set_master_nodes/1)的唯一情况是,当这对 Mnesia 来说不明确时,即仅启动仍在运行的节点时关闭的节点或存在 netsplit 时.

    【讨论】:

    • 谢谢迈克尔,但是当主从都同时运行并且主服务器宕机时会发生什么。在这种情况下,奴隶应该可以正常工作吗?
    • 是的,这就是集群的目的。 Mnesia 是多主控。没有真正的master,但它需要保护数据的一致性,并确保它不会破坏数据。当一个节点宕机时,其余节点不存在一致性问题。
    • 谢谢 Mickael,明白了。当一个节点宕机时,剩余节点需要设置为主节点,因为剩余节点不存在一致性问题。它将独立工作。
    • 不,剩余节点不需要手动设置为主节点。这由 Erlang / Mnesia 自动处理。唯一需要手动设置 master 的情况是,对于哪个节点作为参考数据存在歧义。
    • 前面有负载均衡器吗?当然,您需要正确路由流量。再说一遍:ejabberd 中没有主/从概念。 Mnesia 和这个 ejabberd 是多位大师。
    【解决方案2】:

    按照以下链接中的步骤操作: http://chadillac.tumblr.com/post/35967173942/easy-ejabberd-clustering-guide-mnesia-mysql 并调用easy_cluster模块的join_as_master(NodeName)方法。

    【讨论】:

    • 小心。强制主数据集时,你必须确定你做了什么,否则会导致数据丢失。
    • 好的,我使用了这个命令。 mnesia:set_master_nodes([node1@myhost])。非常感谢
    猜你喜欢
    • 2020-10-08
    • 2012-08-11
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多