我在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概念,因此当主服务器切换到副本集时不需要手动工作。
答案 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
根据应用程序的堆栈和驱动程序,您可能需要指定副本中的所有主机,以便自动选择主要用于写入。