MongoDB副本集补丁重启后应用无法连接从节点 所有请求均路由至主节点
MongoDB读偏好配置失效及连接异常排查思路
- 首先验证副本集节点状态
- 登录主节点执行
rs.status(),确认所有从节点状态为SECONDARY,排除节点处于STARTUP2、ROLLBACK、DOWN等不可用状态的情况,若所有从节点不可用,MongoDB会自动将读请求降级到主节点 - 执行
rs.printSecondaryReplicationInfo()查看从节点同步延迟,如果延迟超过配置的maxStalenessSeconds=120,读请求会自动路由到主节点 - 执行
rs.conf()检查节点配置,排除从节点被设置为hidden、delayed、arbiter类型的情况,这类节点不会接收普通读请求
- 登录主节点执行
- 验证网络与域名解析状态
- 用
nslookup分别解析三个节点的域名,确认返回的IP和实际节点IP一致,若域名解析错误全部指向主节点,会导致所有连接都路由到主节点 - 用
nc -zv <节点IP> 27017验证客户端到所有从节点27017端口的连通性,若客户端无法连接从节点,会自动降级路由到主节点
- 用
- 排查连接参数与版本兼容性问题
- 简化连接串测试,去掉
maxStalenessSeconds参数后再用shell连接:mongo "mongodb://db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&readPreference=secondary",若可正常连接,说明存在参数兼容性问题,maxStalenessSeconds仅支持MongoDB 3.4及以上版本,低版本服务端会导致参数解析异常 - 给mongo shell加上
-vvvv参数启动输出详细调试日志,定位连接终止的具体环节:mongo -vvvv "mongodb://db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&readPreference=secondary&maxStalenessSeconds=120"
- 简化连接串测试,去掉
- 排查系统层面配置异常
- 检查补丁升级后服务器的iptables、安全组规则,确认没有主动断开MongoDB长连接的规则,也没有限制从节点端口访问的配置
- 调整MongoDB服务端日志级别为
db.setLogLevel(1, "network"),重新发起连接查看是否有网络层面的报错日志 - 检查MongoDB进程的ulimit限制,确认打开文件数、进程数限制足够,资源不足时新连接会被直接终止且不会生成相关日志
- 验证应用驱动配置
- 确认应用使用的MongoDB驱动版本,部分旧版本驱动存在读偏好参数解析bug,若补丁升级后对应运行环境(JDK、Node.js等)有版本变动,会导致配置失效
- 重启应用进程重建连接池,排除旧连接池未加载配置的问题
内容的提问来源于stack exchange,提问作者Vijay S
相关产品推荐
相关产品推荐

