一、排查与解决
| 序号 | 可能原因 | 排查方法 | 解决方法 |
| 1 | 云服务器 CVM 和 数据库 MongoDB 内网不互通。云服务器和数据库不属于同一私有网络内。云服务器与数据库务必在同一账号同一个 VPC 内,或同在基础网络内,内网才能直接互通。安全组配置错误。若想使用 CVM 连接 MongoDB,需在 CVM 安全组中配置出站规则,当出站规则的目标配置不为0.0.0.0/0且协议端口不为 ALL 时 ,需要把 MongoDB 的 IP 及端口添加到出站规则中。若想指定的 CVM 连接 MongoDB 实例,需要在 MongoDB 安全组中配置入站规则,当入站规则的源端配置不为0.0.0.0/0且协议端口不为 ALL 时,需要把 CVM 的 IP 及端口添加到入站规则中。 |
1. 登录 CVM 控制台,在实例列表的实例配置查看 CVM 网络信息。2. 登录 MongoDB 控制台,在实例列表查看 MongoDB 的网络信息。具体操作,请参见 查看实例详情。3. 比较 CVM 与 MongoDB 是否属于同一网络。4. 登录 CVM,使用 telnet 10.x.x.34 27017 确认 MongoDB 网络端口是否可正常访问。连接链路不通。连接链路成功。 |
如下情况,都可能因网络问题导致连接失败。云服务器(CVM)采用私有网络(VPC),MongoDB 采用基础网络。建议将 MongoDB 从基础网络切换为 VPC 网络,请参见 切换实例网络。CVM 采用基础网络,MongoDB 采用 VPC。建议将 CVM 从基础网络切换为 VPC 网络,请参见 切换私有网络服务。CVM 与 MongoDB 在同一地域内,但属于不同的 VPC 网络。建议将 MongoDB 迁移到 CVM 所在的 VPC 网络,请参见 切换实例网络。CVM 与 MongoDB 不在同一地域内,属于不同的 VPC 网络。建议在两个 VPC 网络之间建立 云联网。CVM 与 MongoDB 账号不同,属于不同的 VPC 网络。建议在两个 VPC 网络之间建立 云联网。 |
| | | | CVM 安全组配置有误1. 登录 安全组控制台,在安全组列表中,找到 CVM 所绑定的安全组,单击安全组名,进入 CVM 绑定的安全组详情页。2. 选择出站规则页签,单击添加规则。类型选择自定义。目标填写你 MongoDB 的 IP 地址(段)。协议端口填写 MongoDB 内网端口。策略选择允许。MongoDB 安全组配置有误1. 登录 安全组控制台,在安全组列表中,找到 MongoDB 实例所绑定的安全组,单击安全组名,进入 MongoDB 绑定的安全组详情页。2. 选择入站规则页签,单击添加规则。3. 填写你允许连接的 IP 地址(段)及需要放通的端口信息(MongoDB 内网端口),选择允许放通。类型选择自定义。来源填写你 CVM 的 IP 地址(段)。协议端口填写 MongoDB 内网端口。策略选择允许。 |
| 2 | 用户名与密码输入错误。 | 登录 CVM,连接数据库实例,提示账号密码错误。例如:提示 Error: Authentication failed,说明用户名密码输入错误。 | 登录 MongoDB 控制台,在实例详情页面,选择数据库管理页签,进入 账号管理页面,查看当前数据库所有账号信息,重置密码。具体操作,请参见 账号管理。 |
| 3 | 数据库访问密码中包含%、@等特殊字符。 | 密码中存在%与@特殊字符,驱动或者 MongoDB Shell 等客户端没有自动转义这些特殊字符,引起这些特殊字符与连接串地址冲突,而导致用户名或密码出错。提示Password cannot properly be URL decoded 或者 Error: Authentication failed 错误信息。 |
将访问密码的特殊字符按照如下转义规则进行处理:感叹号“!”: 转义为 %21at “@” : 转义为 %40警号“#”:转义为 %23百分号“%”: 转义为 %25插入号“^” : 转义为 %5e星号“*”: 转义为 %2a左括号“(”: 转义为 %28右括号“)”: 转义为 %29下划线“_”: 转义为 %5f例如,如果原始密码为:^%@132121a,则转义后的密码应为:^%25%40132121a。 |
| 4 | MongoDB Shell 版本过低 | 登录 CVM,执行 mongo –version 确版本信息。 | 为保障鉴权成功,请安装 Mongo Shell 3.0及以上版本。安装步骤,请参见 产品文档。 |
| 5 | 客户端的连接串中,没有正确使用鉴权库。控制台创建的用户:云数据库 MongoDB 统一使用 admin 库作为登录鉴权的认证数据库,在 URI 中端口后面必须加上“/admin”以指定认证库,通过认证后再切换到具体业务数据库进行读写操作。命令行创建的用户:直接指定对应的数据库认证即可。例如在 test 库下建立的用户登录时,指定的认证库为 test。 | 控制台创建的用户:检查客户端程序中配置的连接串是否包含“/admin”或者 authSource=admin。命令行创建的用户:请你自行检查连接串中的认证库是否为正确的数据库名称。 | 登录 MongoDB 控制台,在实例详情页面的网络配置区域,默认账号连接请直接复制 URI 形式的连接串。其他账户,请你自行修改为正确的认证库再尝试连接。具体操作,请参见 连接 MongoDB 实例。如果以上方法仍未解决问题,你还可以 在线咨询 联系售后。 |
| 6 | 存在阻塞其他请求的操作。若在业务繁忙时段,进行了前台建索引操作(background 选项的值为 false )。该操作将阻塞其他的所有操作,导致请求被锁住,直到前台完成索引创建。具体创建索引的方式,请参见 MongoDB 页面。 | 业务侧自行排查索引创建的方式。 | 采用后台方式建索引。但后台建索引方式也是有代价的,可能会导致索引创建时间变长。具体创建索引的选项,请参见 MongoDB 页面。同时,可通过 currentOp 命令来查看当前创建索引的进度,具体的命令如下:db.currentOp( { $or: [ { op: "command", "query.createIndexes": { $exists: true } }, { op: "insert", ns: /\\.system\\.indexes\\b/ } ] } ) |
| 7 | 检查客户连接数是否已经达到上限。每个实例都有连接数上限的限制,超过限制,则无法连接。 | 登录 MongoDB 控制台 ,在数据库管理页面,选择连接数管理页签,查看实例最大连接数、实时连接数、连接使用率。具体操作,请参见 连接数管理。 | 连接使用率偏高解决方法,请参见 连接使用率偏高异常分析。 |
注意:在页面控制台创建的用户其认证库均为 admin,因此用户登录时需要指定认证库为 admin。用命令行创建的用户,例如在 test 库下建立的用户登录时指定的认证库为 test。