首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同的物理服务器上使用Docker部署mongodb复制集服务器

在不同的物理服务器上使用Docker部署mongodb复制集服务器
EN

Stack Overflow用户
提问于 2014-11-28 11:21:39
回答 4查看 7.9K关注 0票数 13

我正在尝试使用docker部署mongodb副本集。我在同一台服务器上成功地执行了以下操作:

代码语言:javascript
复制
docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa
docker run -d --expose  27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure
docker run -d --expose 27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure

MONGODB1=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany1)
MONGODB2=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany2)
MONGODB3=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany3)

echo $MONGODB1
echo $MONGODB2
echo $MONGODB3

echo "Mongodb Replicaset init"
docker exec mongodbmycompany1 mongo 127.0.0.1:27017/mycompany --eval 'if(!rs.conf()) {     rs.initiate(); cfg = rs.conf(); cfg.members[0].host = "'$MONGODB1':27017"; rs.reconfig(cfg); rs.add("'$MONGODB2':27017"); rs.add("'$MONGODB3':27017"); } rs.status();'

一切都如愿了。我的复制集被初始化,mongodb结果集配置包含我的3台服务器,由它们的内部IP地址标识。这并不完美,因为我更喜欢使用服务器名称,但我没有做到这一点。Docker只使用-link参数在映像启动时传递的服务器名称填充每个/etc/host文件。如果我在其他服务器运行时添加一个新服务器。那些服务器不会对新服务器进行平分。

现在我有另外一个问题。在生产中,在同一台物理服务器上运行大量Mongodb对接映像是可能的,但这是不安全的:-如果我的物理服务器崩溃,我的Mongodb副本就会丢失,我的服务也会中断--如果我的物理服务器使用内部存储,那么我的所有坞映像都使用相同的磁盘.我会有IO问题的。

因此,我的问题是:如何在多个物理服务器上部署多个mongodb副本?当这些mongodb副本位于不同的服务器上,甚至在不同的数据中心上时,它们如何相互通信(主服务器和次要服务器可以更改) ?

EN

回答 4

Stack Overflow用户

发布于 2015-08-24 10:40:56

让我们假设:

  1. 您有3台不同的对接主机(服务器),带有IP 10.1.1.10110.1.1.10210.1.1.103
  2. 想要部署一个名为rsacommeassure的副本集
  3. 用于mongodb的Dockerfiles公开端口27017
  4. 所有服务器都位于可信区域,可以相互通信。

首先,让我们在每个服务器上启动mongodb容器(10.1.1.101 ~$用于命令提示符):

代码语言:javascript
复制
10.1.1.101 ~$ docker run -d -p 27017:27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsacommeassure
10.1.1.102 ~$ docker run -d -p 27017:27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure
10.1.1.103 ~$ docker run -d -p 27017:27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure

-p 27017:27017在主机IP上公开端口27017,因此可以在服务器的主机IP地址上访问mongo。

然后您需要启动副本集,所以只需在mongodb容器上运行它(我将在这里选择server1 ):

代码语言:javascript
复制
your_laptop ~$ > mongo --host 10.1.1.101 
MongoDB shell version: 2.6.9
connecting to: test
> rs.initiate()
> cfg = rs.conf()
> cfg.members[0].host = "10.1.1.101:27017"
> rs.reconfig(cfg)
> rs.add("10.1.1.102:27017")
> rs.add("10.1.1.103:27017") 
> rs.status();

IP是本地的,但只要服务器能够相互通信(VPN、防火墙、DMZ等),它就能与全局和服务器协同工作。顺便说一句,你应该仔细考虑安全性

票数 16
EN

Stack Overflow用户

发布于 2016-04-18 10:26:16

我在不同的物理服务器上创建了一个副本集,使用了停靠机和虚拟盒作为驱动程序:

代码语言:javascript
复制
$ docker-machine create --driver virtualbox server1
$ docker-machine create --driver virtualbox server2
$ docker-machine create --driver virtualbox server3

打开3个不同的终端,每个终端

代码语言:javascript
复制
$(Terminal1) eval "$(docker-machine env server1)"
$(Terminal2) eval "$(docker-machine env server2)"
$(Terminal3) eval "$(docker-machine env server3)"

在每个航站楼:

代码语言:javascript
复制
$(Terminal1) docker run -d -p 27017:27017 --name mongoClient1 mongo mongod --replSet r1
$(Terminal2) docker run -d -p 27017:27017 --name mongoClient2 mongo mongod --replSet r1
$(Terminal3) docker run -d -p 27017:27017 --name mongoClient3 mongo mongod --replSet r1

每个环境(server1、server2、server3)上的->设置->网络->适配器1 ->端口转发。创建一个新的规则协议TCP,主机端口- 27017,来宾端口- 27017,使主机Ip和来宾Ip空。

现在重新启动所有环境,您可以从VirtualBox或终端,从终端运行:

代码语言:javascript
复制
$(Terminal1) docker-machine restart server1
$(Terminal2) docker-machine restart server2
$(Terminal3) docker-machine restart server3

重新启动容器:

代码语言:javascript
复制
$(Terminal1) docker start mongoClient1
$(Terminal2) docker start mongoClient2
$(Terminal3) docker start mongoClient3

现在容器应该正在运行,您可以通过在每个终端运行$ docker来检查它们

进入第一个容器的(或另一个) Mongo

代码语言:javascript
复制
$(Terminal1) docker exec -it mongoClient1 mongo
// now we are in the Mongo Shell
$(Mongo Shell) rs.initiate()
$(Mongo Shell) cfg = rs.conf()
$(Mongo Shell) cfg.members[0].host = <server1's Ip Address>
// you should get server1's Ip Address by running $ docker-machine ls, mine was 192.168.99.100
$(Mongo Shell) rs.reconfig(cfg)
$(Mongo Shell Primary) rs.add("<server2's Ip Address>:27017")
// now we added a Secondary
$(Mongo Shell Primary) rs.add("<server3's Ip Address>:27017", true)
// now we added an Arbiter
$(Mongo Shell Primary) use planes
// now we create a new database
$(Mongo Shell Primary) db.tranporters.insert({name:'Boeing'})
// create a new collection
$(Mongo Shell Primary) db.tranporters.find()
// we obtain the inserted plane

要连接到中学,您可以:

代码语言:javascript
复制
$(Terminal2) docker exec -it mongoClient2 mongo planes
// or
$(Mongo Shell Primary) db = connect ("<server2's Ip Address>:27017/planes")

现在我们在蒙古壳牌的一所中学

代码语言:javascript
复制
$(Mongo Shell Secondary) rs.slaveOk()
// to allow readings from the Shell
$(Mongo Shell Secondary)db.tranporters.find()
// should return inserted plane
票数 2
EN

Stack Overflow用户

发布于 2015-02-08 12:42:56

您可以使用"编织-码头网络“轻松地解决问题。

Weave创建了一个覆盖网络,将容器连接到不同的主机上,甚至在不同的云提供商上也是如此。Weave还提供了DNS服务,使您可以在Weave网络中按名称查找容器。

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

https://stackoverflow.com/questions/27187591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档