Docs 菜单
Docs 主页
/
MongoDB 阿特拉斯
/

解决连接问题

在此页面上

  • 集群 Connect 按钮已禁用
  • 连接 IP 地址不在 IP 访问列表中
  • 集群身份验证失败
  • 集群的打开连接过多
  • 在连接计数达到高峰期间,分片集群的性能会下降
  • 尝试从防火墙后面进行连接
  • 集群可用性
  • MongoDB Compass 故障排除
  • 连接字符串问题

本页概述了常见连接问题和可能的解决方案。

要了解有关连接到 Atlas 集群的更多信息,请参阅 Atlas 入门教程。

注意

如果您是寻求支持的企业客户,提交支持工单。如需获取社区支持,请访问 MongoDB Community 资源。

注意

无服务器实例目前不支持通过某些驱动程序或驱动程序版本进行连接。要了解详情,请参阅无服务器实例限制

如果您的集群处于预配状态,则集群的 Connect 按钮可能会被禁用。您的集群需要在首次部署时进行预配。当您向上或向下扩展集群时,集群也必须进行预配。预配过程最多可能需要 10 分钟,之后 Connect 按钮将变为启用状态。

在连接到 Atlas 集群之前,请检查是否已将主机的 IP 地址添加到集群项目的IP 访问列表中。 Atlas 仅允许来自 IP 访问列表中的 IP 地址和 CIDR地址范围的客户端连接。

要连接到 Atlas,您必须通过 MongoDB 数据库用户进行身份验证。要为集群创建数据库用户,请参阅配置数据库用户。

如果您已创建用户但在进行身份验证时出现问题,请尝试执行以下操作:

  • 检查是否为数据库用户使用了正确的用户名和密码,以及是否连接到正确的集群。

  • 检查您是否在连接字符串中指定了正确的 authSource 数据库。

  • 如果密码中有特殊字符,请参阅连接字符串密码中的特殊字符

Atlas 为集群的并发传入连接设置限制。对于集群,这基于集群层。如果您在达到此限制时尝试连接,则 MongoDB 将显示一条错误,指示 connection refused because too many open connections

有关集群层及其最大并发连接数的详细比较,请参阅连接限制和集群层

  • 关闭与当前未使用的集群的任何打开连接。

  • 将集群扩展到更高层级,以支持更多并发连接。

  • 重新启动您的应用程序。

  • 为避免今后出现此问题,请考虑使用 maxPoolSize 连接字符串选项来限制连接池中的连接数。

要了解如何修复此问题,请参阅修复连接问题

Atlas 可以使用专用端点服务的负载均衡器为分片集群生成优化的 SRV 连接字符串。当您使用优化的连接字符串时,Atlas 会限制应用程序与集群之间每个 mongos 的连接数。每个 mongos 的受限连接数可提高连接计数高峰期间的性能。

注意

Atlas 不支持在 Google Cloud 或 Azure 上运行的集群的优化连接字符串。

要了解有关为私有端点后的分片集群优化连接字符串的更多信息,请参阅提高私有端点后分片集群的连接性能

Atlas 使用 CDN 快速提供内容。如果您的组织使用防火墙,请将以下 Atlas CDN 主机添加到防火墙的允许列表,以防止访问 Atlas 用户界面时出现问题:https://assets.mongodb-cdn.com/

Atlas 集群在端口 27017 上运行。您必须能够通过该端口连接到您的集群。此外,确保适当的端口对以下各项开放:

  • 对于分片集群,请允许访问端口 27016。

  • 对于 BI Connector,请授予对端口 27015 的访问权限。

您可以使用第三方Outgoing port tester检查是否能够访问端口。

例子

如果无法访问这些端口,请检查系统防火墙设置,确保防火墙没有阻止访问这些端口。

如果使用的是 mongodb+srv:// 连接字符串,而驱动程序或 Shell 未找到 Atlas 集群的 DNS 主机,该集群则可能会暂停或删除。检查集群是否存在。如果这是一个已暂停的集群,则可在必要时恢复该集群。

注意

Atlas 会在 60 天没有连接后自动暂停空闲的 M0 集群。

如果您在使用 MongoDB Compass 连接集群时遇到问题,请参阅:

如果您使用自管理的 X.509 证书或由 Atlas 管理的自动生成的 X.509 证书对 MongoDB 数据库进行身份验证,则在连接到 MongoDB Compass 时,您必须:

  1. 在 MongoDB Compass 中,选择 Fill in connection fields individually

  2. Authentication 下拉菜单中,选择 X.509

  3. 选择 More Options

  4. SSL 下拉菜单中,选择 Server and Client Validation

  5. 将下载的 Atlas 托管证书或自管理证书(取决于您使用的证书)的相同路径添加到以下每个字段中:Certificate AuthorityClient CertificateClient Private Key

要了解更多信息,请参阅 MongoDB Compass 文档中的连接到 MongoDB

用于连接 Atlas 的连接字符串格式取决于多个因素,包括:

将连接字符串投入生产前,请在测试环境中进行验证。

如果您的密码包含特殊字符,且在连接字符串 URI 中使用了密码,则请对特殊字符进行编码。

如果尝试使用需要百分数编码的特殊字符更新密码,会出现以下错误信息:

This password contains special characters which will be URL-encoded.

注意

以下字符和空格字符必须使用 百分号编码 进行转换 如果包含在用户名或密码中:

: / ? # [ ] @ ! $ & ' ( ) * , ; = %

例如,如果您的纯文本密码是p@ssw0rd'9'!,您需要将密码编码为:

p%40ssw0rd%279%27%21

➤ 使用 Select your language(选择语言)下拉菜单设置本节中编码示例的语言。


1package main
2
3import (
4 "context"
5 "fmt"
6 "net/url"
7
8 "go.mongodb.org/mongo-driver/bson"
9 "go.mongodb.org/mongo-driver/mongo"
10 "go.mongodb.org/mongo-driver/mongo/options"
11)
12
13func main() {
14 username := "<username>"
15 password := "<password>"
16 cluster := "<clusterName>"
17 authSource := "<authSource>"
18 authMechanism := "<authMechanism>"
19
20 uri := "mongodb+srv://" + url.QueryEscape(username) + ":" +
21 url.QueryEscape(password) + "@" + cluster +
22 "/?authSource=" + authSource +
23 "&authMechanism=" + authMechanism
24
25 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
26 if err != nil {
27 panic(err)
28 }
29 defer client.Disconnect(context.TODO())
30
31 collection := client.Database("<dbName>").Collection("<collName>")
32
33 cursor, err := collection.Find(context.TODO(), bson.D{})
34 if err != nil {
35 panic(err)
36 }
37
38 var results []bson.D
39 if err = cursor.All(context.TODO(), &results); err != nil {
40 panic(err)
41 }
42 for _, result := range results {
43 fmt.Println(result)
44 }
45}
1import com.mongodb.client.MongoClient;
2import com.mongodb.client.MongoClients;
3import com.mongodb.client.MongoCollection;
4import com.mongodb.client.MongoDatabase;
5
6import org.bson.Document;
7import java.net.URLEncoder;
8
9public class Encoding {
10
11 public static void main(String [] args){
12
13 try{
14 String username = URLEncoder.encode("<username>", "UTF-8");
15 String password = URLEncoder.encode("<password>", "UTF-8");
16 String cluster = "<clusterName>";
17 String authSource = "<authSource>";
18 String authMechanism = "<authMechanism>";
19
20 String uri = "mongodb+srv://" + username + ":" + password + "@" + cluster +
21 "/?authSource=" + authSource + "&authMechanism=" + authMechanism;
22
23 MongoClient mongoClient = MongoClients.create(uri);
24
25 MongoDatabase database = mongoClient.getDatabase("<dbName>");
26 MongoCollection<Document> collection = database.getCollection("<collName>");
27
28 collection.find().forEach(doc -> System.out.println(doc.toJson()));
29
30 } catch(Exception e){
31 System.err.println(e.getCause());
32
33 }
34 }
35}
1const { MongoClient } = require("mongodb");
2
3const username = encodeURIComponent("<username>");
4const password = encodeURIComponent("<password>");
5const cluster = "<clusterName>";
6const authSource = "<authSource>";
7const authMechanism = "<authMechanism>";
8
9let uri =
10 `mongodb+srv://${username}:${password}@${cluster}/?authSource=${authSource}&authMechanism=${authMechanism}`;
11
12const client = new MongoClient(uri);
13
14async function run() {
15 try {
16 await client.connect();
17
18 const database = client.db("<dbName>");
19 const ratings = database.collection("<collName>");
20
21 const cursor = ratings.find();
22
23 await cursor.forEach(doc => console.dir(doc));
24 } finally {
25 await client.close();
26 }
27}
28run().catch(console.dir);
1import pymongo
2from urllib.parse import quote_plus
3
4username = quote_plus('<username>')
5password = quote_plus('<password>')
6cluster = '<clusterName>'
7authSource = '<authSource>'
8authMechanism = '<authMechanism>'
9
10uri = 'mongodb+srv://' + username + ':' + password + '@' + cluster + '/?authSource=' + authSource + '&authMechanism=' + authMechanism
11
12client = pymongo.MongoClient(uri)
13
14result = client["<dbName"]["<collName>"].find()
15
16# print results
17for i in result:
18 print(i)

重要

如果在连接字符串 URI 之外使用密码(例如,将密码粘贴到 mongosh),那么请勿对密码中的特殊字符进行编码。

如果看到此错误消息,则说明驱动程序可能已过时。有关更新驱动程序的说明,请参阅特定的驱动程序文档

当使用 DNS 种子列表连接字符串格式连接到 Atlas 时,可能会看到以下错误:

DNSHostNotFound: Failed to look up service "<MongoDB service name>"

使用 ISP 提供的默认 DNS 服务器时可能会出现此错误。该 DNS 服务器可能不支持 DNS 种子列表连接字符串格式使用的 SRV 查询。

要解决此问题,你可以尝试更改 DNS 配置以使用 公共 DNS 服务器

例子

您可以将网络设置配置为 使用 Google 公共 DNS 而不是 ISP DNS 服务器。

更新网络设置以使用公共DNS服务器后,请连接到集群。

如果运行 Ubuntu 18.04,并使用 DNS 种子列表连接string 格式 (mongodb+srv://) 从一个 MongoDB Database Toolsmongodumpmongorestore 等)连接 Atlas,可能会出现以下错误:

lookup nta8e.mongodb.net on 123.45.67.8:27017: cannot unmarshal DNS message

设置过程中,请选择以下连接选项之一:

在驱动程序或 Compass 中使用 DNS 种子列表连接字符串格式 (mongodb+srv://) 时,可能会出现以下错误:

Error: querySrv ECONNREFUSED _mongodb._tcp.<SRV Record>

如要解决此问题,请选择旧版本的驱动程序或 Compass,以使用标准连接字符串格式。使用 Compass 时,不要设置 SRV 记录值,而是设置主机名端口值。

后退

Google Cloud

来年

配置安全功能