我们的 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?