在mongoDb连接字符串中,"+srv"是什么意思?

41

我对MongoDB还很新,刚刚遇到了两种连接字符串。

  1. mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

  2. mongodb+srv://[username:password@]host[/[database][?options]]

我知道第一个。但对于第二个中的(+srv)不熟悉。
   let connectionUrl;
      if (username && password)
        connectionUrl = `mongodb://${username}:${password}@${host}:${
          port || 27017
        }/${databaseName}`;
      else
        connectionUrl = `mongodb://${host}:${
          port || 27017
        }/${databaseName}`;
      console.log(connectionUrl, "connectionUrlconnectionUrl");
      let connection = await mongoose.createConnection(connectionUrl, {
        useNewUrlParser: true,
      });
      return connection;

现在问题是用户可以输入用户名、密码、主机名等等...
但是有没有办法知道何时添加(+srv),因为我尝试过使用localhost和MongoDB atlas。 Atlas与+srv一起正常工作,但在localhost的情况下,它会抛出错误。

1
请点击此处查看有关 MongoDB 或 MongoDB SRV 的讨论。 - dododo
请参阅连接字符串URI格式 - prasad_
4个回答

25
在MongoDB 3.6中引入了种子列表的概念,该列表是使用DNS记录指定的,具体包括SRVTXT记录。在使用MongoDB复制集时,您需要在连接时至少指定一个复制集成员(也可以指定多个)。这允许客户端连接到复制集,即使客户端指定的节点之一不可用。
您可以在2.2.12或更高版本的连接字符串上看到此URL的示例。

enter image description here

请注意,没有SRV记录配置,我们必须列出多个节点(在Atlas的情况下,我们始终包括所有集群成员,尽管这不是必需的)。我们还必须指定ssl和replicaSet选项。
使用3.4或更早版本的驱动程序,我们必须使用MongoDB URI语法在命令行上指定所有选项。
使用SRV记录消除了每个客户端传递完整集群状态信息的要求。相反,单个SRV记录标识与集群相关联的所有节点(及其端口号),并且关联的TXT记录定义URI的选项。

enter image description here

请查看参考资料


6
在MongoDB 3.6中,他们引入了使用DNS记录(特别是SRV和TXT记录)指定的种子列表的概念。
这使得客户端即使指定的节点之一不可用也能够连接到副本集。

5
如果你想知道如何自行获取详细信息,假设你的主机名是foo.example.com。
host -t SRV _mongodb._tcp.foo.example.com
host -t TXT foo.example.com

2

所有上述答案都正确地指定了mongo连接字符串中的SRV和TXT记录!! 只想补充一下,如果我们需要查看这些SRV或TXT记录,可以使用以下命令(我使用的是Windows cmd):

对于SRV记录:nslookup -q=SRV _mongodb._tcp.cluster0.9gztv.mongodb.net

以上命令将给出类似以下结果:

Non-authoritative answer:
_mongodb._tcp.cluster0.9gztv.mongodb.net        SRV service location:
          priority       = 0
          weight         = 0
          port           = 27017
          svr hostname   = cluster0-shard-00-00.9gztv.mongodb.net
_mongodb._tcp.cluster0.9gztv.mongodb.net        SRV service location:
          priority       = 0
          weight         = 0
          port           = 27017
          svr hostname   = cluster0-shard-00-01.9gztv.mongodb.net
_mongodb._tcp.cluster0.9gztv.mongodb.net        SRV service location:
          priority       = 0
          weight         = 0
          port           = 27017
          svr hostname   = cluster0-shard-00-02.9gztv.mongodb.net

你可以看到svr主机名字段有3个不同的服务器名称,它们是副本集的一部分。重要的是在前面添加_mongodb._tcp作为前缀。

类似地,nslookup -q=TXT cluster0.9gztv.mongodb.net 将给出以下结果。

Non-authoritative answer:
cluster0.9gztv.mongodb.net      text =

        "authSource=admin&replicaSet=atlas-uovfn7-shard-0"

因此,驱动程序会查询连接字符串中主机名的SRV记录和TXT记录,并将它们组合起来以连接到集群。

http://pauldone.blogspot.com/2019/12/tips-for-atlas-connectivity.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接