Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
到副本集的MongoDB连接字符串_Mongodb_Connection String_Replicaset - Fatal编程技术网

到副本集的MongoDB连接字符串

到副本集的MongoDB连接字符串,mongodb,connection-string,replicaset,Mongodb,Connection String,Replicaset,我正在查看,当您滚动到“默认情况下不使用确认的replicaset connect和readPreference for secondary”部分时 它向副本集声明了一个连接字符串,如下所示: MongoClient.connect("mongodb://localhost:30000,localhost:30001/integration_test_?w=0&readPreference=secondary", function(err, db) { } 我不明

我正在查看,当您滚动到“默认情况下不使用确认的replicaset connect和readPreference for secondary”部分时

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

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

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


此外,为什么连接字符串没有声明“replicaSet”?

连接字符串中的多个服务器用作查找连接模式的种子列表。您是正确的,您可以只指定主服务器,一切都会很好地工作也就是说,直到主服务器停机或非常繁忙。通过在连接字符串中指定多台计算机,可以为客户端提供多个位置来查询副本集配置

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


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

因为MongoDB 3.6可以使用

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


根据我的经验,问题不在于“主服务器宕机或非常忙”,而在于仅在连接字符串中指定当前主服务器的问题在于,在您的应用程序尝试构建MongoClient时,这台服务器是否宕机。在我们所有的应用程序中,MongoClient只建立一次,并由一个单例维护。当主服务器移动时,MongoClient会跟踪它。另一方面,我们总是指定整个副本集种子集合来覆盖“应用程序重新启动”的情况。仲裁器如何?如果我有5台MongoDB服务器,其中一台是仲裁器,那么该仲裁器应该在MongoClient连接字符串的服务器列表中吗?仲裁器不存储任何数据,因此它不能为任何数据提供服务,并且永远不能成为主仲裁器。但它应该知道哪台服务器是主服务器。您在连接字符串中指定了多台主机,以涵盖Mongo主服务器在物理mongod来去时移动的情况(服务器停机、网络路径使其不可用等)。您在此处向MongoClient提供的信息越多,它就越能克服复制集在没有其所有成员的情况下运行的边缘情况。要确认
mongodb1.example.com
是机器的主机名,对吗?它只是与DNS SRV记录相对应的主机名。您应该为节点设置DNS名称(例如在AWS Route 53中)。例如,这里有一个MongoDB Atlas连接字符串:
MongoDB+srv://:@cluster0.q3qpe.MongoDB.net/myFirstDatabase?retryWrites=true&w=maist
这三个节点:
cluster0-shard-00-01.q3qpe.MongoDB.net:27017
cluster0-shard-00-00.q3qpe.MongoDB.net:27017
cluster0-shard-00-02.q3qpe.mongodb.net:27017