Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java连接到在Docker中运行的MongoDB副本集

使用Java连接到在Docker中运行的MongoDB副本集
EN

Stack Overflow用户
提问于 2017-12-27 21:28:12
回答 2查看 7K关注 0票数 7

我想用docker设置一个MongoDB副本集。设置看起来不错,但是我无法使用我的Java应用程序连接到集群。我在Windows10上运行Docker17.06.0-ce版本,驱动程序为VirtualBox。

我遵循了本教程中的说明:http://www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/

因此,我首先在docker中创建了my-mongo-cluster网络,并使用以下命令运行了3个容器:

代码语言:javascript
运行
AI代码解释
复制
$ docker run --name mongo1 -d --net mongo-cluster -p 9042:27017 mongo:3.6.0 mongod --replSet my-mongo-set
$ docker run --name mongo2 -d --net mongo-cluster -p 9142:27017 mongo:3.6.0 mongod --replSet my-mongo-set
$ docker run --name mongo3 -d --net mongo-cluster -p 9242:27017 mongo:3.6.0 mongod --replSet my-mongo-set

然后我连接到mongo1容器,并使用以下配置设置副本集:

代码语言:javascript
运行
AI代码解释
复制
config = {"_id" : "my-mongo-set", "members" : [{"_id" : 0,"host" : "mongo1:27017"},{"_id" : 1,"host" : "mongo2:27017"},{"_id" : 2,"host" : "mongo3:27017"}]}
rs.initiate(config)

这似乎工作得很好。从mongo1容器的日志可以看出,所有容器都是相互连接的。

现在,我正在尝试从我的Java应用程序连接到副本集。我使用的是mongodb驱动程序3.6.0版。这是我用来连接到docker中运行的副本集的代码:

代码语言:javascript
运行
AI代码解释
复制
List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9042));
serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9142));
serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9242));

MongoClient client = new MongoClient(serverAddresses);

这是日志输出(对于mongo1:27017和mongo2:27017,末尾的MongoSocketException也会出现):

代码语言:javascript
运行
AI代码解释
复制
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Cluster created with settings {hosts=[192.168.99.100:9042, 192.168.99.100:9142, 192.168.99.100:9242], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server 192.168.99.100:9042 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server 192.168.99.100:9142 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server 192.168.99.100:9242 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Cluster description not yet available. Waiting for 30000 ms before timing out
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Opened connection [connectionId{localValue:2, serverValue:5}] to 192.168.99.100:9142
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Opened connection [connectionId{localValue:1, serverValue:14}] to 192.168.99.100:9042
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Opened connection [connectionId{localValue:3, serverValue:5}] to 192.168.99.100:9242
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9242, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=5002651, setName='my-mongo-set', canonicalAddress=mongo3:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=null, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549516217673}
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9142, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=5542139, setName='my-mongo-set', canonicalAddress=mongo2:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=null, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549516254709}
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9042, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=4113767, setName='my-mongo-set', canonicalAddress=mongo1:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000001, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549515190458}
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Discovered cluster type of REPLICA_SET
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server mongo3:27017 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server mongo2:27017 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Adding discovered server mongo1:27017 to client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Canonical address mongo2:27017 does not match server address.  Removing 192.168.99.100:9142 from client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Server 192.168.99.100:9242 is no longer a member of the replica set.  Removing from client view of cluster.
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Server 192.168.99.100:9042 is no longer a member of the replica set.  Removing from client view of cluster.
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Canonical address mongo1:27017 does not match server address.  Removing 192.168.99.100:9042 from client view of cluster
Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: No server chosen by com.mongodb.Mongo$4@67784306 from cluster description ClusterDescription{type=REPLICA_SET, connectionMode=MULTIPLE, serverDescriptions=[ServerDescription{address=192.168.99.100:9242, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo3:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo2:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo1:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=192.168.99.100:9042, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
Dez 27, 2017 9:36:09 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Exception in monitor thread while connecting to server mongo3:27017
com.mongodb.MongoSocketException: mongo3
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:188)
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59)
at com.mongodb.connection.SocketStream.open(SocketStream.java:57)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: mongo3
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
at java.net.InetAddress.getAllByName(InetAddress.java:1192)
at java.net.InetAddress.getAllByName(InetAddress.java:1126)
at java.net.InetAddress.getByName(InetAddress.java:1076)
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:186)
... 5 more
EN

回答 2

Stack Overflow用户

发布于 2018-06-15 20:38:25

将主机名添加到主机文件对我不起作用。我认为如果所有的主机名都指向相同的主机IP (例如127.0.0.1),那么如果所有的docker端口都是相同的(例如27017),这将不会起作用。副本集由docker内部的mongo1:27017, mongo2:27017 and mongo3:27017组成。在docker外部,它对应于无法工作的127.0.0.1:27017, 127.0.0.1:27017 and 127.0.0.1:27017。为了解决这个问题,我必须为每个节点设置不同的端口。

代码语言:javascript
运行
AI代码解释
复制
docker network create mongo-cluster
docker run --name mongo1 -d --net mongo-cluster -p 9042:9042 mongo:3.6 mongod --replSet docker-rs --port 9042
docker run --name mongo2 -d --net mongo-cluster -p 9142:9142 mongo:3.6 mongod --replSet docker-rs --port 9142
docker run --name mongo3 -d --net mongo-cluster -p 9242:9242 mongo:3.6 mongod --replSet docker-rs --port 9242
docker exec -it mongo1 mongo --port 9042
config = {"_id" : "docker-rs", "members" : [{"_id" : 0,"host" : "mongo1:9042"},{"_id" : 1,"host" : "mongo2:9142"},{"_id" : 2,"host" : "mongo3:9242"}]}
rs.initiate(config)
rs.status() 

最后,将主机名添加到hosts文件中

代码语言:javascript
运行
AI代码解释
复制
127.0.0.1 mongo1 mongo2 mongo3
票数 6
EN

Stack Overflow用户

发布于 2017-12-28 08:38:16

问题是,您的副本集节点在端口9x42的外部可见,但这些节点的内部(已配置)地址是27017。这两个参数都必须是same.So,当您启动mongod时,您必须提供容器外部使用的具有相同端口号的--port参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47998855

复制
相关文章
mongodb 4.0副本集搭建
近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点。那么到底如何部署呢?请看下文。
俊才
2020/08/13
1.3K0
Docker - 如何使用SSH连接到正在运行中的容器
本文主要介绍如何使用SSH将Docker容器连接到其他Docker容器。首先,介绍如何安装SSH并启动SSH服务。然后,介绍如何创建和配置Dockerfile和Docker Compose文件,以使用SSH连接到其他容器。最后,提供了一些示例和注意事项,以帮助读者更好地使用SSH连接Docker容器。
用户1150262
2018/01/08
5.6K0
docker搭建mongodb单节点副本集
在开发中,我们很容易通过docker启动一个普通的mongodb数据库服务。但是有时候为了保持与线上环境一致,或者为了利用mongodb副本集的某些特性,我们需要在本地部署mongodb副本集。副本集往往需要启动多个mongodb服务作为副本集成员,而通常用于开发的笔记本资源比较有限。鉴于此,官方文档给了解决办法,可以直接将一个单节点mongodb服务转换为单节点副本集https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/,本片文章的背景就是在golang中开发,操作mongo开启事务后报错:
美团骑手
2022/12/05
3.3K0
Docker下,实战mongodb副本集(Replication)
程序员欣宸
2018/01/04
3.3K1
Docker下,实战mongodb副本集(Replication)
在Docker中安装MongoDB
1.版本选取 访问mongodb的镜像仓库地址:https://hub.docker.com/_/mongo?tab=tags&page=1 这里选取最新版本进行安装,如果想安装其他的可用版本,可以使
Peyshine
2020/05/19
7.6K0
在Docker中安装MongoDB
Mongodb副本集
mongodb doc mongodb的端口 mongod:27017 http:28017 mongod命令的常用选项 fork: 是否运行为后台进程 bind_ip: 绑定的ip地址 maxConns: 最大的连接数 logpath: 设置日志的存储路径 syslog: 设置是否为syslog来管理日志 syslogFacility: 如果由syslog来管理日志,那么日志的级别是local1,local2…还是local7 logappend: 日志滚动,就是把日志已追加的方式记录,而不是覆盖 pid
公众号: 云原生生态圈
2021/11/15
8520
MongoDB副本集
  MongoDB的副本集至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据,建议提供仲裁节点,侧节点不存储数据,作用是当主节点出现故障时,选举出某个备用节点成为主节点,保证MongoDB的正常服务。客户端只需要访问主节点或者从节点,不需要访问仲裁节点。
Se7eN_HOU
2022/05/07
5200
MongoDB副本集
mongodb副本集
机器ipnode01(master)71node02(slave)72node03(slave)73 3台机器分别安装mongodb 编辑三台机器的配置文件 # vim /etc/mongod.conf replication: oplogSizeMB: 20 replSetName: alextest 在master上面操作 [root@node01 ~]# mongo MongoDB shell version: 3.0.7 connecting to: test Server has
零月
2018/04/25
1K0
mongodb副本集
微系列:7、在Centos系统中,搭建MongoDB副本集
创建mongodb的源文件 /etc/yum.repos.d/mongodb-org-5.0.repo,添加内容
老张的哲学
2023/01/09
6440
MongoDB:在 Java 中使用 MongoDB
除了通过启动 mongo 进程进如 Shell 环境访问数据库外,MongoDB 还提供了其他基于编程语言的访问数据库方法。MongoDB 官方提供了 Java 语言的驱动包,利用这些驱动包可使用多种编程方法来连接并操作 MongoDB 数据库。
栗筝i
2023/01/06
1.6K0
MongoDB副本集
如果你们现在服务器显示当前的服务器的状态是:SECONDARY。表示该服务器是从服务器,我们需要查看哪台服务器为主服务器,也就是"stateStr" : "PRIMARY"。我们需要在主服务器才进行进行操作,当然,也有强行在从服务器进行操作的办法。这里先不说。
魔王卷子
2019/06/01
1.6K0
Java实战操作MongoDB集群(副本集)
程序员欣宸
2018/01/04
2.1K0
Java实战操作MongoDB集群(副本集)
MongoDB副本集
MongoDB 副本集是 MongoDB 中的一种高可用性解决方案,它使用多个 MongoDB 实例来提供数据冗余和故障转移能力。在本文中,我们将详细介绍 MongoDB 副本集的概念、配置和使用,并提供一个简单的示例来说明其工作原理。
玖叁叁
2023/04/14
6600
MongoDB副本集配置
上篇文章我们搭建了MongoDB副本集的环境,验证了数据已经可以成功的复制,本文我们就来看看MongoDB副本集的其他操作。 ---- 环境准备 三台服务器,地址分别是: 192.168.248.128 192.168.248.135 192.168.248.136 按照上文介绍的步骤搭建副本集环境,这里不再赘述。 副本集成员添加删除 在副本集环境搭建好之后,我们可以利用如下命令删除一个副本集成员: rs.remove('192.168.248.128:27017') 上面的命令执行完成后,我们可以通过rs
江南一点雨
2018/04/02
1K0
MongoDB副本集搭建
我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机、崩溃或者硬盘坏了都会对公司业务造成损失,因此我们需要数据备份。在MongoDB中我们可以通过副本集来实现这一需求,MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成,如果Primary崩溃了,会自动从Secondary中选择一个将其升级为新的主服务器,本文我们先来看看副本集环境的搭建。 ---- 单台服务器模拟 我们在实际的生产环境中肯
江南一点雨
2018/04/02
1.3K0
【mongo】MongoDB副本集
.............................................................................................. 环境:centos7 Ip: 主节点:192.168.225.128 从节点192.168.225.129 从节点&仲裁节点:192.168.225.130 Mongo版本:3.4. ..............................................................................................
用户5522200
2019/06/02
1.1K0
在docker中运行mysql实例
Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。下图是容器跟虚拟机的对比
陈灬大灬海
2019/03/29
4.1K0
在docker中运行mysql实例
在docker中运行mysql实例
Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。下图是容器跟虚拟机的对比
陈灬大灬海
2019/03/15
3.9K0
在docker中运行Kali Linux
当使用各种工具或创建隔离的环境时,Docker是虚拟化的绝佳替代品。Docker是轻量级的(在Linux上本机运行,没有虚拟机管理程序层),并且是不需要GUI的用例的理想选择。Offensive Security已经创建了一个官方的Kali Linux Docker镜像,名为`kalilinux/kali-rolling`,我们将在本文中用其创建并运行Kali Linux容器。
点火三周
2021/04/30
12K0
在docker中运行Kali Linux
mongodb副本集搭建
可通过 ps -aux|grep mongo 或者 lsof -i:27017来查看是否启动成功
shirley
2019/06/28
3.7K0

相似问题

无法连接到Docker中的MongoDB副本集

111

经授权的MongoDB 2.4副本集

25

如何在docker compose中运行mongodb副本集

18

与MongoDB2.6.1副本集的连接失败

13

使用Docker 1.12服务的Mongodb副本集

116
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档