【问题标题】:MongoDB How to know Primary DB server ip in a replica set?MongoDB 如何知道副本集中的主数据库服务器 ip?
【发布时间】:2013-04-30 04:55:47
【问题描述】:

我在 3 个节点上运行 mongodb 副本集,让他们的 ip 为 192.168.1.100 、 192.168.1.101,192.168.1.102

现在在当前的副本集中 192.168.1.100 是主要的,192.168.1.101 和 192.168.1.102 是次要的,我的应用程序连接到 192.168.1.100 进行写入操作。现在 2 天后 192.168.1.100 关闭并且 mongodb select 192.168.1.101作为初级。我的应用程序如何知道 192.168.1.101 是主要的。

他们是 mongodb 中的任何浮动 ip 概念,因此当主服务器切换到副本集时不需要手动工作。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    显然,您应该能够使用您的“驱动程序”(mongo cli 工具或您的首选语言绑定,例如 node-mongo)连接到副本集的任何成员。连接后,只需询问当前 mongod 为集合的其他成员服务:

    > db.runCommand("ismaster")
    {
         "ismaster" : false,
         "secondary" : true,
         "hosts" : [
                 "ny1.acme.com",
                 "ny2.acme.com",
                 "sf1.acme.com"
         ],
         "passives" : [
              "ny3.acme.com",
              "sf3.acme.com"
         ],
         "arbiters" : [
             "sf2.acme.com",
         ]
         "primary" : "ny2.acme.com",
         "ok" : true
    }
    

    对于我来说,重要的是不要连接到主节点。与 OP 一样,我想尽量减少查找次要成员所需的连接数。这种方法应该适合你,但这里的文档可能有点过时了。

    http://docs.mongodb.org/meta-driver/latest/legacy/connect-driver-to-replica-set/

    【讨论】:

      【解决方案2】:

      rs.isMaster().primary

      如果您喜欢一个班轮,请访问任何一个 mongo 实例并运行该流氓

      【讨论】:

        【解决方案3】:

        当您的客户端连接到副本集中的任何给定成员(“种子”)时,它会在副本集中查询该副本集中的其他成员。因此,如果您连接到 .100,它将查询该集合并发现 .101 和 .102 也是该集合的有效成员。

        如果驱动程序失去与 .100 的连接,它将遍历它发现的其他种子并尝试找到连接。一旦完成,它将查询副本集,找出当前主节点是谁,并连接到它。这一切都是透明地发生的。

        您可以通过登录主服务器并运行以下命令来测试:

        rs.stepDown(60)
        

        这将导致该机器作为主节点退出(并导致选出一个新的主节点)。它将在 60 秒内没有资格连任。您可以使用它来测试您的应用在主节点更改的情况下的行为。

        当您设置副本集连接时,您通常会指定要连接的多个主机。这些都作为驱动程序用于映射副本集的种子,因此在您配置的单个主机关闭时重新启动应用程序时,您不会出现单点故障。不过,具体情况取决于您使用的驱动程序 - 请查看您的驱动程序文档。

        【讨论】:

        • 大家好,如何使用 mongo 命令行测试这些东西。我想使用 mongo 命令行测试这个,有什么方法可以使用 mongo 命令行连接副本集。
        • 如果您使用命令行,请确保使用副本集连接进行连接,例如。 mongo "replSetName/member1:27017,member2:27017,member3:27017".
        【解决方案4】:

        要从命令行运行找出当前主服务器的 IP:

        rs.status().members.find(r=>r.state===1).name
        

        根据您的应用程序的堆栈和驱动程序,您可能需要指定副本中的所有主机,以便它自动选择主要进行写入。

        【讨论】:

          猜你喜欢
          • 2021-08-04
          • 1970-01-01
          • 2015-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-03
          • 1970-01-01
          • 2021-04-20
          相关资源
          最近更新 更多