【问题标题】:MongoDB, sharding problems: fail mongos process after config server was crashedMongoDB,分片问题:配置服务器崩溃后 mongos 进程失败
【发布时间】:2012-06-15 09:21:04
【问题描述】:

我在创建 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

之后我尝试配置分片:

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() 失败
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 就会出现连接异常。出了什么问题以及如何解决这个问题?

【问题讨论】:

    标签: mongodb replication sharding


    【解决方案1】:

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

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

    副本集监控线程同样会继续 ping 已关闭且无法连接到它们的副本集成员(这实际上不是 ICMP ping,而是 TCP 连接尝试)。

    基本上,这些日志消息是预期的,直到您恢复正常。

    【讨论】:

    • Mongo 版本为 2.0.6。我本地化了我的问题。它与主机名和 Amazon EC2 服务器相连。当某些配置出现故障时,mongos 无法解析它的 DNS-name 并且也会出现故障。在这种情况下不知道该怎么办
    • 如果失败的 DNS 解析导致 mongos 崩溃,那么这应该很容易重现 - 如果是这样,你应该提交一个关于它的错误:jira.mongodb.org/browse/SERVER
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 2023-01-18
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多