我正在设置一个Spring Boot微服务来管理Mongo数据库上的数据,因为我需要保持一些事务性的步骤,所以我不得不使用bitnami mongo映像来建立一个Mongo集群。该集群似乎可以正常工作,我已经毫无问题地将其连接到mongo-express了。但是,当我尝试从应用程序连接到它时,我会不断失去连接。
问题似乎是我提供的用于连接的IP(即远程主机)与Mongo内部的IP(即docker IP)不同。可以理解的是情况确实有所不同,但这将我拒之门外。我还没有找到使连接保持打开状态的解决方案,有什么主意吗?
我已经检查了mongo配置,并将bindIPAll设置为true,所以如果我没有记错的话,它应该接受每个IP的连接,是吗?
这是我的Spring Boot属性:
spring.data.mongodb.uri = mongodb:// user:password @ == ip-1 ==:27017,== ip-1 ==:27018,== ip-1 ==:27019 / matchmaker ?replicaSet =复制副本
我使用样板式Spring Boot,所以这是我对MongoDb群集的唯一配置
以下是一个连接的日志:
-
2019-07-01 11:23:01.847 org.mongodb.driver.cluster:将发现的服务器== ip-1 ==:27019添加到集群的客户端视图
-
2019-07-01 11:23:02.102 org.mongodb.driver.connection:打开到== ip-1 ==:27019的连接[connectionId {localValue:2,serverValue:19}]
- 2019-07-01 11:23:02.161 org.mongodb.driver.cluster:监视线程已成功连接到服务器并带有描述ServerDescription {address === ip-1 ==,type = REPLICA_SET_ARBITER,state = CONNECTED,ok = true,版本= ServerVersion {versionList = [4,0,10]},minWireVersion = 0,maxWireVersion = 7,maxDocumentSize = 16777216,logicalSessionTimeoutMinutes = 30,roundTripTimeNanos = 56078089,setName ='replicaset',canonicalAddress === ip- 2 ==:27017,主机= [== ip-3 ==:27017,== ip-4 ==:27017],被动= [],仲裁器= [== ip-2 ==:27017],主要='== ip-3 ==:27017',tagSet = TagSet {[]},electionId = null,setVersion = 3,lastWriteDate = Mon Jul 01 11:22:58 CEST 2019,lastUpdateTimeNanos = 9210136534468}
- 2019-07-01 11:23:02.167 org.mongodb.driver.cluster:服务器== ip-1 ==:27019不再是副本集的成员。从群集的客户端视图中删除。
- 2019-07-01 11:23:02.169 org.mongodb.driver.cluster:规范地址== ip-2 ==:27017与服务器地址不匹配。从群集的客户端视图中删除== ip-1 ==:27017
谢谢!
更新
我找到了一个解决方案,但这并不是最佳选择,所以我将继续公开这个问题,也许有人可以帮助我。
这是我所做的:
- 为群集的三个映像(例如mongo-primary:27017,mongo-secondary:27018,mongo-arbiter:27019)添加了具有专用名称和端口的MONGODB_ADVERTISED_HOSTNAME和MONGODB_PORT_NUMBER。
- 在我的本地主机文件中添加了这三个指向远程主机的主机名(mongo-primary ...)
- 在Spring Boot属性中,我在mongo uri中添加了这三个主机名