MongoDB如何知道副本集中的主数据库服务器ip?

时间:2013-04-30 04:55:48

标签: mongodb

我在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 个答案:

答案 0 :(得分:28)

显然,你应该可以使用你的"驱动程序" (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/

答案 1 :(得分:11)

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

如果驱动程序失去与.100的连接,它将运行它已发现的其他种子并尝试查找连接。一旦它这样做,它将查询副本集,找出当前主人是谁,并连接到它。这一切都是透明的。

您可以登录主服务器并运行以下内容来测试:

rs.stepDown(60)

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

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

答案 2 :(得分:9)

rs.isMaster().primary

如果您使用一个衬垫,请使用任何mongo实例并运行该无赖

答案 3 :(得分:6)

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

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

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