我正在查看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台主机。我认为mongodb文档已经声明副本集对客户端是透明的。这意味着客户端只需要连接到主副本集,mongodb就可以完成这项工作。因此,连接应该只包含1个主机。 Mongodb doc声明副本集中必须至少有3个主机,并且此连接字符串仅指定了2个主机。
另外,为什么连接字符串没有说明“replicaSet”?
答案 0 :(得分:26)
连接字符串中的多个服务器充当用于发现连接模式的种子列表。你是正确的,你可以只指定主服务器,事情会完美。 即,直到主服务器出现故障或非常繁忙。通过在连接字符串中指定多台计算机,您可以为客户端提供多个位置来查询副本集配置。
当连接模式解析为副本集时(请参阅下面的详细信息),只要种子列表中至少有一个服务器响应,驱动程序就会找到主服务器,即使它不在种子列表中也是如此(响应将包含完整副本集和当前主副本的名称。此外,即使在初始连接之后,也会自动发现并添加(或删除)其他辅助节点。这将使您能够从副本集添加和删除服务器,驱动程序将自动处理更改。
要回答您的最后一个问题,因为指定多个服务器是不确定它是副本集还是多个mongos(在分片设置中),驱动程序将经历连接到服务器的发现阶段以确定他们的类型。这在连接时有一点开销,可以通过在连接字符串中指定连接模式来避免 - 因此replicaSet
关键字。因此,虽然没有必要,但它可以加快连接时间,以明确说明服务器位于连接字符串中的副本集中。
答案 1 :(得分:0)
从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。 Once your records are set up, you can easily change port numbers without impacting clients and also add and remove cluster members