我有个网站用的是 MongoDB 数据库,搞不懂的地方在于网站正常,但是 mongo 连不上。
最近没动过配置,不敢贸然重启服务,求教下各位

感谢各位,重启服务后解决了

网站正常说明 db 没问题, 那就是你的链接方式有问题

看下是不是密码 /端口写错了, client 不兼容之类的

早前是正常的

用什么连的?软件还是命令行的 mongo ?
mongo 部署在哪里?你是从哪里连过去的?家里还是同一内网中的服务器?
是报错还是卡住不动?报错的话把错误信息贴一下。

原本正常,现在不行,如果没动数据库配置和代码连接配置的话, 先看看防火墙?

# bindIp: 127.0.0.1

$ mongo
MongoDB shell version v4.4.4
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb

mongo 卡住不动,用 mongodump 的话报错 Failed: can't create session: could not connect to server: server selection error: server selection timeout, current topology

mongodump 报错:Failed: can't create session: could not connect to server: server selection error: server selection timeout, current topology: { Type: Single, Servers: [{ Addr: 127.0.0.1:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : connection(127.0.0.1:27017[-13]) incomplete read of message header: read tcp 127.0.0.1:54658->127.0.0.1:27017: i/o timeout }, ] }

端口允许外网连接么,看看防火墙安全组之类的

在 docker 容器内吗

之前 mysql 遇到类似问题,后来发现需要用 root 权限运行客户端。安全升级的缘故只让用 socket 连。。。

本地连的,不是 docker,试了 sudo 一样,前几天是正常的

卡住的话首先怀疑是防火墙,但是你连的是 127.0.0.1,可以排除防火墙的原因。
sudo netstat -nltp 看下端口是否正常,不过你没有报 'Connection refused' 八成是开着的。

连接的时候 tail 一下 mongodb 日志和系统日志( /var/log/syslog 或者 /var/log/message ),看看有没有什么 warning, error 之类的日志吧。

关闭掉 mongo server,在 27017 端口开启个 web 服务,能访问,排除了端口映射。
mongo 能够进入 mongodb 的 shell 。排除了 mongodb 的问题。

接下来可以锁定是网络配置了。
你在 host 这栏填写主机名,非 ip 名。
如果可以进入,那就是这个问题了。

/var/log/syslog 没看到有报错,mongodb 的日志停留在几天前,停留的那天,我部署了基于 redis 的频率限制,我在想,难道是系统问题

用 telnet 连一下 27017 端口看看通不通,如果不通的话,服务是否有正常运行呢?网站正常的话不会是因为缓存了吧。

还有一个很罕见的问题是 lo 本地回环有问题

似乎只能重启了,准备今晚试试

sudo netstat -nltp 还是看一下端口吧
ps aux | grep mongod 看一下进程状态

你试了连接这个吗?
mongodb://<服务器主机名>:27017

网站试了可以读写

$ telnet 127.0.0.1 27017
Trying 127.0.0.1...
Connected to 127.0.0.1.
$ sudo netstat -nltp
tcp 2088 0 127.0.0.1:27017 0.0.0.0:* LISTEN 3204/mongod

$ ps aux | grep mongod
mongodb 3204 0.5 13.2 2073556 532464 ? Ssl Mar22 1412:17 /usr/bin/mongod --config /etc/mongod.conf

试了 mongo,一样

我记得 mongo 连上 mongod 之后,会先执行一些初始化 shell 的命令,比如 listDb 之类的,很可能是卡在这里了。
你会不会写脚本?用 nodejs/php/python 之类的写个简单的连接脚本,看能不能连上去。
如果能连上去的话,给脚本中加一个 currentOp 的输出。然后执行 mongo 去连接,趁它卡住时,执行一下脚本看看当前都有什么 op 在执行。

python2,确认装了 pymongo,执行这几条看看

from pymongo import MongoClient
client = MongoClient(host="127.0.0.1")
db = client.mydb
print db.current_op(True)

查查防火墙,wireshark 抓包看看

Server selection timed out after 30000 ms
感觉免不了要中断服务,我准备先试下关掉新功能