mongodb - 如何将新节点添加到 docker swarm 中的 mongodb 副本集(docker compose 3.4)
问题描述
我正在尝试初始化 mongo 副本集模式并向其添加两个节点(群服务),我正在使用 docker-compose 3.4
我正在使用我在 ansible playbook(版本 2.7.10)上执行的脚本 shell
以下代码分别是 docker-compose、ansible playbook 和 shell 脚本:
version: '3.4'
services:
mongo:
image: mongodb:4.0.9-debian8-1
command: mongod --smallfiles --replSet rs_mongo --port 27017
ports:
- 27017:27017
volumes:
- /opt/application/fwcwas/mongo/:/data/db
deploy:
replicas: 1
placement:
constraints:
- node.labels.mongo == true
environment:
MONGO_INITDB_ROOT_USERNAME: username
MONGO_INITDB_ROOT_PASSWORD: pwd
MONGO_REPLICATION_MODE: RS
MONGO_REPLICATION_REPLSETNAME: rs_mongo
networks:
- web
mongo02:
image: mongodb:4.0.9-debian8-1
command: mongod --smallfiles --replSet rs_mongo --port 27018
ports:
- 27018:27017
volumes:
- /opt/application/fwcwas/mongo02/:/data/db
deploy:
replicas: 1
placement:
constraints:
- node.labels.mongo == true
environment:
MONGO_INITDB_ROOT_USERNAME: username
MONGO_INITDB_ROOT_PASSWORD: pwd
MONGO_REPLICATION_MODE: RS
MONGO_REPLICATION_REPLSETNAME: rs_mongo
networks:
- web
mongo03:
image: mongodb:4.0.9-debian8-1
command: mongod --smallfiles --replSet rs_mongo --port 27019
ports:
- 27019:27017
volumes:
- /opt/application/fwcwas/mongo03/:/data/db
deploy:
replicas: 1
placement:
constraints:
- node.labels.mongo == true
environment:
MONGO_INITDB_ROOT_USERNAME: username
MONGO_INITDB_ROOT_PASSWORD: pwd
MONGO_REPLICATION_MODE: RS
MONGO_REPLICATION_REPLSETNAME: rs_mongo
networks:
- web
networks:
web:
external:
name: mongo_network
Ansible 剧本:
##########################################################
# Create a mongo replicaset using a script shell
##########################################################
- name: Ensure replicaset rs_mongo exist
shell: chmod +x init_replica_set.sh
args:
chdir: /home/docker/mongo/
when:
- ansible_host in groups['manager_launcher']
初始化副本集模式并添加 mongo 副本(init_replica_set.sh)的脚本 shell:
#!/bin/bash
echo "Intializing replica set on master"
replicate='rs.initiate();sleep(1000);cfg=rs.conf();cfg.members[0].host="mongo:27017";rs.reconfig(cfg);rs.add({host:"mongo02:27018",priority:0.5});rs.add({host:"mongo03:27019",priority:0.5});rs.status();'
docker exec -it $(docker ps -qf "name = mongo_mongo.1") bash -c "echo '$replicate' | mongo --port 27017 -u username -p pwd"
该脚本应该使用作为主副本的 swarm 服务 mongo:27017 初始化 mongodb 的副本集模式,并向其中添加服务 mongo02:27018 和 mongo03:27019 但它只使用第一个服务 mongo:27017 和当我尝试手动添加节点时:
rs.add({host:"mongo02:27018",priority:0.5});
我收到了这个错误
{
"operationTime" : Timestamp(1571407148, 1),
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: mongo:27017; the following nodes did not respond affirmatively: mongo02:27018 failed with Error connecting to mongo02:27018 (10.0.2.24:27018) :: caused by :: Connection refused",
"code" : 74,
"codeName" : "NodeNotFound",
"$clusterTime" : {
"clusterTime" : Timestamp(1571407148, 1),
"signature" : {
"hash" : BinData(0,"IAMJw09rJWNAcRle0WWba1eE8os="),
"keyId" : NumberLong("6749137026550857730")
}
}
}
请有任何建议
解决方案
我更喜欢通过同时定义副本集的所有参数来初始化副本集。即,调用init并加在一起......
此外,确保每个节点都可以通过主机名访问其他节点。
例子:
rs.initiate(
{
_id: "shard1",
version: 1,
members: [
{ _id: 0, host: "ip-172-31-30-65.us-west-2.compute.internal:27017" },
{ _id: 1, host: "ip-172-31-17-88.us-west-2.compute.internal:27017" },
{ _id: 2, host: "ip-172-31-23-140.us-west-2.compute.internal:27017" }
]
}
)
此外,当查看您的 docker compose 时,看起来您使用端口 27018 启动 mongo2,这很好,但是您将 27018 映射到 27017。不应该将其映射到27018:27018
吗?
推荐阅读
- memory - MIPS程序地址空间4GB如何
- asp.net - 使用文件上传将 Excel 数据传输到 SQL Server 表中
- c# - Docker 构建 vsts 2017
- python - 从 csv 文件读取数据时查找列表的累积总和
- reactjs - 如何修复 gyp ERR!使用 npm 构建错误?
- reactjs - TypeError:this.state.posts.map 不是函数
- python - 按位读取
- java - 没有编译错误,但是当运行代码单击评论按钮时,它不会导致我想要的活动
- c# - 使用按钮单击为 DataGridView 添加多个附件
- java - Android Studio 和 Firebase:全屏显示 ImageView