解决连接问题
在此页面上
本页概述了常见连接问题和可能的解决方案。
要了解有关连接 Atlas 集群的更多信息,请参阅 Atlas 入门教程。
注意
如果您是寻求支持的企业客户,请提交支持工单。如需获取社区支持,请访问 MongoDB Community 资源。
注意
无服务器实例目前不支持通过某些驱动程序或驱动程序版本进行连接。要了解详情,请参阅无服务器实例限制。
集群 Connect(连接)按钮已禁用
如果您的集群处于预配状态,则集群的 Connect 按钮可能会被禁用。您的集群需要在首次部署时进行预配。当您向上或向下扩展集群时,集群也必须进行预配。预配过程最多可能需要 10 分钟,之后 Connect 按钮将变为启用状态。
连接 IP 地址不在 IP 访问列表中
在连接到 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 UI
Atlas 使用 CDN 快速提供内容。如果您的组织使用防火墙,请将以下 Atlas CDN 主机添加到防火墙的允许列表,以防止访问 Atlas 用户界面时出现问题:https://assets.mongodb-cdn.com/
。
连接到集群
Atlas 集群在端口 27017
上运行。您必须能够通过该端口连接到您的集群。此外,确保适当的端口对以下各项开放:
对于分片集群,请允许访问端口 27016。
对于 BI Connector,请授予对端口 27015 的访问权限。
您可以使用第三方Outgoing port tester检查是否能够访问端口。
例子
要查看能否访问端口 27017,请访问 http://portquiz.net:27017。
如果无法访问这些端口,请检查系统防火墙设置,确保防火墙没有阻止访问这些端口。
集群可用性
如果使用的是 mongodb+srv://
连接字符串,而驱动程序或 Shell 未找到 Atlas 集群的 DNS 主机,该集群则可能会暂停或删除。检查集群是否存在。如果这是一个已暂停的集群,则可在必要时恢复该集群。
注意
Atlas 会在 60 天没有连接后自动暂停空闲的 M0
集群。
MongoDB Compass 故障排除
如果您在使用 MongoDB Compass 连接集群时遇到问题,请参阅:
MongoDB Compass 文档中的 Compass 连接错误。
如果您使用自管理的 X.509 证书或由 Atlas 管理的自动生成的 X.509 证书对 MongoDB 数据库进行身份验证,则在连接到 MongoDB Compass 时,您必须:
在 MongoDB Compass 中,选择 Fill in connection fields individually。
在 Authentication 下拉菜单中,选择
X.509
。选择 More Options 。
在 SSL 下拉菜单中,选择 Server and Client Validation。
将下载的 Atlas 托管证书或自管理证书(取决于您使用的证书)的相同路径添加到以下每个字段中:Certificate Authority、Client Certificate 和Client Private Key。
要了解更多信息,请参阅 MongoDB Compass 文档中的连接到 MongoDB。
连接字符串问题
连接字符串格式不正确
连接到 Atlas 时使用的连接字符串格式取决于多个因素,包括:
您的
mongosh
版本。要了解更多信息,请参阅通过mongosh
进行连接。您的驱动程序版本。要了解更多信息,请参阅通过驱动程序连接。
将连接字符串投入生产前,请在测试环境中进行验证。
连接字符串密码中的特殊字符
如果您的密码包含特殊字符,且在连接字符串 URI 中使用了密码,则请对特殊字符进行编码。
如果尝试使用需要百分数编码的特殊字符更新密码,会出现以下错误信息:
This password contains special characters which will be URL-encoded.
注意
如果在用户名或密码中包含以下字符和空格字符,必须使用百分比编码转换这些字符:
: / ? # [ ] @ ! $ & ' ( ) * , ; = %
例如,如果您的纯文本密码是p@ssw0rd'9'!
,您需要将密码编码为:
p%40ssw0rd%279%27%21
➤ 使用 Select your language(选择语言)下拉菜单设置本节中编码示例的语言。
1 package main 2 3 import ( 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 13 func 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 }
1 import com.mongodb.client.MongoClient; 2 import com.mongodb.client.MongoClients; 3 import com.mongodb.client.MongoCollection; 4 import com.mongodb.client.MongoDatabase; 5 6 import org.bson.Document; 7 import java.net.URLEncoder; 8 9 public 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 }
1 const { MongoClient } = require("mongodb"); 2 3 const username = encodeURIComponent("<username>"); 4 const password = encodeURIComponent("<password>"); 5 const cluster = "<clusterName>"; 6 const authSource = "<authSource>"; 7 const authMechanism = "<authMechanism>"; 8 9 let uri = 10 `mongodb+srv://${username}:${password}@${cluster}/?authSource=${authSource}&authMechanism=${authMechanism}`; 11 12 const client = new MongoClient(uri); 13 14 async 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 } 28 run().catch(console.dir);
1 import pymongo 2 from urllib.parse import quote_plus 3 4 username = quote_plus('<username>') 5 password = quote_plus('<password>') 6 cluster = '<clusterName>' 7 authSource = '<authSource>' 8 authMechanism = '<authMechanism>' 9 10 uri = 'mongodb+srv://' + username + ':' + password + '@' + cluster + '/?authSource=' + authSource + '&authMechanism=' + authMechanism 11 12 client = pymongo.MongoClient(uri) 13 14 result = client["<dbName"]["<collName>"].find() 15 16 # print results 17 for i in result: 18 print(i)
重要
如果在连接字符串 URI 之外使用密码(例如,将密码粘贴到 mongosh
),那么请勿对密码中的特殊字符进行编码。
连接字符串与驱动程序版本不兼容
如果看到此错误消息,则说明驱动程序可能已过时。有关更新驱动程序的说明,请参阅特定的驱动程序文档。
互联网服务提供商 DNS 阻止连接字符串
当使用 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 上的 DB 工具连接字符串错误
如果运行 Ubuntu 18.04,并使用 DNS 种子列表连接string 格式 (mongodb+srv://
) 从一个 MongoDB Database Tools(mongodump
、mongorestore
等)连接 Atlas,可能会出现以下错误:
lookup nta8e.mongodb.net on 123.45.67.8:27017: cannot unmarshal DNS message
设置过程中,请选择以下连接选项之一:
结合使用
--uri
选项与非 SRV 连接字符串 (mongodb://
)。使用
--host
选项指定要连接的主机。
使用 SRV 连接字符串拒绝的连接
在驱动程序或 Compass 中使用 DNS 种子列表连接字符串格式 (mongodb+srv://
) 时,可能会出现以下错误:
Error: querySrv ECONNREFUSED _mongodb._tcp.<SRV Record>
要开始排除故障,您需要从集群的种子列表连接字符串中获取 DNS SRV 名称、节点的单个主机名和端口号。
要查找 DNS SRV 名称:
请按照连接您的应用程序中的步骤 1-6 操作。
在步骤 7 中,选择您选择的驱动程序的最新版本。
DNS SRV 名称以密码后的
@
符号开头,并以.mongodb.net
结尾。- 例如,cluster0.dfget.mongodb.net
。
要查找节点的主机名和端口号,请执行以下步骤:
测试基本网络连接:
在出现问题的应用程序服务器上的终端或命令提示符中运行以下命令:
- 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>"