MongoDB,分片问题: fail mongos process after config server was crashed

标签 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 都会出现连接异常。这是什么问题以及如何解决这个问题?

最佳答案

所以,这里有几件事。首先,如果您没有运行 2.0.6,则更新它 - 这里有几个相关的修复(例如 https://jira.mongodb.org/browse/SERVER-2988 实际上已在 2.0.5 中修复,但 2.0.6 中还有其他一些不错的功能) )如果您在配置服务器关闭的情况下启动 mongos,这会有所帮助。

接下来,如果您关闭配置服务器,您的集群元数据将变为只读,并且 mongos 无法执行多项操作(例如平衡、拆分等),直到配置服务器重新上线。因此,它会提示一个已关闭的事实,直到您将其恢复为止。

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

基本上,在您恢复之前,这些日志消息都是预期的。

关于MongoDB,分片问题: fail mongos process after config server was crashed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11047887/

相关文章:

Azure Cosmos DB 中托管的 MongoDB : Sharding vs partitioning

mysql - 数据库分片与分区

node.js - 通过 Node.js 将图像插入 MongoDB

sql-server - 是否可以使用 Transact SQL 监视事务复制

node.js - 使用 mongodb 聚合将子文档合并到主文档

CouchDB 复制覆盖文档

MySQL 从属 I/O 线程未运行

node.js - node.js 原生 mongodb 驱动程序在运行 db.command({aggregate : . ..}) 时返回 "not master"错误

MongoDB WiredTiger 存储引擎 cacheSizeGB 配置选项

mongodb - 在 Mongoose 中使用连接和过滤器进行查询