本文介绍如何排查无法连接云数据库MongoDB实例的问题。

若您已收到客户端返回的错误信息,请查阅连接失败常见报错匹配解决方案。

概览

您可以从以下几个方面排查无法连接云数据库MongoDB实例的问题:

检查白名单设置

您需要将正确的客户端IP地址添加到云数据库MongoDB实例的白名单中,才能连接云数据库MongoDB实例。

排查方法及解决方案如下:
  • 方法一(推荐):使用云数据库MongoDB的连接诊断功能,检测IP地址是否连通,如何检测及检测失败后如何解决,请参见连接诊断连接诊断
  • 方法二:请在数据库的白名单中临时添加0.0.0.0/0,如果设置后可以正常访问,说明是白名单设置存在问题。

    解决方案:删除0.0.0.0/0白名单,将正确的IP地址添加到云数据库MongoDB实例的白名单中。如何设置白名单,请参见设置白名单

检查网络环境

云数据库MongoDB支持私网和公网两种连接方式,不同网络环境需满足以下条件才能连接云数据库MongoDB实例:
  • 私网:确保实例处于同一个地域、实例的网络类型相同且私网连接地址正确。

    若实例的网络类型都是专有网络(VPC),您还需要确保实例在同一个专有网络中。

  • 公网:确保公网连接地址正确。
您可以参见如下流程图排查客户端的网络环境: 检查网络环境

如何解决由网络环境导致的实例连接失败问题,请参见如何解决由网络环境导致的实例连接失败问题?

检查实例连接地址

您需要使用正确的实例连接地址,才能连接云数据库MongoDB实例。

您可以登录 MongoDB管理控制台,在 数据库连接页面查看云数据库MongoDB实例的连接地址。 实例连接地址
实例连接地址不正确的常见原因及解决方案如下:
  • 常见原因一:使用了错误的网络环境的连接地址。

    例如计划通过公网连接云数据库MongoDB实例却使用了实例的专有网络连接地址,导致连接失败。

    解决方案:请根据网络环境,使用正确的连接地址。

  • 常见原因二:连接地址中的鉴权数据库有误。

    解决方案:请在连接串中填写正确的鉴权数据库。

    如果您使用高可用地址连接云数据库MongoDB实例,连接串中包含数据库和鉴权数据库,这两个数据库可以相同也可以不同。本文以副本集实例的ConnectionstringURI地址为例进行介绍,连接串格式如下:
    mongodb://<username>:<password>@<host1>:<port1>,<host2>:<port2>,...,<hostN>:<portN>/<database>?replicaSet=<replicaSet_value>[&authSource=<authenticationDatabase>]
    数据库和鉴权数据库的参数说明如下:
    • <database>:数据库,实例连接成功后默认要访问的数据库,相当于自动执行命令use <database>
    • authSource=<authenticationDatabase>(可选):<authenticationDatabase>为鉴权数据库名称。如果不配置该参数,<database>会作为鉴权数据库。

      鉴权数据库用于存储数据库账号和密码。数据库账号必须在所属的数据库下进行鉴权,才能鉴权成功。

    示例:
    • root账号存储在admin数据库中,在admin数据库鉴权成功后,实例进入admin数据库。
      mongodb://root:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-6108****
    • test账号存储在newDB数据库中,在newDB数据库鉴权成功后,实例进入admin数据库。
      mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-6108****&authSource=newDB
    • test账号存储在newDB数据库中,在newDB数据库鉴权成功后,实例进入newDB数据库。
      mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/newDB?replicaSet=mgset-6108****&authSource=newDB
  • 常见原因三:实际连接的节点不是主节点(Primary节点)。
    此原因仅适用于副本集实例。如果您的业务通过主节点的地址连接副本集实例,主备切换后实际连接的节点角色变成了从节点(Secondary节点),所以写入失败。
    说明 导致实例发生主备切换的原因有很多种,具体请参见 为什么实例会发生主备切换
    解决方案:
    • 手动切换实例的节点角色,将业务实际连接的单节点地址对应节点切换为主节点。如何切换节点角色,请参见切换节点角色
    • 推荐生产环境的应用程序通过ConnectionStringURI地址连接数据库。当某个节点出现故障时,不会因为主备切换而影响应用的读写操作,更多信息,请参见副本集实例连接说明
    • 请为业务设计重连机制和异常处理能力,连接闪断后可自动重连,保障业务稳定运行。
  • 常见原因四:连接地址中的账号密码包含特殊字符!@#$%^&*()_+=

    通过Mongo Shell或程序代码连接云数据库MongoDB实例时,如果连接串中的账号密码包含特殊字符!@#$%^&*()_+=,这些特殊字符在连接时无法被识别,会导致实例连接失败。

    解决方案:您需要对账号密码中的特殊字符进行转义处理,详情请参见如何解决连接串中账号密码包含特殊字符导致连接失败的问题

检查域名解析情况

域名解析正确,才能连接云数据库MongoDB实例。

排查方案:通过ping <域名>telnet <域名> <端口号>命令测试网络的连通性。

解决方案:请参见Linux系统的ECS实例内部无法正常解析域名

检查实例状态

实例的状态为运行中,才能连接云数据库MongoDB实例。

登录 MongoDB管理控制台,在目标实例的 基本信息页面查看实例状态,确保实例状态为 运行中,排除实例状态异常或者被锁定等问题。 实例状态(中国站)
实例被锁定的常见原因及解决方案如下:

检查第三方工具

当第三方工具(如Navicat、Compass等工具)无法连接云数据库MongoDB实例时,有可能是实例的设置或者第三方工具的设置不正确等原因造成的。您需要确保实例和第三方工具的设置都正确,才能通过第三方工具连接云数据库MongoDB实例。

建议您先通过Mongo Shell工具连接实例的高可用连接串(ConnectionstringURI地址)做测试,测试结果及对应的解决方案如下:
  • 连接成功:第三方工具的设置不正确。请根据您实际使用的工具,具体排查工具的各种设置。
  • 连接失败:实例的设置不正确。请参照本文排查白名单设置、网络环境、实例连接地址、域名解析情况和实例状态。

相关文档

连接失败常见报错