我在创建 mongoDB 分片集群时遇到了一些问题。我尝试使用 4 台服务器:3 台用于 mongo 数据库(host1、host2 和 host3),一台用于应用程序端(用于 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
在此之后我尝试配置分片:
蒙戈 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() 失败 Thu Jun 14 21:10:37 [ReplicaSetMonitorWatcher] 尝试重新连接到 host1:27030 Thu Jun 14 21:10:42 [ReplicaSetMonitorWatcher] reconnect host1:27030 failed 无法连接到服务器 host1:27030 Thu Jun 14 21:10:42 [ReplicaSetMonitorWatcher] 尝试重新连接到 host1:27032 Thu Jun 14 21:10:47 [ReplicaSetMonitorWatcher] reconnect host1:27032 failed 无法连接到服务器 host1:27032 Thu Jun 14 21:10:56 [LockPinger] SyncClusterConnection 连接到 [host1:27020]
因此,如果 3 个配置服务器中的任何一个出现故障,mongos 就会出现连接异常。出了什么问题以及如何解决此问题?