在不同的物理服务器上部署带有Docker的mongodb replicaset服务器
我正在尝试使用docker部署mongodb复制集。 我通过执行以下命令,在同一台服务器上实现了这一点:在不同的物理服务器上部署带有Docker的mongodb replicaset服务器,mongodb,docker,Mongodb,Docker,我正在尝试使用docker部署mongodb复制集。 我通过执行以下命令,在同一台服务器上实现了这一点: docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa docker run -d --expose 27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacom
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();'
它按预期工作。我的replicaset已初始化,我的mongodb resultset配置包含由其内部IP地址标识的3台服务器。
它并不完美,因为我更喜欢使用服务器名称,但我没有做到这一点。
Docker仅在每个/etc/hosts文件中填充在映像启动时通过--link参数传递的服务器名称。如果在其他服务器运行时添加新服务器。这些服务器不会ping新服务器
现在我还有一个问题。在生产中,在同一台物理服务器上运行大量Mongodb docker映像是可能的,但并不安全:
-如果我的物理服务器出现故障,我将丢失所有Mongodb副本,并且我的服务也将停机
-如果我的物理服务器使用内部存储,则我的所有docker映像都使用相同的磁盘。。。我会有IO问题
所以我的问题是:如何在多个物理服务器上部署多个mongodb副本?当这些mongodb复制副本位于不同的服务器甚至不同的数据中心上时,它们如何相互通信(主服务器和辅助服务器可以更改)?您可以使用“”轻松解决问题
Weave创建了一个覆盖网络,将不同主机上的容器连接起来,甚至在不同的云提供商上。Weave还提供DNS服务,允许您在Weave网络中按名称查找容器。假设:
10.1.1.101
,10.1.1.102
,10.1.1.103
rsacomeasure
Dockerfile
s用于mongodb公开端口2701710.1.1.101~$
用于命令提示符):
-p 27017:27017
公开主机IP上的端口27017,因此可以在服务器的主机IP地址上访问mongo
然后您需要启动副本集,所以只需对mongodb容器运行它(我将在这里选择server1):
IPs是本地的,但只要服务器可以相互通信(VPN、防火墙、DMZ等),它就可以与全局服务器协同工作。顺便说一下,你应该仔细考虑一下。 我使用docker machine和virtual box作为驱动程序在不同的物理服务器上创建了一个副本集:
$ docker-machine create --driver virtualbox server1
$ docker-machine create --driver virtualbox server2
$ docker-machine create --driver virtualbox server3
在每个端子上打开3个不同的端子
$(Terminal1) eval "$(docker-machine env server1)"
$(Terminal2) eval "$(docker-machine env server2)"
$(Terminal3) eval "$(docker-machine env server3)"
在每个终端:
$(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
进入VirtualBox->每个环境(服务器1、服务器2、服务器3)->设置->网络->适配器1->端口转发。创建新的规则协议TCP,主机端口-27017,来宾端口-27017,将主机Ip和来宾Ip保留为空
现在重新启动所有环境,您可以从VirtualBox或终端执行此操作,从终端只需运行:
$(Terminal1) docker-machine restart server1
$(Terminal2) docker-machine restart server2
$(Terminal3) docker-machine restart server3
重新启动容器:
$(Terminal1) docker start mongoClient1
$(Terminal2) docker start mongoClient2
$(Terminal3) docker start mongoClient3
现在容器应该正在运行,您可以通过运行
每个终端中的$docker ps
进入第一个容器(或另一个)的Mongo外壳
$(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
我编写了一个docker映像脚本,为任意数量的容器设置mongodb复制集,并在添加更多容器时自动缩放。查看github或 使用Docker Compose 设置docker-compose.yml
version: "2"
services:
<your_service_name>:
image: rollymaduk/mongo-replica:local
environment:
REPLICA_NAME: "<your_replica_name>"
volumes:
- /var/config:/var/config
扩展到更多容器
docker-compose scale <your_service_name>=3
docker合成比例=3
Docker云要使用docker cloud部署mongo db replicaSet,请设置堆栈 文件 stack.yml:不需要共享卷的堆栈文件
:
图片:rollymaduk/mongo副本:云
部署策略:高可用性
目标容器数量:3个
环境:
副本名称:
DockerLoud_认证:
stack.yml:需要共享卷的堆栈文件
:
图像:rollymaduk/mongo副本:本地
部署策略:高可用性
目标容器数量:3个
卷数:
-/var/config:/var/config
环境:
副本名称:
使用docker cloud cli在命令行中运行(如果云中不存在堆栈文件)
docker云堆栈创建--name-f
docker云堆栈启动
使用docker cloud cli在命令行中运行(如果云中已存在堆栈文件)
docker云堆栈更新-f
docker云堆栈重新部署
重要提示:必须指定共享卷并将其装载到容器的
配置目录[默认值:/var/config]下面的示例装载主机
目录/var/config到容器的配置卷。您可以使用docker推荐的任何方式在服务器之间共享卷 容器(即装载主机目录或数据卷容器),仅 为配置卷(/var/config)指定正确的路径 _要更改默认配置目录,请使用环境变量 --配置目录以设置容器。确保更新主机卷 反映新--CONFIG_DIR名称的路径_
你这样做到底有什么问题?使用OpenStack在几个物理节点上调度Docker容器怎么样?我将看看OpenStack来解决这个问题。您是否有一份文档,其中OpenStack帮助管理mongodb docker文件,以便在多台服务器上分发复制集?没有,我只是使用OpenStack来安装docker,目的不同于创建mongodb复制集。您需要一个虚拟LAN,作为docker容器的单个可发现网桥。看看coreos/法兰绒。这将以最少的努力解决您的网络问题。请不要只发布链接答案。只要把链接的关键部分放在你的回答中就行了。非常感谢@Milanth,这非常有用。我想问一下,您是否认为将两个docker容器与真实的mongo实例连接也是可行的。我真的需要同步一个450G
$(Terminal2) docker exec -it mongoClient2 mongo planes
// or
$(Mongo Shell Primary) db = connect ("<server2's Ip Address>:27017/planes")
$(Mongo Shell Secondary) rs.slaveOk()
// to allow readings from the Shell
$(Mongo Shell Secondary)db.tranporters.find()
// should return inserted plane
#Here stop already running instances
docker stop m1 m2 m3
#Cleanup of the volumes
docker rm -f m1 m2 m3
# Start MongoDB services optimised for faster startup
docker run -dP --name m1 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0
docker run -dP --name m2 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0
docker run -dP --name m3 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0
export M1_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m1`
export M2_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m2`
export M3_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m3`
docker exec m1 mongo --eval "rs.initiate();"
docker exec m1 mongo --eval "cfg = rs.conf(); cfg.members[0].host = '$M1_ADDRESS:27017'; rs.reconfig(cfg);"
docker exec m1 mongo --eval "rs.add('$M2_ADDRESS:27017');rs.add('$M3_ADDRESS:27017')"
# Check if everything is fine.
docker exec m1 mongo --eval "rs.status();"
version: "2"
services:
<your_service_name>:
image: rollymaduk/mongo-replica:local
environment:
REPLICA_NAME: "<your_replica_name>"
volumes:
- /var/config:/var/config
docker-compose up
docker-compose scale <your_service_name>=3
<service_name>:
image: rollymaduk/mongo-replica:cloud
deployment_strategy: high_availability
target_num_containers: 3
environment:
REPLICA_NAME: <your_replica_name>
DOCKERCLOUD_AUTH: <your_docker_auth_key>
<service_name>:
image: rollymaduk/mongo-replica:local
deployment_strategy: high_availability
target_num_containers: 3
volumes:
- /var/config:/var/config
environment:
REPLICA_NAME: <your_replica_name>
docker-cloud stack create --name <your_stack_name> -f <your_stack_file>
docker-cloud stack start <your_stack_name>
docker-cloud stack update -f <your_stack_file> <your_stack_name>
docker-cloud stack redeploy <your_stack_name>