You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot连接Docker部署MongoDB偶现No route to host问题求助

Spring Boot连接Docker MongoDB偶发NoRouteToHostException问题排查

问题描述

3.3.5版本Spring Boot应用,依赖spring-boot-starter-data-mongodb,连接Docker部署的MongoDB(端口映射0.0.0.0:27018:27017)时偶发失败,错误日志如下:

2024-11-07T14:34:07.061+01:00  INFO 16657 --- [middleware] [  restartedMain] org.mongodb.driver.client                : MongoClient with metadata {"driver": {"name": "mongo-java-driver|sync|spring-boot", "version": "5.0.1"}, "os": {"type": "Darwin", "name": "Mac OS X", "architecture": "aarch64", "version": "15.0.1"}, "platform": "Java/Oracle Corporation/23.0.1+11-39"} created with settings MongoClientSettings{readPreference=primary, writeConcern=WriteConcern{w=null, wTimeout=null ms, journal=null}, retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null}, credential=null, transportSettings=null, commandListeners=[io.micrometer.core.instrument.binder.mongodb.MongoMetricsCommandListener@265cb4df], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql.ExpressionCodecProvider@4f9bccaf, com.mongodb.Jep395RecordCodecProvider@8d2b261, com.mongodb.KotlinCodecProvider@6d8951c9]}, loggerSettings=LoggerSettings{maxDocumentLength=1000}, clusterSettings={hosts=[10.11.11.11:27018], srvServiceName=mongodb, mode=SINGLE, requiredClusterType=UNKNOWN, requiredReplicaSetName='null', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='15 ms'}, socketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=0, receiveBufferSize=0, proxySettings=ProxySettings{host=null, port=null, username=null, password=null}}, heartbeatSocketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=10000, receiveBufferSize=0, proxySettings=ProxySettings{host=null, port=null, username=null, password=null}}, connectionPoolSettings=ConnectionPoolSettings{maxSize=100, minSize=0, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[io.micrometer.core.instrument.binder.mongodb.MongoMetricsConnectionPoolListener@11ae6387], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=false, invalidHostNameAllowed=false, context=null}, applicationName='null', compressorList=[], uuidRepresentation=JAVA_LEGACY, serverApi=null, autoEncryptionSettings=null, dnsClient=null, inetAddressResolver=null, contextProvider=null}
2024-11-07T14:34:07.078+01:00  INFO 16657 --- [middleware] [01.11.11:27018] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 10.11.11.11:27018

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.lambda$open$0(SocketStream.java:86) ~[mongodb-driver-core-5.0.1.jar:na]
    at java.base/java.util.Optional.orElseThrow(Optional.java:403) ~[na:na]
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:86) ~[mongodb-driver-core-5.0.1.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:201) ~[mongodb-driver-core-5.0.1.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) ~[mongodb-driver-core-5.0.1.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:153) ~[mongodb-driver-core-5.0.1.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:1575) ~[na:na]
Caused by: java.net.NoRouteToHostException: No route to host
    at java.base/sun.nio.ch.Net.connect0(Native Method) ~[na:na]
    at java.base/sun.nio.ch.Net.connect(Net.java:589) ~[na:na]
    at java.base/sun.nio.ch.Net.connect(Net.java:578) ~[na:na]
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583) ~[na:na]
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
    at java.base/java.net.Socket.connect(Socket.java:760) ~[na:na]
    at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:76) ~[mongodb-driver-core-5.0.1.jar:na]
    at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:105) ~[mongodb-driver-core-5.0.1.jar:na]
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:80) ~[mongodb-driver-core-5.0.1.jar:na]
    ... 4 common frames omitted

注:MongoDB Compass始终能正常连接,问题为偶发。

排查思路

1. 网络链路稳定性检查

  • 持续执行ping 10.11.11.11和telnet 10.11.11.11 27018,观察是否存在丢包、延迟突变或连接中断情况
  • 检查MongoDB所在服务器的防火墙规则,确认27018端口入站规则允许Spring Boot应用主机IP访问,排除规则动态变更导致的拦截
  • 确认应用环境无隐性代理(日志显示当前无代理配置,但需排查系统级代理设置)

2. 调整MongoDB客户端连接参数

修改application.properties配置,优化连接容错:

# 延长连接超时与服务器选择超时
spring.data.mongodb.connect-timeout=30000
spring.data.mongodb.server-selection-timeout=60000
# 优化连接池与重试策略
spring.data.mongodb.retry-writes=true
spring.data.mongodb.connection-pool.max-size=50
spring.data.mongodb.connection-pool.max-wait-time=120000

若应用与MongoDB容器在同一宿主机,尝试改用localhost:27018连接,避免网卡路由波动影响

3. Docker容器与MongoDB服务检查

  • 查看MongoDB容器日志:docker logs <容器ID>,检查是否存在服务重启、连接数耗尽等异常
  • 调整MongoDB最大连接数:启动容器时添加参数--maxConns 1000(根据服务器资源调整)
  • 尝试切换容器网络模式为host,排除端口映射的潜在问题

4. Java应用网络栈排查

  • 检查应用主机网卡状态:执行ifconfig/ip addr,确认无偶发断连情况
  • 升级MongoDB驱动版本:当前使用5.0.1,可尝试升级至Spring Boot 3.3.5兼容的最新稳定版,修复已知网络连接bug
  • 添加JVM参数-Djava.net.preferIPv4Stack=true,禁用IPv6支持,避免路由冲突

内容的提问来源于stack exchange,提问作者bbx402

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:28:16