MongoDB,分片问题:配置服务器崩溃后失败的mongos进程

时间:2012-06-15 09:21:04

标签: mongodb replication sharding

我在创建mongoDB分片群集时遇到了一些问题。 我尝试使用4台服务器:3台用于mongo数据库(host1,host2和host3),1台用于应用程序端(用于mongos进程)。在每个数据库服务器上,我启动4个进程:

$ mongod --configsvr --smallfiles --noprealloc --port 27020 --dbpath /mongodb/conf --logappend --logpath=/mongodb/logs/logsmongodcfg.log
$ mongod --shardsvr  --smallfiles --noprealloc --replSet repl1 --port 27030 --dbpath /mongodb/repl1 --logappend --logpath=/mongodb/logs/mongod_shard1.log
$ mongod --shardsvr  --smallfiles --noprealloc --replSet repl2 --port 27031 --dbpath /mongodb/repl2 --logappend --logpath=/mongodb/logs/mongod_shard2.log
$ mongod --shardsvr  --smallfiles --noprealloc --replSet repl3 --port 27032 --dbpath /mongodb/repl3 --logappend --logpath=/mongodb/logs/mongod_shard3.log

正如您在群集中的每个服务器上看到的,我们有一个配置服务器和3个mongod服务器用于复制实现。 在应用程序服务器上,我只启动一个mongos进程:

mongos --configdb host1:27020,host2:27020,host3:27020 --port 27017 --logappend --logpath=/var/log/mongo/mongos.log

在此之后我尝试配置分片:

mongo 127.0.0.1:27017/admin
db.runCommand( { addShard : "repl1/host1:27030,host2:27030,host3:27030" } );
db.runCommand( { addShard : "repl2/host1:27031,host2:27031,host3:27031" } );
db.runCommand( { addShard : "repl3/host1:27032,host2:27032,host3:27032" } );

这个计划正在运作,但有一个大问题。如果我尝试关闭其中一个主机,则mongos无法连接到其他主机和新的主复制。 在mongos日志中,我得到了这样的信息:

Thu Jun 14 21:10:37 [CheckConfigServers] DBClientCursor::init call() failed
Thu Jun 14 21:10:37 [ReplicaSetMonitorWatcher] trying reconnect to host1:27030
Thu Jun 14 21:10:42 [ReplicaSetMonitorWatcher] reconnect host1:27030 failed couldn't connect to server      host1:27030
Thu Jun 14 21:10:42 [ReplicaSetMonitorWatcher] trying reconnect to host1:27032
Thu Jun 14 21:10:47 [ReplicaSetMonitorWatcher] reconnect host1:27032 failed couldn't connect to server host1:27032
Thu Jun 14 21:10:56 [LockPinger] SyncClusterConnection connecting to [host1:27020]

因此,如果3个配置服务器中的任何一个发生故障,mongos会出现连接异常。有什么问题以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

所以,这里有几件事。首先,如果你没有运行2.0.6,那么更新到它 - 这里有几个相关的修复(比如https://jira.mongodb.org/browse/SERVER-2988实际上已经在2.0.5中修复了,但是在2.0中还有一些其他的好东西。 .6)如果你在配置服务器启动时启动mongos会有所帮助。

接下来,如果关闭配置服务器,您的群集元数据将变为只读,并且mongos无法执行多项操作(如平衡,拆分等),直到配置服务器重新联机。所以,它会抱怨一个人在你恢复之前就已经失败了。

副本集监视器线程类似地将继续ping副本集的成员,这些成员已关闭并且无法连接到它们(它实际上不是ICMP ping,而是TCP连接尝试)。

基本上这些日志消息是预期的,直到你重新开始。