在 docker swarm 中启动 MongoDB 副本集
Posted
技术标签:
【中文标题】在 docker swarm 中启动 MongoDB 副本集【英文标题】:Initiate MongoDB replica set in docker swarm 【发布时间】:2018-03-26 09:32:02 【问题描述】:我在部署为 sudo docker stack 的 docker-compose.yml 文件中创建了两个 config 服务器,副本集名称为 rs0部署 --with-registry-auth --compose-file docker-compose.yml 测试.
version: "3.3"
services:
cfg1-r1:
image: mongo:3.2
deploy:
placement:
constraints: [node.hostname == ram-ThinkPad-E470]
restart_policy:
condition: on-failure
volumes:
- /opt/mongoshard/tmp:/var/lib/mongodb
- /opt/mongoshard/mongod.conf:/etc/mongod.conf
networks:
- mongoshard
command: ["mongod", "--configsvr", "--replSet", "rs0", "--dbpath", "/var/lib/mongodb", "--port", "27017"]
cfg2-r1:
image: mongo:3.2
deploy:
placement:
constraints: [node.hostname == prasanna-ThinkPad-E470]
restart_policy:
condition: on-failure
volumes:
- /opt/mongoshard/tmp:/var/lib/mongodb
- /opt/mongoshard/mongod.conf:/etc/mongod.conf
networks:
- mongoshard
command: ["mongod", "--configsvr", "--replSet", "rs0", "--dbpath", "/var/lib/mongodb", "--port", "27017"]
networks:
mongoshard:
mongod.conf 文件中的内容
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
port: 27017
当我尝试使用服务名作为启动时
sudo docker exec -it $(sudo docker ps -qf label=com.docker.swarm.service.name=test_cfg1-r1) mongo --eval 'rs.initiate( _id: "rs0",成员:[_id:1,主机:“cfg1-r1:27017”,_id:2,主机:“cfg2-r1:27017”],设置:getLastErrorDefaults:w:“多数”,wtimeout: 30000 )'
编辑 我在初始化时忘记提及 cfg2-r1。现在我添加了它。
报错
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
"ok" : 0,
"errmsg" : "No host described in new configuration 1 for replica set rs0 maps to this node",
"code" : 93,
"codeName" : "InvalidReplicaSetConfig"
编辑: 我认为问题在于 cfg1-r1 和 cfg2-r2 服务不在同一个网络中。当我部署堆栈文件时,会创建一个名为 mongo_mongoshard(overlay) 的网络,当我检查它时,它仅将 cfg1-r1 显示为容器列表中的容器。
【问题讨论】:
【参考方案1】:在 docker-compose.yml 文件中将driver: overlay
添加到mongoshard:
网络:
networks:
mongoshard:
driver: overlay
【讨论】:
【参考方案2】:您的网络必须处于覆盖模式,以允许在多个主机之间共享专用网络:
docker network create --driver overlay --attachable mongoshard
然后在你的 compose 中:
networks:
mongoshard:
external: true
为了复制作品,您需要添加至少两个成员:
rs.initiate( _id: "rs0", members: [ _id: 1, host: "cfg1-r1:27017" , _id: 2, host: "cfg1-r2:27017" ], settings: getLastErrorDefaults: w: "majority", wtimeout: 30000 );
【讨论】:
非常感谢 Mathieu Lescaudron。docker stack deploy ...
现在不自动创建覆盖网络并且默认情况下它们也是可附加的吗?以上是关于在 docker swarm 中启动 MongoDB 副本集的主要内容,如果未能解决你的问题,请参考以下文章
sh 重新启动Docker swarm的virtualbox
Docker集群实验环境布署--swarm5 容器启动组件--node