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
相关产品推荐
相关产品推荐

