mongoDb连接字符串中的+srv是什么意思

qojgxg4l  于 2023-02-07  发布在  Go
关注(0)|答案(4)|浏览(218)

我是MongoDB的新手,刚刚遇到两种类型的连接字符串。

  1. mongodb://[用户名:密码@]主机1 [:端口1][,主机2 [:端口2],...[,主机N [:端口N]]][/[数据库][?选项]]
  2. mongodb+srv://[用户名:密码@]主机[/[数据库][?选项]]
    我知道第一个。但是不熟悉第二个中的(+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的情况下,它抛出了一个错误。

osh3o9ms

osh3o9ms1#

如果您想知道如何自己获取详细信息,假设您的主机是foo.example.com

host -t SRV _mongodb._tcp.foo.example.com
host -t TXT foo.example.com
euoag5mw

euoag5mw2#

以上所有答案都在mongo conn字符串的上下文中正确指定了SRV和TXT记录!!只是想添加,如果我们需要查看这些SRV或TXT记录,我们可以使用以下命令(Windws 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 hostname字段有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

q3aa0525

q3aa05253#

在MongoDB3.6中引入了使用DNS记录指定的种子列表的概念,特别是SRVTXT记录。您还记得在MongoDB中使用副本集时,客户端必须指定至少一个副本集成员(并且可以指定其中的几个)。这样,即使客户端指定的某个节点不可用,客户端也可以连接到复本集
您可以在2.2.12或更高版本的连接字符串中看到此URL的示例

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

检查**Reference**

tvokkenx

tvokkenx4#

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

相关问题