连接故障排除
本页内容
本页提供了使用 MongoDB Go 驱动连接到 MongoDB 部署时可能遇到的问题的潜在解决方案。
注意
本页仅解决连接问题。如果您遇到 MongoDB 或驱动程序的其他问题,请访问以下资源
问题 & 帮助页面,其中包含有关报告错误、为驱动程序做出贡献和查找其他资源的信息
的MongoDB社区论坛,用于提问、讨论或一般技术支持
连接错误
以下错误消息是一个通用消息,表明驱动程序无法连接到指定主机名或端口的服务器
Error: couldn't connect to server 127.0.0.1:27017
以下部分描述了可能有助于解决问题的方法。
检查连接字符串
请确认连接字符串中的主机名和端口号都准确无误。在示例错误消息中,主机名是127.0.0.1
,端口号是 27017
。MongoDB实例的默认端口号是 27017
,但您可以将MongoDB配置为在其他端口上通信。
配置防火墙
假设您的MongoDB部署使用的是默认端口,请确认防火墙中端口 27017
已开放。如果您的部署使用的是不同的端口,请确认防火墙中正确的端口已开放。
警告
除非您确定它是MongoDB实例使用的端口,否则请勿在防火墙中打开端口。
身份验证错误
如果Go驱动程序没有正确配置授权,它可能无法连接到MongoDB实例。在这种情况下,驱动程序会引发类似于以下消息之一的错误信息:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
以下部分描述了可能有助于解决问题的方法。
检查连接字符串
无效的连接字符串是尝试连接到MongoDB时遇到身份验证问题的最常见原因。
提示
有关连接字符串的更多信息,请参阅连接指南中的连接URI。
如果您的连接字符串包含用户名和密码,请确保它们格式正确。
注意
如果用户名或密码包含以下任何字符,则它们必须进行百分号编码:
: / ? # [ ] @
连接到副本集时,请在连接字符串中包含所有副本集主机。使用逗号分隔连接字符串中的每个主机。这使驱动程序能够在某个主机不可达时建立连接。
验证认证机制
确保您的凭据和认证机制正确。您可以将认证凭据存储在环境变量中,或者将它们传递给 SetAuth()
方法。
了解更多关于认证的信息,请参阅认证机制指南。
验证用户是否在认证数据库中
要成功通过数据库用户名和密码认证连接,用户名必须在认证数据库中定义。默认认证数据库是 admin
数据库。要使用不同的数据库进行认证,请在连接字符串中指定 authSource
。以下示例指示驱动程序使用 users
作为认证数据库
uri := "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users" client := mongo.Connect(context.TODO(), uri)
发送消息失败
当驱动程序在您发出请求后无法发送命令时,通常会显示以下通用错误消息
com.mongodb.MongoSocketWriteException: Exception sending message
以下部分描述了可能有助于解决问题的方法。
检查连接字符串
验证认证机制
请确保您使用正确的认证机制和凭证。有关认证错误的更多信息,请参阅认证错误。
验证用户是否在认证数据库中
验证用户是否在正确的认证数据库中。有关认证数据库的更多信息,请参阅 认证错误。
配置防火墙
防火墙必须为与MongoDB实例通信而打开端口。有关配置防火墙的更多信息,请参阅 连接错误。
检查连接数
每个 客户端
实例都支持连接池中的最大并发打开连接数。配置参数 maxPoolSize
定义此值,默认设置为 100
。如果已经有等于 maxPoolSize
的打开连接数,则服务器会等待直到有连接变得可用。如果此等待时间超过 maxIdleTimeMS
值,则驱动程序会返回错误。有关连接池如何工作的更多信息,请参阅FAQ中的 Go驱动程序中连接池是如何工作的?
超时错误
有时当你通过驱动器向服务器发送请求时,请求会超时。在这种情况下,你可能收到类似以下错误消息
timed out while checking out a connection from connection pool: context canceled
如果你收到这个错误,请尝试以下方法解决问题。
设置超时选项
客户端
支持一个控制单个操作执行时间的 超时
选项。您可以使用 SetTimeout()
方法或通过在连接字符串中指定 timeoutMS
选项来设置此值。
以下示例使用连接字符串选项将单个超时值设置为 5 秒
uri := "mongodb://<db_username>:<db_password>@<hostname>:27017/?timeoutMS=5000" client := mongo.Connect(context.TODO(), uri)
检查连接数
到服务器的连接数可能超过 maxPoolSize
。有关检查连接数的更多信息,请参阅 发送消息错误。