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