Docs 菜单
Docs 主页
/
MongoDB Atlas
/

解决连接问题

在此页面上

  • 集群 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 使用 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,而不是 ISPDNS 服务器。

更新您的网络设置以使用公共 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>

要开始排除故障,您需要从集群的种子列表连接字符串中获取 DNS SRV 名称、节点的单个主机名和端口号。

  1. 请按照连接您的应用程序中的步骤 1-6 操作。

  2. 步骤 7 中,选择您选择的驱动程序的最新版本。

  3. DNS SRV 名称以密码后的 @ 符号开头,并以 .mongodb.net 结尾。- 例如,cluster0.dfget.mongodb.net

  1. 请按照连接您的应用程序中的步骤 1-6 操作。

  2. 步骤 7 中,选择您选择的驱动程序的最新版本。

  3. 步骤 7 中,选择非稳定的 API 下最旧的驱动程序版本

    • 每个主机名都在一个以逗号分隔的列表中,该列表以密码后的 @ 符号开头,并以 .mongodb.net 结尾。

  4. 请注意每个主机名后面的端口号。

    • 集群的连接字符串可能有多种主机名和端口,具体取决于其拓扑结构和连接方法。

    • 有关私有端点工作原理的更多信息,请参阅配置私有端点

在出现问题的应用程序服务器上的终端或命令提示符中运行以下命令:

  • DNS SRV 解析测试:

    Linux/MacOS:

    dig SRV _mongodb._tcp.<DNS SRV name>

    Windows:

    nslookup -debug -q=SRV _mongodb._tcp.<DNS SRV name>

    在响应的回答部分下,您应能看到集群中每个节点的一个结果。- 例如:

    ;; ANSWER SECTION:
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-00.dfget.mongodb.net.
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-01.dfget.mongodb.net.
    _mongodb._tcp.gcluster0.dfget.mongodb.net. 60 IN SRV 0 0 27017 cluster0-shard-00-02.dfget.mongodb.net.
  • DNS节点主机名解析测试:

    对于集群中的每个主机名,运行此命令:

    Linux/MacOS:

    dig <Node Hostname>

    Windows:

    nslookup -debug -q=A <Node Hostname>

    在响应的回答部分下,您应能看到 DNS 主机名解析到的 IP 地址。

    • 例如:

    ;; ANSWER SECTION: cluster0-shard-00-00.ag9in.mongodb.net. 60 IN A 10.10.10.10
  • Ping 测试:

    注意

    云提供商可能会阻止通过私有端点连接的 ICMP 请求。

    对于集群中的每个主机名,运行此命令:

    Linux/Mac OS:

    ping -c 10 <Node Hostname>

    Windows:

    ping /n 10 <Node Hostname>
  • 端到端网络连接测试:

    Linux/Mac/OS:

    nc -zv <Node Hostname> <Node Port Number>

    Windows:

    Test-NetConnection -Port <Node Port Number> -InformationLevel "Detailed" -ComputerName "<Node Hostname>"

后退

Google Cloud