问题描述
使用客户端连接文档数据库服务实例时报错 "Authentication failed", 使用的连接命令如下:
mongo "mongodb://root:<密码>@<IP1:Port1>,<IP2:Port2>/admin?authSource=admin&replicaSet=<setname>"
报错信息如下:
2023-07-19T12:42:13.281+0800 W NETWORK [js] Unable to reach primary for set DDS
2023-07-19T12:42:13.281+0800 I NETWORK [js] Cannot reach any nodes for set DDS. Please check network connectivity and the status of the set. This has happened for 2 checks in a row.
2023-07-19T12:42:13.284+0800 E QUERY [js] Error: connect failed to replica set DDS/<IP>:<Port>,<IP>:<Port> :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed
原因分析
从报错信息来看,是客户端到文档数据库服务之间的网络访问不通导致的。
可能的原因有:
- 文档数据库服务实例的端口错误,不可用。
- 文档数据库服务实例与客户端云主机不在同一个区域或子网。
- 服务端开启了 SSL 模式,但是客户端没有使用 SSL 模式访问。
处理方法
-
检查文档数据库服务实例与ECS是否在同一个区域、同一个安全组和子网内。
首先登录文档数据库服务控制台,单击实例名称,在基本信息页面查看文档数据库服务实例所在的区域、VPC、安全组和子网信息。然后弹性云服务器控制台,单击云服务器名称,在基本信息页面,查看当前云主机所在的区域、VPC、安全组和子网信息。确保 2 者的配置信息相同。
-
检查实例的端口是否正确,并通过 curl/telnet 命令检查端口是否可用。
登录到文档数据库服务控制台,单机实例名称,在基本信息页面查看实例的 IP 和端口信息,然后使用 curl 或者 telnet 命令测试端口的连通性。
示例如下:curl 检查 $ curl <IP>:<Port> It looks like you are trying to access MongoDB over HTTP on the native driver port. telnet 检查 $ telnet <IP> <Port> Trying <IP>... Connected to <IP>. Escape character is '^]'. ^] telnet>
-
检查实例是否开启了 SSL 模式。
登录到文档数据库服务控制台,单机实例名称,在基本信息页面上查看是否开启了 SSL 模式。如果开启了 SSL 模式,则下载证书后使用 SSL 模式访问,命令示例如下:
./mongo "mongodb://root:<密码>@<IP1:Port1>,<IP2:Port2>/admin?authSource=admin&replicaSet=<setName>" --ssl --sslCAFile=<证书路径> --sslAllowInvalidHostnames