在学习mongodb的过程中,碰见两个问题,在此记录一下。
1. java客户端连接mongodb超时问题。
报错信息:com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=47.94.98.106:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException}}]
分析:
- 首先检查mongodb所在的服务器地址和端口号有没有写错。
- 检查本地是否能ping通mongo的服务器地址
- 前两步都没问题,然后检查本地能否telnet通mongo。例如:我的是windows系统。在命令行中,telnet 47.94.98.106 27017,如果telnet不同,则说明可能是服务器的27017端口没对外开放,则需要打开该端口的防火墙。
2. 云服务器中启动mongo启动失败
报错信息:
options: { config: "../mongodb.cfg", net: { bindIp: "47.94.98.106", port: 27017 }, processManagement: { fork: true }, storage: { dbPath: "/data/mongodb/db" }, systemLog: { destination: "file", logAppend: true, path: "/data/mongodb/logs/mongodb.log" } }
Failed to set up listener: SocketException: Cannot assign requested address
分析:
这个是因为mongodb.cfg中的bind_id地址的问题。具体如下
如上图所示,用的是阿里的ECS云服务器,其中有两个ip,一个是公网的,一个是内网私有的ip。
报错原因是在mongodb.cfg配置文件中填写的 bind_id=47.94.98.106,导致Failed to set up listener: SocketException: Cannot assign requested address。
解决方法:把bind_id改为私有地址或者直接 0.0.0.0即可解决。
注意:使用客户端连接的时候,mongodb的连接地址是服务器的公网ip。