MongoDB正在运行,但无法使用shell进行连接

CentOS 5.x Linux与MongoDB 2.0.1(尝试主要和传统静态)

MongoDB正在运行:

root 31664 1.5 1.4 81848 11148 ? Sl 18:40 0:00 ./mongod -f mongo.conf -vvvvv --fork 

使用简单的shell连接到服务器失败:

 [root@xxxx bin]# ./mongo MongoDB shell version: 2.0.1 connecting to: test Mon Oct 31 18:41:32 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84 exception: connect failed 

端口28017上的Web界面加载正常,就像从远程Linux主机使用MongoDB shell一样。 也可以telnet到localhost:27017,这意味着没有端口被阻塞。 在这台机器上也没有运行SELinux。 我也试过显式指定localhost:2017/db无济于事。

 $ ./mongo remote-ip:27017 MongoDB shell version: 2.0.1 connecting to: remote-ip:27017/test > show dbs local 0.03125GB > 

日志完全是关于这个问题的:

 ..... Mon Oct 31 18:40:34 [initandlisten] fd limit hard:1024 soft:1024 max conn: 819 Mon Oct 31 18:40:34 [initandlisten] waiting for connections on port 27017 Mon Oct 31 18:40:34 BackgroundJob starting: snapshot Mon Oct 31 18:40:34 BackgroundJob starting: ClientCursorMonitor Mon Oct 31 18:40:34 BackgroundJob starting: PeriodicTask::Runner Mon Oct 31 18:40:34 [websvr] fd limit hard:1024 soft:1024 max conn: 819 Mon Oct 31 18:40:34 [websvr] admin web console waiting for connections on port 28017 

对mongo shell客户端进行撑持只显示一个有问题的调用:

 [pid 31708] connect(4, {sa_family=AF_INET, sin_port=htons(27017), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EBADF (Bad file descriptor) 

文件系统是干净的,没有ulimit限制(以root身份运行以进行testing)。 我可以从strace中看到, mongo客户端正在尝试通过TCP( AF_INET )进行连接,但由于它是本地的,而且MongoDB创build了一个文件套接字,有没有办法告诉客户端通过它连接呢? 或者更好的是,为什么客户会抛出一个EBADF?

编辑:我基本的Mongo conf:

 dbpath=/root/mongodb-linux-i686-2.0.1/data logpath=/root/mongodb-linux-i686-2.0.1/logs/mongo.log slowms=15 rest=1 

我认为这个版本的mongoDb客户端中缺less一些默认configuration。 尝试运行:

 mongo 127.0.0.1:27017 

这很奇怪,但后来我经历了这个问题走了:)(所以简单的命令“mongo”w / o任何params开始为我工作了)

 [Ubuntu Linux 11.10 x64 / MongoDB 2.0.1] 

你可能想检查你的configuration,看是否设置了bind_ip

bind_ip:127.0.0.1

如果是,那么这只允许本地login。 注释掉,重新启动mongo,这可能有帮助。

我有一个类似的问题,实际上是一样的(mongo进程正在运行,但无法连接到它)。 我所做的是去我的数据库path,并删除了mongod.lock,然后再给它一个尝试(重新启动mongo)。 之后,它的工作。

希望它也适用于你。 在Ubuntu的MongoDB修复

删除/var/lib/mongodb/mongod.lock ,然后发出sudo service mongodb start ,然后mongo

我有同样的问题。 在我的情况下, MongoDB服务器没有运行。

尝试在您的networking浏览器中打开它:

http://localhost:28017

如果你不能,这意味着你必须启动MongoDB服务器。

在另一个terminal选项卡中运行mongod 。 然后在你的主选项卡中运行mongo ,这是连接到你的MongoDB服务器的shell。

这实际上不是一个错误…这里发生的是Mongo依靠一个守护进程来运行本地数据库服务器,所以为了“启动”shell中的mongo服务器 ,你必须启动mongo服务第一。

对于Fedora Linux (这是我使用的发行版)你必须运行这些命令:

 1 sudo service mongod start 2 mongo 

在那里,你有它! 服务器即将运行。 现在,如果您希望Mongo服务在系统引导时启动,那么您必须运行:

 sudo chkconfig --levels 235 mongod on 

就这样! 如果你这样做,现在在shell中,你只需要键入mongo来启动服务器,但这是非常多的,问题是你必须先启动服务,然后服务器:)

PS我发布的命令可能也适用于其他Linux发行版,而不仅仅是在Fedora …如果没有,也许你不得不根据你使用的发行版调整一些单词 ;)

我也有这个问题。 你的MongoDB日记? 我注意到日志文件中的以下“预分配”条目。 一旦我看到最后一行“等待端口连接”,我可以连接。 请注意,这个“更快”的模式需要12分钟才能初始化。

威廉

 Tue Apr 17 16:48:01 [initandlisten] MongoDB starting : pid=2248 port=27017 dbpath=E:\MongoData 64-bit host=ME Tue Apr 17 16:48:01 [initandlisten] db version v2.0.0-rc0, pdfile version 4.5 Tue Apr 17 16:48:01 [initandlisten] git version: 8d4bf50111352cee5a4f1abf25b63442d6c45dc4 Tue Apr 17 16:48:01 [initandlisten] build info: windows (6, 1, 7601, 2, 'Service Pack 1') BOOST_LIB_VERSION=1_42 Tue Apr 17 16:48:01 [initandlisten] options: { bind_ip: "ip", dbpath: "E:\MongoData", directoryperdb: true, journal: true, logpath: "E:\MongoData\mongo.log", quiet: true, rest: true, service: true } Tue Apr 17 16:48:01 [initandlisten] journal dir=E:/MongoData/journal Tue Apr 17 16:48:01 [initandlisten] recover : no journal files present, no recovery needed Tue Apr 17 16:48:02 [initandlisten] preallocateIsFaster=true 9.68 Tue Apr 17 16:48:04 [initandlisten] preallocateIsFaster=true 8.44 Tue Apr 17 16:48:06 [initandlisten] preallocateIsFaster=true 9.68 Tue Apr 17 16:48:06 [initandlisten] preallocateIsFaster check took 4.921 secs Tue Apr 17 16:48:06 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.0 Tue Apr 17 16:52:37 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.1 Tue Apr 17 16:56:54 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.2 Tue Apr 17 17:01:42 [initandlisten] waiting for connections on port 27017 Tue Apr 17 17:01:42 [websvr] admin web console waiting for connections on port 28017 

面对同样的问题与上面Garrett描述的错误。 1.启用日记function的MongoDB服务器正在使用ps命令运行。2. Mongo客户端或Mongoose驱动程序无法连接到数据库。

解决scheme: 1.删​​除Mongo.lock文件似乎在CentOS服务器上恢复正常。 2.我们在生产MongoDB方面相当新,而且每周看到同样的问题出现几次。 3.我们已经设置了一个cron时间表来定期清理locking文件,并密切发生事件发生的pipe理员。

寻找一个错误修复这个问题或任何其他更永久的方式来解决它。

如果你的bind_ip设置为127.0.0.1以外的任何东西,那么你甚至需要从本地机器上明确的添加ip。 因此,只需使用本地盒子上远程盒子上使用的相同方法即可。 至less这对我来说是什么。

默认情况下,mongodb被configuration为仅侦听本地主机。 摘自mongodb的默认configuration文件:

 # Listen to local interface only. Comment out to listen on all interfaces. bind_ip=127.0.0.1 

需要注释bind_ip以从外部实体侦听。

除非您开始监听非本地接口,否则无法添加碎片。

HTH,

Abhay Dandekar

打开文件/etc/mongod.conf并将连接的机器的ip添加到bind_ip

bind_ip = 127.0.0.1, 您的远程机器IP地址在这里

例如: –

 bind_ip = 127.0.0.1,192.168.1.5 

重启mongodb服务:

 sudo service mongod restart 

确保在防火墙中打开了mongodb端口。

如果你不担心安全问题,你也可以评论这一行。

不是一个答案,而是一个更简单的方法:我刚刚find答案,并通过searchfind了这个问题。 这是我的经验的细节:

壳错误

 markdsievers@ip-xx-xx-xx-xx:~$ mongo MongoDB shell version: 2.0.1 connecting to: test Wed Dec 21 03:36:13 Socket recv() errno:104 Connection reset by peer 127.0.0.1:27017 Wed Dec 21 03:36:13 SocketException: remote: 127.0.0.1:27017 error: 9001 socket exception [1] server [127.0.0.1:27017] Wed Dec 21 03:36:13 DBClientCursor::init call() failed Wed Dec 21 03:36:13 Error: Error during mongo startup. :: caused by :: DBClientBase::findN: transport error: 127.0.0.1 query: { whatsmyuri: 1 } shell/mongo.js:84 exception: connect failed 

蒙戈日志显示

 Wed Dec 21 03:35:04 [initandlisten] connection accepted from 127.0.0.1:50273 #6612 Wed Dec 21 03:35:04 [initandlisten] connection refused because too many open connections: 819 

这也许表明另一个答案(JaKi)正在经历同样的事情,一些连接被清除并且再次访问shell(其他客户)

我没有看到这个答案还没有被接受,所以我只会加上我的2美分。

我刚刚有同样的问题。 过了一段时间,我意识到我已经locking本地主机在我的iptables规则。 所以,检查你的防火墙。

在Ubuntu上:

Wed Jan 27 10:21:32错误:无法连接到服务器127.0.0.1 shell / mongo.js:84exception:连接失败

通过以下命令查找mongodb是否正在运行:

 ps -ef | grep mongo 

如果mongo没有运行,你会得到:

  vimal 1806 1698 0 10:11 pts/0 00:00:00 grep --color=auto mongo 

你看到那个mongo守护进程不在那里

然后通过configuration文件(使用root priev)启动它:

 root@vimal:/data# mongod --config /etc/mongodb.conf & [1] 2131 root@vimal:/data# all output going to: /var/log/mongodb/mongodb.log 

你可以看到其他的细节:

 root@vimal:~# more /etc/mongodb.conf 

打开一个新的terminal来查看mongod –config /etc/mongodb.conf的结果,然后键入mongo。 它应该是运行或grep

 root@vimal:/data# ps -ef | grep mongo root 3153 1 2 11:39 ? 00:00:23 mongod --config /etc/mongodb.conf root 3772 3489 0 11:55 pts/1 00:00:00 grep --color=auto mongo 

现在

 root@vimal:/data# mongo MongoDB shell version: 2.0.4 connecting to: test 

你得到了mongoDB shell

这不是故事的结尾。 我将发布修复方法,以便每次自动启动,大多数开发机器每天关机,VM必须在下次启动时自动启动mongo。

mongod启动后

 $mongod --dbpath <db name> 

得到壳

 $mongo --shell 

我发现这非常有用。

如果您收到以下消息

 start: Rejected send message, 1 matched rules; type="method_call", sender=":1.84" (uid=1000 pid=3215 comm="start mongodb ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init") shriprasad@shriprasad-HP-430-Notebook-PC:/var/lib/mongodb$ mongo 

您必须尝试以非root用户身份启动mongodb服务。 您必须是root用户。 因此以root身份login,然后运行以下命令,如下所示:

 sudo bash 

其次是

 service mongodb start