【问题标题】:How to Convert secondary Node to primary if maximum of node down in a replica set?如果副本集中的最大节点数关闭,如何将辅助节点转换为主节点?
【发布时间】:2018-11-21 21:35:59
【问题描述】:

我正在使用带有副本集的 mongodb,它有 3 个节点,它们的 ip 分别是 192.168.1.100 、 192.168.1.101,192.168.1.102 。

在我当前的设置中, 192.168.1.100 是主要的,其他是次要的。我已将 192.168.1.100 和 192.168.1.101 的优先级设置为 1 ,而 192.168.1.102 的优先级为 0 ,现在经过一段时间后,我的 192.168.1.100 和 192.168 。 1.101 两个节点都挂了。

我想强制 192.168.1.102 成为主要的,以便我的应用程序能够运行。 他们是否有任何方式强制将 192.168.1.102 节点转换为主节点。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以通过以下步骤在不重启 mongod 服务的情况下实现它-

    连接到活动成员假设它在 localhost 上的 27017 端口上运行:

    mongo --port 27017
    

    从这里获取您的会员 ID-

    > use admin
    > rs.status()
    

    假设您的活动成员 ID 为 1。然后按照以下步骤重新配置您的复制-

    > cfg = rs.conf()
    > cfg.members = [cfg.members[1]]
    > rs.reconfig(cfg, {force : true})
    

    它将使您的活跃成员成为主要的并且可以申请和写入。

    【讨论】:

    • 有什么办法可以自动完成吗?如果这种情况发生在午夜,则需要有人在午夜有空运行此命令
    • 对我来说 cfg.members[1] 不起作用,但 cfg.members[0] 起作用了。
    • 首先,您需要通过以下命令获取此 id 0、1 或其他:rs.status(),如我的回答中所述。
    • 我对这个解决方案并不满意,因为它只是破坏了集群配置,并且当 2 个丢失的节点再次启动时,它们不会重新集成集群。是不是可以只更改剩余成员的优先级?
    【解决方案2】:

    当大多数成员无法访问时,您可以按照here 的步骤重新配置副本集。

    由于副本集中只剩下一个节点,因此不会复制您的数据。最好在这两个节点存活后将它们添加回来。

    【讨论】:

      【解决方案3】:

      我通过以下方式解决了我的问题:

      连接到幸存的成员并保存当前配置。考虑以下用于保存配置的示例命令:

      cfg = rs.conf()
      printjson(cfg)
      

      在同一个成员上,通过将数组设置为仅与幸存成员相等,从成员数组中删除副本集的故障和无法访问的成员。

      让我们只剩下一个成员

      # Don't c/p if you have more than 1 node in your replica set
      cfg.members = [cfg.members[0]] 
      

      member[0] 是数组中第一个在 rs.conf() 中获得的成员 使用设置为 true 的 force 选项重新配置集合:

      rs.reconfig(cfg, {force : true})
      

      现在您可以看到幸存的成员现在是 PRIMARY。 来源:https://docs.mongodb.com/v3.4/tutorial/reconfigure-replica-set-with-unavailable-members/

      【讨论】:

      • 谢谢,这对我来说就像魅力一样。我在集群中剩下 2 个成员,而且都是次要的。我能够按照您的指示标记一个主节点。
      【解决方案4】:

      解决这种情况的解决方案是,如果副本集中只剩下一个节点并且该节点是辅助节点(优先级为 0),则首先关闭节点从副本集中提取节点(通过 mongod.conf 中的注释 repliSet 行或者启动 mongo 去 mongo 命令行,使用 system.replset 中的本地修改记录并删除记录),然后将节点作为独立的 mongodb 启动 :)

      【讨论】:

        【解决方案5】:

        在这种情况下,并非没有人工干预。你还会遇到另一个问题。该集合的大部分将处于离线状态,这意味着即使没有优先级 0,您剩余的副本成员也不会成为主要成员。

        相反,您必须做的是要么恢复大部分集合,要么您必须运行 rs.reconfig() 删除集合中的两个死成员。

        您可以在此处找到示例等:http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/

        【讨论】:

        • 大家好,感谢您的回复,我做了给定 URL 中提到的所有步骤。以下是我运行查询时的错误:cfg.members=[cfg.member[0]] Thu 5 月 2 日 16:52:46.168 JavaScript 执行失败:TypeError: Cannot read property '0' of undefined rs.reconfig(cfg,{force:true}) { "errmsg" : "exception: 必须启动和重新配置副本集发送到可以成为主节点的节点", "code" : 13420, "ok" : 0 }
        • @user2334519 当您发送配置对象时,它是什么样的?我想可能是cfg.members=[cfg.member[0]] 应该是cfg.members=[cfg.members[0]]
        • 见下面的错误,mongoreplset1:SECONDARY> cfg = rs.conf() mongoreplset1:SECONDARY> printjson(cfg) mongoreplset1:SECONDARY> cfg.members = [cfg.members[0]] [ { “_id”:0,“主机”:“192.168.1.197:27017”,“优先级”:0 }] mongoreplset1:SECONDARY> rs.reconfig(cfg,{force:true}){“errmsg”:“异常:启动并且必须将副本集的重新配置发送到可以成为主节点的节点", "code" : 13420, "ok" : 0 }
        • @user2334519 是的,你还得再做一步,把它的优先级设置为1
        • 如果 ReplicaSet 中只剩下一个节点(即优先级为 0 的 SECONDARY NODE)并且它们没有固定的时间 PRimary 或其他成员上线,那么只有一种方式可以遵循我们的应用程序/站点是从副本集提取节点并将其作为独立服务器,非破坏性方式:)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 2017-12-09
        • 2013-08-13
        • 2023-04-01
        • 2021-06-08
        • 1970-01-01
        • 2020-07-17
        相关资源
        最近更新 更多