45

我在 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 选择 192.168.1.101 作为主要。我的应用程序如何知道 192.168.1.101 是主要的。

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

4

4 回答 4

36

显然,您应该能够使用您的“驱动程序”(mongo cli 工具或您的首选语言绑定,ex 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/

于 2015-01-23T23:35:21.020 回答
22

rs.isMaster().primary

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

于 2018-02-13T17:11:34.063 回答
14

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

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

您可以通过登录到 master 并运行以下命令来测试它:

rs.stepDown(60)

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

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

于 2013-04-30T05:20:18.393 回答
14

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

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

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

于 2016-08-09T03:53:29.027 回答