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 中使用不同的数据库进行身份验证