我正在尝试使用docker部署mongodb replicaset.我设法通过执行以下操作在同一台服务器上执行此操作:
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结果集配置包含由其内部IP地址标识的3台服务器.它并不完美,因为我更喜欢使用服务器名称,但我没有设法做到这一点.Docker仅使用--link参数在映像启动时传递的服务器名称填充每个/ etc/hosts文件.如果我添加新服务器而其他服务器正在运行.那些服务器不会ping新服务器.
现在我有另一个问题.在生产中,有很多Mongodb docker镜像在同一物理服务器上运行是可能的,但它不安全: - 如果我的物理服务器出现故障,我丢失了所有的Mongodb副本,而我的服务已关闭 - 如果我的物理服务器使用内部存储,我所有的docker镜像都使用相同的磁盘...而且我会遇到IO问题.
所以我的问题是:如何在多个物理服务器上部署许多mongodb副本?这些mongodb副本如何在不同的服务器甚至不同的数据中心上相互通信(主服务器和辅助服务器可以更改)?
我们假设:
你有3台不同的泊坞窗主机(服务器),采用IPS 10.1.1.101
,10.1.1.102
,10.1.1.103
想要部署一个名为的副本集 rsacommeassure
Dockerfile
s for mongodb暴露端口27017
所有服务器都在受信任的区域,可以相互通信
首先让我们在每台服务器上启动mongodb容器(10.1.1.101 ~$
用于命令提示符):
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):
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等).顺便说一句,你应该仔细考虑安全性.