Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/

解决连接问题

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

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

注意

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

您可以使用 智能助手来协助调试连接错误。

如果您的集群处于预配状态,则集群的 Connect 按钮可能会被禁用。您的集群需要在首次部署时进行预配。当您向上或向下扩展集群时,集群也必须进行预配。

Atlas预配集群后,Connect 按钮将变为启用状态。

对于免费集群,预配所需时间少于 15 秒。

对于 Flex 和专用集群,预配可能最多需要 10 分钟。

在连接到 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在 30 天后自动暂停没有连接的空闲免费集群(以前称为 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 服务器后,连接到集群

您可能会在使用 DNS 种子列表连接字符串 格式 (mongodb+srv://) 从某个 MongoDB Database Tools (mongodumpmongorestore 等) 连接到 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>

要解决此错误,请完成以下步骤。

1
  1. 连接应用程序中按照步骤 1-6 进行操作。

  2. 选择您的驱动程序和版本。

  3. Use this connection string in your application 下,SRV 主机名显示在 mongodb+srv://连接字符串中。它是主机名中以 .mongodb.net 结尾的部分。

    例如:cluster0.dfget.mongodb.net

2

在同一个 Connect 模态中:

  1. Use this connection string in your application 下,关闭 SRV Connection String 开关。

  2. 显示标准连接字符串(mongodb://),其中列出每个节点的主机名和端口号。

    集群的连接字符串可能有各种主机名和端口,具体取决于其拓扑结构和连接方法。要学习;了解有关私有端点的更多信息,请参阅配置私有端点。

3

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

  1. 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.
  2. 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
  3. 网络探测(ping)测试

    注意

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

    对于集群中的每个主机名:

    对于Linux或 macOS,运行以下命令:

    ping -c 10 <Node Hostname>

    对于Windows,运行以下命令:

    ping /n 10 <Node Hostname>

    查看输出以检查数据包丢失和往返时间 (RTT)。较高的数据包丢失或延迟可能表明服务器和集群节点之间的网络问题。

  4. 端到端网络连接测试

    对于Linux或 macOS,运行以下命令:

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

    对于Windows,运行以下命令:

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

运行上一步测试后,根据失败的测试,使用以下指导解决连接错误:

  • DNS SRV 解析测试失败:您的 DNS 解析程序不支持SRV记录查找,或者出站 DNS 流量被阻止。请尝试以下任一操作:

    • 切换到非 SRV连接字符串格式 (mongodb://),而不是 mongodb+srv://。要获取非 SRV 连接字符串,请在 Atlas 中打开 Connect 模式,选择您的驱动程序和版本,然后关闭 Use this connection string in your application 下的 SRV Connection String 开关。

    • 配置您的网络以使用公共 DNS 服务器,支持 SRV 查找,例如 Google 公共 DNS。

  • DNS节点主机名解析测试失败:您的 DNS 解析程序无法解析单个节点主机名。如果您使用私有端点,请验证私有端点 DNS 配置是否正确。

  • 网络探测(ping) 测试失败:ICMP 流量可能被防火墙或云提供商阻止。这并不一定表明存在 TCP 连接问题。继续进行端到端网络连接测试,验证端口 27017 上的 TCP 连接。

  • 端到端网络连接测试失败:防火墙或网络策略阻止访问权限节点节点上的端口 27017。验证以下内容:

    • 将应用程序服务器的IP解决添加到集群的IP访问列表

    • 允许端口 27017 上的出站 TCP 连接通过防火墙。

  • 所有测试均已通过,但错误仍然存在:问题可能出在您的驱动程序版本中。较旧的驱动程序版本可能无法正确支持SRV连接字符串格式。将驱动程序更新到最新版本。您还可以通过关闭 Connect 模态中 Use this connection string in your application 下的 SRV Connection String 开关,切换到标准(非 SRV)连接字符串格式 (mongodb://)。

后退

Google Cloud Platform Functions

在此页面上