MongoDB连接字符串到副本集

Mar*_*ien 13 connection-string mongodb

我正在查看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) {

}
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*ght 27

连接字符串中的多个服务器充当用于发现连接模式的种子列表.你是正确的,你可以只指定主服务器,事情会完美.也就是说,直到主服务器出现故障或非常繁忙.通过在连接字符串中指定多台计算机,可以为客户端提供多个位置以查询副本集配置.

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

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

  • 根据我的经验,问题不是在"主要发生故障或非常繁忙"时,只是在连接字符串中指定当前主服务器的问题是在应用程序尝试构建时此单个服务器是否已关闭一个MongoClient.在我们所有的应用程序中,MongoClient只建立一次并由Singleton维护.当主要移动时,MongoClient会跟踪它.另一方面,我们总是指定副本集种子的整个集合来覆盖"应用程序重启"案例. (2认同)