百思不得其解的 MongoDB 问题:服务正常,但连接不上
我有个网站用的是 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
感觉免不了要中断服务,我准备先试下关掉新功能
我看京东价钱 1690 ,主要是看网上评价软件做的不行,但是好在硬件还行?买它的话就是单纯买硬件了,然后刷个黑群晖来用 极空间 z4pro 16G 四盘位京东价 2280 ,就…
SmokeScreen是这样一个开源软件,它可以把Flash的swf文件转成Javascript/HTML5,它的口号是:Flash without plugin。为什么要这样…
还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西。你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可…