Spring Boot 连接到运行的 mongo 容器的 MongoDB 副本集

Posted

技术标签:

【中文标题】Spring Boot 连接到运行的 mongo 容器的 MongoDB 副本集【英文标题】:Spring boot connect to MongoDB replica set of mongo container running 【发布时间】:2019-06-02 20:27:31 【问题描述】:

我设置了 2 个具有 27017:27017 和 27018:27017 作为端口的 mongo 容器。 mongo1 设置为主要,而 mongo2 设置为辅助并使用副本集。

mongo1 作为主节点同时具有写、读访问权限,而 mongo2 仅具有读访问权限

spring.data.mongodb.uri = mongodb://abc.xyz:27017/user_demo   
//monog1, abc.xyz is the hostname

spring.data.mongodb.uri = mongodb://abc.xyz:27018/user_demo   
//mongo2

如果我在我的普通 Spring Boot 程序中只连接 monogo1,它可以工作(读、写),如果我设置 mongo2 它可以工作(只读),但是当我将两者都设置在一行中时,它会出错

spring.data.mongodb.uri = mongodb://abc.xyz:27017,abc.xyz:27018/user_demo?replicaSet=idea-mongo-set

我通过存储在 mongo1 中检查了副本集是否正常工作,在 mongo2 中我可以读取

那么,最后一行有什么问题。有没有其他方法来存储副本集的uri

在官方spring site 中给出了

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test

我得到的错误是这个

2019-01-08 15:56:35.245  INFO 29804 --- [           main] c.j.bootifulmongodb.BootMongoDBApp       : Started BootMongoDBApp in 3.603 seconds (JVM running for 4.373)
2019-01-08 15:56:54.466  INFO 29804 --- [azure.com:27018] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server abc.xyz:27018
com.mongodb.MongoSocketOpenException: Exception opening socket
        at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongodb-driver-core-3.4.3.jar:na]
        at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongodb-driver-core-3.4.3.jar:na]
        at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) ~[mongodb-driver-core-3.4.3.jar:na]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_181]
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_181]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_181]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_181]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_181]
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_181]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
        at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[mongodb-driver-core-3.4.3.jar:na]
        at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongodb-driver-core-3.4.3.jar:na]
        ... 3 common frames omitted

【问题讨论】:

请同时加上你得到的错误,it gives an error 太笼统了 副本集前面为什么有两个问号? 我明白了。昨天我在努力。今天我试了不提replica set,然后加了,可能是teo '?'我加错了 我忘记添加 Sven。谢谢 【参考方案1】:

您的 uri 似乎在连接到副本集的正确轨道上。

spring.data.mongodb.uri = mongodb://abc.xyz:27017,abc.xyz:27018/user_demo?replicaSet=idea-mongo-set

这里省略凭据(用户,密码)只是一个错字吗?

这个确切的语法是我们用于副本集连接 uri 的语法:

mongodb://user:pwd@server1:27017,server2:27017,server3:27017/our_collection?replicaSet=replica_set_name&authSource=authagainstthiscollection&authMechanism=SCRAM-SHA-1

【讨论】:

我没有使用任何用户。我使用的是默认的,就像你对 server2 所做的那样。不是用户名和密码选项吗(如果未创建用户)。感谢您的快速回复。 你知道 John 为什么我的 uri 不工作吗? 否,因为您的 uri 语法是正确的。显然,当它尝试连接到其中一个副本时,它正在超时。 但我可以单独使用两者。第二个副本是只读模式。我想我知道为什么会出现这个问题。在我的应用程序启动中,我正在将数据加载到数据库。但是,第二个只有读取权限。也许这就是它无法阅读的原因。但是,不是第一个 URL 会运行吗,如果不工作,第二个会运行吗?【参考方案2】:

因为你在mongors.initiate中设置了abc.xyz:27018主机名,所以客户端会尝试直接访问这个主机名。但是客户端无法访问此主机名,它只是您的 azure 集群中的 FQDN。

我认为这份文件会对你有所帮助clients use the hostnames listed in the replica set config not the seed list

【讨论】:

看起来有帮助。您能否在答案中删除此 URL 并提供 abc.xyz:27018

以上是关于Spring Boot 连接到运行的 mongo 容器的 MongoDB 副本集的主要内容,如果未能解决你的问题,请参考以下文章

将 Spring boot Container 连接到 Mongo Container: java.net.UnknownHostException: mongo: System error?

Spring Boot Starter-Web 尝试在启动时连接到 Mongo

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?

连接到多个 mongo db 主机并在 spring boot 中使用不同的数据库进行身份验证

将 Spring Boot 连接到 MongoLab 的 MongoDB 版本 3.0.7 时出现问题

无法在 Docker-Compose 中使用 Spring Boot 连接到 MongoDB