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

Raj*_*ish 30 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概念,因此当主服务器切换到副本集时不需要手动工作.

Rus*_*ore 29

显然,您应该能够使用"驱动程序"(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
}
Run Code Online (Sandbox Code Playgroud)

对于我的使用,重要的是不要连接到主要.与OP一样,我想缩小查找辅助成员所需的连接数.这个方法应该适合你,但这里的文档可能有点过时了.

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


Com*_*rch 12

rs.isMaster().primary

如果你进入一个衬里,可以使用任何mongo实例并运行该无赖


Chr*_*ald 11

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

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

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

rs.stepDown(60)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

要从命令行中找出当前主服务器的IP,请执行以下操作:

rs.status().members.find(r=>r.state===1).name
Run Code Online (Sandbox Code Playgroud)

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