MongoDB如何知道复制集中的主数据库服务器ip



我在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概念,因此当主服务器在副本集中切换时不需要手动操作。

显然,您应该能够使用您的"驱动程序"(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/

rs.isMaster().primary

如果您使用的是单行程序,请打开任意mongo实例并运行

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

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

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

rs.stepDown(60)

这将导致该机器退出主服务器(并导致选举新的主服务器)。在60秒内将没有资格再次竞选。你可以用它来测试主节点发生变化时应用的行为。

当你建立一个复制集连接时,你通常会指定多个主机来连接。这些都可以作为驱动程序用来映射副本集的种子,这样在您重新启动应用程序时,当您配置的单个主机关闭时,就不会出现单点故障。这将取决于您使用的驱动程序的细节,不过-检查您的驱动程序的文档。

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

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

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

我知道这是一篇很老的文章,自从它发布以来,事情可能已经发生了变化。正确的URI难道不能做到这一点吗?我的意思是,如果你在URI中指明所有节点和复制集名称,你不是每次都能连接到主节点吗?

https://www.mongodb.com/docs/manual/reference/connection-string/std-label-connections-connection-examples

有一个readPreference选项用于复制集uri,如果没有指定,则默认为primary。

最新更新