mongosh执行--eval副本集查询返回结果后未退回bash提示符问题
mongosh执行副本集查询后无法退回bash提示符问题解决方案
问题根因
当前主机与MongoDB副本集部分节点的网络连通异常。mongosh执行完--eval指定的查询逻辑后,默认会自动同步副本集最新拓扑状态,若存在节点的27010端口被当前网络的ACL/防火墙拦截、或路由不可达,mongosh会持续等待连接超时,不会主动退出进程。
因其他子网主机执行同命令正常,可完全排除mongosh版本、命令语法本身的问题。
验证方法
在故障主机上分别测试3个副本集节点的端口连通性,可定位异常节点:
nc -zv xx.yy.zz.kk 27010 nc -zv xx.yy.zz.ll 27010 nc -zv kk.yy.zz.ff 27010
正常会返回succeeded!提示,异常节点会返回超时/连接拒绝。
解决方案
- 永久修复:排查当前主机到所有异常节点的网络策略,放开27010端口的访问限制、修正路由配置即可。
- 临时 workaround 1:在
--eval的JS逻辑末尾添加quit()强制进程执行完查询后主动退出,修改后命令如下:
mongosh mongodb://xx.yy.zz.kk:27010,xx.yy.zz.ll:27010,kk.yy.zz.ff:27010/somedb --username someuser --password somepassword --authenticationDatabase admin --eval 'db.getCollection("somecollection").findOne(); quit();'
- 临时 workaround 2:在连接串中添加
directConnection=true参数,指定mongosh仅连接第一个可用节点,不需要同步副本集全量拓扑,执行完查询会直接退出:
mongosh "mongodb://xx.yy.zz.kk:27010,xx.yy.zz.ll:27010,kk.yy.zz.ff:27010/somedb?directConnection=true" --username someuser --password somepassword --authenticationDatabase admin --eval 'db.getCollection("somecollection").findOne();'
内容的提问来源于stack exchange,提问作者iriseth
相关产品推荐
相关产品推荐

