0

我们的 MongoDB 设置使用三个副本集分片。每个网络服务器在本地运行一个 mongos 实例,客户端 node.js 进程使用 Mongoose (3.6.20) 和 node-mongodb-native 通过该实例进行连接。所以 node-mongodb-native 只是连接到本地主机上的 mongos。

当一个副本集主节点严重宕机时(我们可以通过在主节点上执行 'ifdown eth0' 来模拟这种情况),mongos 会正确检测到这一点,并且还会检测到新的主节点已被选举。到目前为止,一切都很好。但是 node-mongodb-native 与 mongos 实例的连接仍然打开但无法正常工作,并且需要重新启动 node procs。

我们的假设是 mongos 只会终止与已死主节点的任何已建立连接,并且 node-mongodb-native 会重新连接,但情况似乎并非如此;服务器和操作系统都认为这些连接是打开的。相比之下,在主要 stepDown 中,客户端故障转移正常,连接关闭并重新打开。

我们正在查看 socketTimeoutMS,但这似乎不正确,因为它会导致仅空闲的连接断开连接。

我们是否缺少对客户端或 mongos 的配置,或者我们是否必须实现自己的 ping?

4

1 回答 1

0

基于实验和以下 MongoDB 错误,这似乎只是 mongos(或者,如果您愿意,客户端库)在这一点上的一个缺点。现在它看起来像“在你的应用程序中编写你自己的 ping 逻辑并在失败时触发重新连接”,所以这就是我们正在做的事情。

https://jira.mongodb.org/browse/SERVER-9041

于 2013-10-18T05:48:53.343 回答