21

我正在查看http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html并且当您滚动到“默认情况下不使用确认的副本集连接和次要的 readPreference”部分时

它声明了一个到副本集的连接字符串,如下所示:

MongoClient.connect("mongodb://localhost:30000,localhost:30001/integration_test_?w=0&readPreference=secondary", function(err, db) {

}

我不明白为什么我们需要指定2 hosts. 我认为 MongoDB 文档已经说明副本集对客户端是透明的。这意味着,客户端只需要连接到主副本集,MongoDB 就会完成这项工作。因此,连接应该只包含 1 个主机。MongoDB doc 声明必须至少3 hosts在一个副本集中并且仅指定此连接字符串2 hosts

另外,为什么连接字符串没有说​​明“replicaSet”?

4

2 回答 2

41

连接字符串中的多个服务器用作发现连接模式的种子列表。您是正确的,因为您可以只指定主服务器,一切都会完美运行。也就是说,直到主服务器出现故障或非常繁忙。通过在连接字符串中指定多台机器,您可以为客户端提供多个位置来查询副本集配置。

当连接模式解析为副本集时(见下文),驱动程序将找到主服务器,即使它不在种子列表中,只要种子列表中至少有一个服务器响应(响应将包含完整的副本集和当前主节点的名称)。此外,即使在初始连接之后,也会自动发现其他辅助节点并将其添加(或删除)到混合中。这将使您能够从副本集中添加和删除服务器,并且驱动程序将自动处理更改。

要回答您的最后一个问题,因为指定多个服务器对于它是副本集还是多个 mongo(在分片设置中)是模棱两可的,驱动程序将通过连接到服务器的发现阶段来确定它们的类型。这在连接时有一点开销,可以通过在连接字符串中指定连接模式来避免 - 因此是replicaSet关键字。因此,虽然没有必要,但它可以加快您的连接时间,以明确声明服务器位于连接字符串中的副本集中。

于 2014-05-30T17:01:33.547 回答
3

由于 MongoDB 3.6 可以使用DNS Seedlist Connection Format

例如,
mongodb+srv://server.example.com/可能会变成下面的连接字符串mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/?replicaSet=mySet&authSource=authDB

设置记录后,您可以轻松更改端口号而不会影响客户端,还可以添加和删除集群成员

于 2020-07-29T10:00:22.120 回答