我们的MongoDB设置使用三个副本集分片。每个 Web 服务器在本地运行一个 mongos 实例,客户端节点.js进程使用 Mongoose (3.6.20) 和 node-mongodb-native 通过该实例进行连接。所以node-mongodb-native只是连接到本地主机上的mongos。
当一个副本集主节点严重关闭时(我们可以通过在主副本上执行"ifdown eth0"来模拟这一点),mongos 会正确检测到这一点,并且还会检测到新的主节点已被选中。目前为止,一切都好。但是node-mongodb-native与mongos实例的连接仍然打开,但不起作用,并且需要重新启动节点进程。
我们的假设是,mongos只会杀死任何与死主节点的已建立连接,并且node-mongodb-native会重新连接,但事实似乎并非如此;服务器和操作系统都认为这些连接是开放的。相比之下,在主降压时,客户端可以很好地进行故障转移,连接将关闭并重新打开。
我们正在查看socketTimeoutMS,但这似乎不正确,因为它会导致仅空闲的连接断开连接。
我们是否缺少客户端或 mongo 的配置,或者我们必须实现自己的 ping?
基于实验和以下MongoDB错误,这似乎只是mongos(或者,如果你愿意的话,客户端库)在这一点上的缺点。现在它看起来像"在你的应用程序中编写你自己的ping逻辑,并在失败时触发重新连接",所以这就是我们正在做的事情。
https://jira.mongodb.org/browse/SERVER-9041